mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-28 21:12:16 +00:00
* Combine CA peers to smiliar command * crypto/disc/top into one sdk function * Exchanges into sdk function * delete wrong platforms trail * #3478 sdk crypto load * Options hist 1 sdk function * SDK functions Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com>
427 lines
12 KiB
Python
427 lines
12 KiB
Python
"""CoinPaprika model"""
|
|
__docformat__ = "numpy"
|
|
|
|
import logging
|
|
import textwrap
|
|
from datetime import datetime
|
|
|
|
import pandas as pd
|
|
from dateutil import parser
|
|
|
|
from openbb_terminal.cryptocurrency.coinpaprika_helpers import PaprikaSession
|
|
from openbb_terminal.decorators import log_start_end
|
|
from openbb_terminal.rich_config import console
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
MARKETS_FILTERS = [
|
|
"rank",
|
|
"name",
|
|
"symbol",
|
|
"price",
|
|
"volume_24h",
|
|
"mcap_change_24h",
|
|
"pct_change_1h",
|
|
"pct_change_24h",
|
|
"ath_price",
|
|
"pct_from_ath",
|
|
]
|
|
|
|
EXMARKETS_FILTERS = [
|
|
"pair",
|
|
"base_currency_name",
|
|
"quote_currency_name",
|
|
"category",
|
|
"reported_volume_24h_share",
|
|
"trust_score",
|
|
"market_url",
|
|
]
|
|
|
|
INFO_FILTERS = [
|
|
"rank",
|
|
"name",
|
|
"symbol",
|
|
"price",
|
|
"volume_24h",
|
|
"circulating_supply",
|
|
"total_supply",
|
|
"max_supply",
|
|
"ath_price",
|
|
"market_cap",
|
|
"beta_value",
|
|
]
|
|
|
|
EXCHANGES_FILTERS = [
|
|
"rank",
|
|
"name",
|
|
"currencies",
|
|
"markets",
|
|
"fiats",
|
|
"confidence",
|
|
"volume_24h",
|
|
"volume_7d",
|
|
"volume_30d",
|
|
"sessions_per_month",
|
|
]
|
|
|
|
|
|
CONTRACTS_FILTERS = ["id", "type", "active"]
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_global_info() -> pd.DataFrame:
|
|
"""Return data frame with most important global crypto statistics like:
|
|
market_cap_usd, volume_24h_usd, bitcoin_dominance_percentage, cryptocurrencies_number,
|
|
market_cap_ath_value, market_cap_ath_date, volume_24h_ath_value, volume_24h_ath_date,
|
|
market_cap_change_24h, volume_24h_change_24h, last_updated. [Source: CoinPaprika]
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
Most important global crypto statistics
|
|
Metric, Value
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
global_markets = session.make_request(session.ENDPOINTS["global"])
|
|
global_markets["last_updated"] = datetime.fromtimestamp(
|
|
global_markets["last_updated"]
|
|
)
|
|
|
|
for key, date in global_markets.items():
|
|
if "date" in key:
|
|
try:
|
|
if isinstance(date, datetime):
|
|
new_date = date
|
|
else:
|
|
new_date = parser.parse(date)
|
|
global_markets[key] = new_date.strftime("%Y-%m-%d %H:%M:%S")
|
|
except (KeyError, ValueError, TypeError) as e:
|
|
logger.exception(str(e))
|
|
console.print(e)
|
|
df = pd.Series(global_markets).to_frame().reset_index()
|
|
df.columns = ["Metric", "Value"]
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def _get_coins_info_helper(symbols: str = "USD") -> pd.DataFrame:
|
|
"""Helper method that call /tickers endpoint which returns for all coins quoted in provided currency/crypto
|
|
|
|
{
|
|
"id": "btc-bitcoin",
|
|
"name": "Bitcoin",
|
|
"symbol": "BTC",
|
|
"rank": 1,
|
|
"circulating_supply": 17007062,
|
|
"total_supply": 17007062,
|
|
"max_supply": 21000000,
|
|
"beta_value": 0.735327,
|
|
"first_data_at": "2010-11-14T07:20:41Z",
|
|
"last_updated": "2018-11-14T07:20:41Z",
|
|
"quotes" : {
|
|
"USD": {
|
|
"price": 5162.15941296,
|
|
"volume_24h": 7304207651.1585,
|
|
"volume_24h_change_24h": -2.5,
|
|
"market_cap": 91094433242,
|
|
"market_cap_change_24h": 1.6,
|
|
"percent_change_15m": 0,
|
|
"percent_change_30m": 0,
|
|
"percent_change_1h": 0,
|
|
"percent_change_6h": 0,
|
|
"percent_change_12h": -0.09,
|
|
"percent_change_24h": 1.59,
|
|
"percent_change_7d": 0.28,
|
|
"percent_change_30d": 27.39,
|
|
"percent_change_1y": -37.99,
|
|
"ath_price": 20089,
|
|
"ath_date": "2017-12-17T12:19:00Z",
|
|
"percent_from_price_ath": -74.3
|
|
}
|
|
}
|
|
}
|
|
|
|
[Source: CoinPaprika]
|
|
|
|
Parameters
|
|
----------
|
|
symbols: Comma separated quotes to return e.g quotes=USD,BTC
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
id, name, symbol, rank, circulating_supply, total_supply, max_supply, beta_value, first_data_at,
|
|
last_updated, price, volume_24h, volume_24h_change_24h, market_cap, market_cap_change_24h,
|
|
percent_change_15m, percent_change_30m, percent_change_1h, percent_change_6h, percent_change_12h,
|
|
percent_change_24h, percent_change_7d, percent_change_30d, percent_change_1y,
|
|
ath_price, ath_date, percent_from_price_ath
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
tickers = session.make_request(session.ENDPOINTS["tickers"], quotes=symbols)
|
|
data = pd.json_normalize(tickers)
|
|
try:
|
|
data.columns = [
|
|
col.replace(f"quotes.{symbols}.", "") for col in data.columns.tolist()
|
|
]
|
|
data.columns = [col.replace("percent", "pct") for col in list(data.columns)]
|
|
except KeyError as e:
|
|
logger.exception(str(e))
|
|
console.print(e)
|
|
data.rename(
|
|
columns={
|
|
"market_cap_change_24h": "mcap_change_24h",
|
|
"pct_from_price_ath": "pct_from_ath",
|
|
},
|
|
inplace=True,
|
|
)
|
|
return data
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_coins_info(
|
|
symbols: str = "USD", sortby: str = "rank", ascend: bool = True
|
|
) -> pd.DataFrame: # > format big numbers fix
|
|
"""Returns basic coin information for all coins from CoinPaprika API [Source: CoinPaprika]
|
|
|
|
Parameters
|
|
----------
|
|
symbols: str
|
|
Comma separated quotes to return e.g quotes=USD,BTC
|
|
sortby: str
|
|
Key by which to sort data
|
|
ascend: bool
|
|
Flag to sort data descending
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
rank, name, symbol, price, volume_24h, circulating_supply, total_supply,
|
|
max_supply, market_cap, beta_value, ath_price,
|
|
"""
|
|
|
|
cols = [
|
|
"rank",
|
|
"name",
|
|
"symbol",
|
|
"price",
|
|
"volume_24h",
|
|
"circulating_supply",
|
|
"total_supply",
|
|
"max_supply",
|
|
"market_cap",
|
|
"beta_value",
|
|
"ath_price",
|
|
]
|
|
df = _get_coins_info_helper(symbols)[cols]
|
|
df = df.sort_values(by=sortby, ascending=ascend)
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_coins_market_info(
|
|
symbols: str = "USD", sortby: str = "rank", ascend: bool = True
|
|
) -> pd.DataFrame:
|
|
"""Returns basic coin information for all coins from CoinPaprika API [Source: CoinPaprika]
|
|
|
|
Parameters
|
|
----------
|
|
symbols: str
|
|
Comma separated quotes to return e.g quotes=USD,BTC
|
|
sortby: str
|
|
Key by which to sort data
|
|
ascend: bool
|
|
Flag to sort data ascend
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
rank, name, symbol, price, volume_24h, mcap_change_24h,
|
|
pct_change_1h, pct_change_24h, ath_price, pct_from_ath,
|
|
"""
|
|
|
|
cols = [
|
|
"rank",
|
|
"name",
|
|
"symbol",
|
|
"price",
|
|
"volume_24h",
|
|
"mcap_change_24h",
|
|
"pct_change_1h",
|
|
"pct_change_24h",
|
|
"ath_price",
|
|
"pct_from_ath",
|
|
]
|
|
df = _get_coins_info_helper(symbols=symbols)[cols].sort_values(by="rank")
|
|
if sortby == "rank":
|
|
df = df.sort_values(by=sortby, ascending=not ascend)
|
|
else:
|
|
df = df.sort_values(by=sortby, ascending=ascend)
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_list_of_exchanges(
|
|
symbols: str = "USD", sortby: str = "rank", ascend: bool = True
|
|
) -> pd.DataFrame:
|
|
"""
|
|
List exchanges from CoinPaprika API [Source: CoinPaprika]
|
|
|
|
Parameters
|
|
----------
|
|
symbols: str
|
|
Comma separated quotes to return e.g quotes=USD,BTC
|
|
sortby: str
|
|
Key by which to sort data
|
|
ascend: bool
|
|
Flag to sort data ascend
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
rank, name, currencies, markets, fiats, confidence_score, reported_volume_24h,
|
|
reported_volume_7d ,reported_volume_30d, sessions_per_month,
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
exchanges = session.make_request(session.ENDPOINTS["exchanges"], quotes=symbols)
|
|
df = pd.json_normalize(exchanges)
|
|
try:
|
|
df.columns = [
|
|
col.replace(f"quotes.{symbols}.", "") for col in df.columns.tolist()
|
|
]
|
|
except KeyError as e:
|
|
logger.exception(str(e))
|
|
console.print(e)
|
|
df = df[df["active"]]
|
|
cols = [
|
|
"adjusted_rank",
|
|
"id",
|
|
"name",
|
|
"currencies",
|
|
"markets",
|
|
"fiats",
|
|
"confidence_score",
|
|
"reported_volume_24h",
|
|
"reported_volume_7d",
|
|
"reported_volume_30d",
|
|
"sessions_per_month",
|
|
]
|
|
df["fiats"] = df["fiats"].apply(lambda x: len([i["symbol"] for i in x if x]))
|
|
df = df[cols]
|
|
df = df.applymap(
|
|
lambda x: "\n".join(textwrap.wrap(x, width=28)) if isinstance(x, str) else x
|
|
)
|
|
df = df.rename(
|
|
columns={"adjusted_rank": "Rank", "confidence_score": "confidence"},
|
|
)
|
|
df.columns = [x.replace("reported_", "") for x in df.columns]
|
|
if sortby.lower() == "rank":
|
|
df = df.sort_values(by="Rank", ascending=not ascend)
|
|
else:
|
|
df = df.sort_values(by=sortby, ascending=ascend)
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_exchanges_market(
|
|
exchange_id: str = "binance",
|
|
symbols: str = "USD",
|
|
sortby: str = "pair",
|
|
ascend: bool = True,
|
|
) -> pd.DataFrame:
|
|
"""List markets by exchange ID [Source: CoinPaprika]
|
|
|
|
Parameters
|
|
----------
|
|
exchange_id: str
|
|
identifier of exchange e.g for Binance Exchange -> binance
|
|
symbols: str
|
|
Comma separated quotes to return e.g quotes=USD,BTC
|
|
sortby: str
|
|
Key by which to sort data
|
|
ascend: bool
|
|
Flag to sort data ascending
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
pair, base_currency_name, quote_currency_name, market_url,
|
|
category, reported_volume_24h_share, trust_score,
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
data = session.make_request(
|
|
session.ENDPOINTS["exchange_markets"].format(exchange_id), quotes=symbols
|
|
)
|
|
if "error" in data:
|
|
console.print(data)
|
|
return pd.DataFrame()
|
|
cols = [
|
|
"exchange_id",
|
|
"pair",
|
|
"base_currency_name",
|
|
"quote_currency_name",
|
|
"category",
|
|
"reported_volume_24h_share",
|
|
"trust_score",
|
|
"market_url",
|
|
]
|
|
df = pd.DataFrame(data)
|
|
df["exchange_id"] = exchange_id
|
|
df = df[cols]
|
|
df = df.sort_values(by=sortby, ascending=ascend)
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_all_contract_platforms() -> pd.DataFrame:
|
|
"""List all smart contract platforms like ethereum, solana, cosmos, polkadot, kusama ... [Source: CoinPaprika]
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
index, platform_id
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
contract_platforms = session.make_request(session.ENDPOINTS["contract_platforms"])
|
|
df = pd.DataFrame(contract_platforms).reset_index()
|
|
df.columns = ["index", "platform_id"]
|
|
|
|
# pylint: disable=unsupported-assignment-operation
|
|
df["index"] = df["index"] + 1
|
|
|
|
return df
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def get_contract_platform(
|
|
platform_id: str = "eth-ethereum", sortby: str = "active", ascend: bool = True
|
|
) -> pd.DataFrame:
|
|
"""Gets all contract addresses for given platform [Source: CoinPaprika]
|
|
Parameters
|
|
----------
|
|
platform_id: str
|
|
Blockchain platform like eth-ethereum
|
|
sortby: str
|
|
Key by which to sort data
|
|
ascend: bool
|
|
Flag to sort data ascend
|
|
|
|
Returns
|
|
-------
|
|
pd.DataFrame
|
|
id, type, active
|
|
"""
|
|
|
|
session = PaprikaSession()
|
|
contract_platforms = session.make_request(
|
|
session.ENDPOINTS["contract_platform_addresses"].format(platform_id)
|
|
)
|
|
|
|
df = pd.DataFrame(contract_platforms)[["id", "type", "active"]]
|
|
df = df.sort_values(by=sortby, ascending=ascend)
|
|
return df
|