Out of the box crypto report (#3794)

* working crypto report

* fixing news

* fixing the condtion's logic

* changed the load source

* added example

* trying to get rid of binance
This commit is contained in:
Henrique Joaquim
2022-12-16 18:55:06 +00:00
committed by GitHub
parent 6112658d46
commit af7334a6ef
3 changed files with 149 additions and 163 deletions

View File

@@ -519,6 +519,11 @@ def load(
-------
pd.DataFrame
Dataframe consisting of price and volume data
Examples
--------
>>> from openbb_terminal.sdk import openbb
>>> openbb.crypto.load(symbol="btc",to_symbol="usd",start_date="2019-01-01",source="YahooFinance")
"""
if isinstance(interval, int):
interval = str(interval)

View File

@@ -102,6 +102,11 @@ def get_marketcap_dominance(
-------
pd.DataFrame
market dominance percentage over time
Examples
--------
>>> from openbb_terminal.sdk import openbb
>>> mcapdom_df = openbb.crypto.dd.mcapdom(symbol="BTC")
"""
if start_date is None:
@@ -110,13 +115,14 @@ def get_marketcap_dominance(
if end_date is None:
end_date = datetime.now().strftime("%Y-%m-%d")
df, _ = get_messari_timeseries(
messari_timeseries = get_messari_timeseries(
symbol=symbol,
end_date=end_date,
start_date=start_date,
interval=interval,
timeseries_id="mcap.dom",
)
df, _ = messari_timeseries if messari_timeseries else (pd.DataFrame(), "")
return df
@@ -653,6 +659,11 @@ def get_fundraising(
Sales rounds,
Treasury Accounts,
Metric Value launch details
Examples
--------
>>> from openbb_terminal.sdk import openbb
>>> fundraise = openbb.crypto.dd.fr(symbol="BTC")
"""
url = base_url2 + f"assets/{symbol}/profile"

View File

@@ -130,10 +130,14 @@
"outputs": [],
"source": [
"news = openbb.crypto.dd.news(symbol=ticker).head(10)\n",
"news = news.set_index(\"published_at\")\n",
"news.sort_index()\n",
"news[\"link\"] = news[\"link\"].apply(lambda x: f'<a href=\"{x}\">{x}</a>')\n",
"news"
"\n",
"if (isinstance(news,pd.DataFrame) and not news.empty) or (not isinstance(news,pd.DataFrame) and news):\n",
" news = news.set_index(\"published_at\")\n",
" news.sort_index()\n",
" news[\"link\"] = news[\"link\"].apply(lambda x: f'<a href=\"{x}\">{x}</a>')\n",
" news\n",
"else:\n",
" news = pd.DataFrame()"
]
},
{
@@ -145,29 +149,11 @@
"source": [
"links = openbb.crypto.dd.links(ticker)\n",
"\n",
"if not links.empty:\n",
" links = links.set_index(\"Name\")\n",
"\n",
"if (isinstance(links,pd.DataFrame) and not links.empty) or (not isinstance(links,pd.DataFrame) and links):\n",
" links[\"Link\"] = links[\"Link\"].apply(lambda x: f'<a href=\"{x}\">{x}</a>')\n",
"\n",
" links"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9b73e41f",
"metadata": {},
"outputs": [],
"source": [
"# alt index\n",
"\n",
"# fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
"# openbb.crypto.ov.altindex_chart(external_axes=[ax])\n",
"# fig.tight_layout()\n",
"# f = io.BytesIO()\n",
"# fig.savefig(f, format=\"svg\")\n",
"# altindex = f.getvalue().decode(\"utf-8\")"
" links\n",
"else:\n",
" links = pd.DataFrame()"
]
},
{
@@ -204,9 +190,14 @@
" for date in dict_of_dates:\n",
" data = openbb.crypto.load(\n",
" symbol=ticker,\n",
" to_symbol=\"usd\",\n",
" start_date=dict_of_dates[date],\n",
" source=\"YahooFinance\"\n",
" )\n",
"\n",
" if data.empty:\n",
" continue\n",
"\n",
" # we'll be using the adjusted close price as same as close price\n",
" data[\"Adj Close\"] = data[\"Close\"]\n",
"\n",
@@ -269,7 +260,7 @@
" crypto_df=historical_data_one_year,\n",
" symbol=ticker,\n",
" current_currency=\"USDT\",\n",
" source=\"cctx\",\n",
" source=\"YahooFinance\",\n",
" exchange=\"binance\",\n",
" interval=\"1440\",\n",
")\n",
@@ -296,29 +287,6 @@
"headlines = f.getvalue().decode(\"utf-8\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b23868d",
"metadata": {},
"outputs": [],
"source": [
"# fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
"# openbb.crypto.chart(\n",
"# historical_data_one_year,\n",
"# symbol=ticker,\n",
"# currency=\"USDT\",\n",
"# source=\"cctx\",\n",
"# exchange=\"binance\",\n",
"# interval=\"1440\",\n",
"# external_axes=[ax1, ax2],\n",
"# )\n",
"# fig.tight_layout()\n",
"# f = io.BytesIO()\n",
"# fig.savefig(f, format=\"svg\")\n",
"# one_year_candle = f.getvalue().decode(\"utf-8\")"
]
},
{
"cell_type": "code",
"execution_count": null,
@@ -331,7 +299,7 @@
" historical_data_one_year,\n",
" to_symbol=ticker,\n",
" from_symbol=\"USDT\",\n",
" source=\"cctx\",\n",
" source=\"YahooFinance\",\n",
" exchange=\"binance\",\n",
" interval=\"1440\",\n",
" external_axes=[ax1, ax2],\n",
@@ -358,14 +326,17 @@
"outputs": [],
"source": [
"# market cap dominance\n",
"mcapdom_df = openbb.crypto.dd.mcapdom(symbol=ticker)\n",
"\n",
"fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
"openbb.crypto.dd.mcapdom_chart(symbol=ticker, external_axes=[ax])\n",
"fig.tight_layout()\n",
"f = io.BytesIO()\n",
"fig.savefig(f, format=\"svg\")\n",
"mcapdom = f.getvalue().decode(\"utf-8\")\n",
"mcapdom_df = openbb.crypto.dd.mcapdom(symbol=ticker)"
"if (isinstance(mcapdom_df,pd.DataFrame) and not mcapdom_df.empty) or (not isinstance(mcapdom_df,pd.DataFrame) and mcapdom_df):\n",
" fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
" openbb.crypto.dd.mcapdom_chart(symbol=ticker, external_axes=[ax])\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
" mcapdom = f.getvalue().decode(\"utf-8\")\n",
"else:\n",
" mcapdom_df = pd.DataFrame()"
]
},
{
@@ -376,28 +347,22 @@
"outputs": [],
"source": [
"# roadmap\n",
"roadmap_model = openbb.crypto.dd.rm(symbol=ticker)\n",
"\n",
"fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
"openbb.crypto.dd.rm_chart(symbol=ticker, external_axes=[ax])\n",
"fig.tight_layout()\n",
"f = io.BytesIO()\n",
"fig.savefig(f, format=\"svg\")\n",
"roadmap_view = f.getvalue().decode(\"utf-8\")\n",
"if (isinstance(roadmap_model,pd.DataFrame) and not roadmap_model.empty) or (not isinstance(roadmap_model,pd.DataFrame) and roadmap_model):\n",
"\n",
"roadmap_model = openbb.crypto.dd.rm(symbol=ticker)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f496d047",
"metadata": {},
"outputs": [],
"source": [
"if not roadmap_model.empty:\n",
" roadmap_model = roadmap_model.set_index(\"Date\")\n",
" roadmap_model.sort_index()\n",
" roadmap_model"
"\n",
" fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
" openbb.crypto.dd.rm_chart(symbol=ticker, external_axes=[ax])\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
" roadmap_view = f.getvalue().decode(\"utf-8\")\n",
"\n",
"else:\n",
" roadmap_model = pd.DataFrame()"
]
},
{
@@ -406,28 +371,24 @@
"id": "9ddbc654",
"metadata": {},
"outputs": [],
"source": [
"fig, ax1 = plt.subplots(figsize=(11, 5), dpi=150)\n",
"ax2 = ax1.twinx()\n",
"openbb.crypto.dd.tk_chart(symbol=ticker, external_axes=[ax1, ax2])\n",
"fig.tight_layout()\n",
"f = io.BytesIO()\n",
"fig.savefig(f, format=\"svg\")\n",
"tokenomics_view = f.getvalue().decode(\"utf-8\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aecd816f",
"metadata": {},
"outputs": [],
"source": [
"tokenomics_model = openbb.crypto.dd.rm(symbol=ticker)\n",
"if not tokenomics_model.empty:\n",
"\n",
"if (isinstance(tokenomics_model,pd.DataFrame) and not tokenomics_model.empty) or (not isinstance(tokenomics_model,pd.DataFrame) and tokenomics_model):\n",
"\n",
" tokenomics_model = tokenomics_model.set_index(\"Date\")\n",
" tokenomics_model.sort_index()\n",
" tokenomics_model"
"\n",
" fig, ax1 = plt.subplots(figsize=(11, 5), dpi=150)\n",
" ax2 = ax1.twinx()\n",
" openbb.crypto.dd.tk_chart(symbol=ticker, external_axes=[ax1, ax2])\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
" tokenomics_view = f.getvalue().decode(\"utf-8\")\n",
" \n",
"else:\n",
" tokenomics_model = pd.DataFrame()"
]
},
{
@@ -438,10 +399,11 @@
"outputs": [],
"source": [
"# fundraise\n",
"fundraise = openbb.crypto.dd.fr(symbol=ticker) # this returns a tuple\n",
"\n",
"fundraise = openbb.crypto.dd.fr(symbol=ticker)\n",
"fundraise_info = fundraise[0]\n",
"fundraise_df = fundraise[1]"
"if fundraise:\n",
" fundraise_info = fundraise[0]\n",
" fundraise_df = fundraise[1]"
]
},
{
@@ -452,9 +414,11 @@
"outputs": [],
"source": [
"trading_pair_info = openbb.crypto.dd.trading_pair_info(f\"{ticker}-USDT\")\n",
"if not trading_pair_info.empty:\n",
"if (isinstance(trading_pair_info,pd.DataFrame) and not trading_pair_info.empty) or (not isinstance(trading_pair_info,pd.DataFrame) and trading_pair_info):\n",
" trading_pair_info = trading_pair_info.set_index(\"Metric\")\n",
" trading_pair_info"
" trading_pair_info\n",
"else:\n",
" trading_pair_info = pd.DataFrame()"
]
},
{
@@ -474,8 +438,7 @@
" ath = coin.get_all_time_high(currency=cg_id)\n",
"\n",
"except Exception as e:\n",
" # ath = str(\"Reached coingecko API limit\")\n",
" pass"
" print(\"Reached coingecko API limit\")"
]
},
{
@@ -495,8 +458,7 @@
" atl = coin.get_all_time_low(currency=cg_id)\n",
"\n",
"except Exception as e:\n",
" # atl = str(\"Reached coingecko API limit\")\n",
" pass"
" print(\"Reached coingecko API limit\")"
]
},
{
@@ -510,14 +472,15 @@
"\n",
"market = openbb.crypto.dd.mkt(ticker)\n",
"\n",
"if not market.empty:\n",
"if (isinstance(market,pd.DataFrame) and not market.empty) or (not isinstance(market,pd.DataFrame) and market):\n",
" market = market.set_index(\"exchange\")\n",
"\n",
" market[\"market_url\"] = market[\"market_url\"].apply(\n",
" lambda x: f'<a href=\"{x}\">{x}</a>'\n",
" )\n",
"\n",
" market"
" market\n",
"else:\n",
" market = pd.DataFrame()"
]
},
{
@@ -528,11 +491,13 @@
"outputs": [],
"source": [
"# all exchanges where loaded coin is listed\n",
"\n",
"ex = openbb.crypto.dd.ex(ticker)\n",
"if not ex.empty:\n",
"\n",
"if (isinstance(ex,pd.DataFrame) and not ex.empty) or (not isinstance(ex,pd.DataFrame) and ex):\n",
" ex = ex.set_index(\"id\")\n",
" ex"
" ex\n",
"else:\n",
" ex = pd.DataFrame()"
]
},
{
@@ -543,10 +508,12 @@
"outputs": [],
"source": [
"# last trades\n",
"trades = openbb.crypto.dd.trades(symbol=ticker, exchange_id=\"binance\", to_symbol=\"USDT\")\n",
"if not trades.empty:\n",
"trades = openbb.crypto.dd.trades(symbol=ticker, exchange_id=\"gemini\", to_symbol=\"USD\")\n",
"if (isinstance(trades,pd.DataFrame) and not trades.empty) or (not isinstance(trades,pd.DataFrame) and trades):\n",
" trades = trades.set_index(\"Date\")\n",
" trades"
" trades\n",
"else:\n",
" trades = pd.DataFrame()"
]
},
{
@@ -557,28 +524,19 @@
"outputs": [],
"source": [
"# order book\n",
"\n",
"fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
"openbb.crypto.dd.ob_chart(\n",
" symbol=ticker, exchange=\"binance\", to_symbol=\"USDT\", external_axes=[ax]\n",
")\n",
"fig.tight_layout()\n",
"f = io.BytesIO()\n",
"fig.savefig(f, format=\"svg\")\n",
"order_book = f.getvalue().decode(\"utf-8\")\n",
"order_book_raw = openbb.crypto.dd.ob(\n",
" symbol=ticker, exchange=\"binance\", to_symbol=\"USDT\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "95cdc32e",
"metadata": {},
"outputs": [],
"source": [
"order_book_raw"
" symbol=ticker, exchange=\"gemini\", to_symbol=\"USD\"\n",
") # this returns a dict\n",
"\n",
"if order_book_raw:\n",
" fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
" openbb.crypto.dd.ob_chart(\n",
" symbol=ticker, exchange=\"gemini\", to_symbol=\"USD\", external_axes=[ax]\n",
" )\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
" order_book = f.getvalue().decode(\"utf-8\")"
]
},
{
@@ -591,9 +549,11 @@
"# price and supply related metrics for loaded coin\n",
"\n",
"ps = openbb.crypto.dd.ps(ticker)\n",
"if not ps.empty:\n",
"if (isinstance(ps,pd.DataFrame) and not ps.empty) or (not isinstance(ps,pd.DataFrame) and ps):\n",
" ps = ps.set_index(\"Metric\")\n",
" ps"
" ps\n",
"else:\n",
" ps = pd.DataFrame()"
]
},
{
@@ -607,12 +567,11 @@
"\n",
"events = openbb.crypto.dd.events(ticker)\n",
"\n",
"if not events.empty:\n",
"if (isinstance(events,pd.DataFrame) and not events.empty) or (not isinstance(events,pd.DataFrame) and events):\n",
" events = events.set_index(\"date\")\n",
"\n",
" events[\"link\"] = events[\"link\"].apply(lambda x: f'<a href=\"{x}\">{x}</a>')\n",
"\n",
"events"
"else:\n",
" events = pd.DataFrame()"
]
},
{
@@ -658,13 +617,15 @@
"\n",
"gh_data = openbb.crypto.dd.gh(symbol=ticker)\n",
"\n",
"if not gh_data.empty:\n",
"if (isinstance(gh_data,pd.DataFrame) and not gh_data.empty) or (not isinstance(gh_data,pd.DataFrame) and gh_data):\n",
" fig, ax = plt.subplots(figsize=(11, 5), dpi=150)\n",
" openbb.crypto.dd.gh_chart(symbol=ticker, external_axes=[ax])\n",
" fig.tight_layout()\n",
" f = io.BytesIO()\n",
" fig.savefig(f, format=\"svg\")\n",
" gh = f.getvalue().decode(\"utf-8\")"
" gh = f.getvalue().decode(\"utf-8\")\n",
"else:\n",
" gh_data = pd.DataFrame()"
]
},
{
@@ -957,7 +918,7 @@
"# rolling mean and std deviation of prices\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
"openbb.qa.rolling(\n",
"openbb.qa.rolling_chart(\n",
" symbol=ticker,\n",
" data=ticker_data,\n",
" target=\"Close\",\n",
@@ -979,7 +940,7 @@
"# rolling kurtosis of distribution of prices\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(11, 5), dpi=150)\n",
"openbb.qa.kurtosis(\n",
"openbb.qa.kurtosis_chart(\n",
" symbol=ticker,\n",
" data=ticker_data,\n",
" target=\"Close\",\n",
@@ -1044,9 +1005,8 @@
"if not links.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Links\") + links.to_html(escape=False)])\n",
"\n",
"htmlcode += widgets.row([widgets.h(3, \"Published news\") + news.to_html(escape=False)])\n",
"# htmlcode += widgets.row([widgets.h(3, \"Altindex\")])\n",
"# htmlcode += widgets.row([altindex])\n",
"if not news.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Published news\") + news.to_html(escape=False)])\n",
"\n",
"htmlcode += widgets.row([widgets.h(3, \"Historical data\")])\n",
"for data in historical_data:\n",
@@ -1063,9 +1023,10 @@
"\n",
"# # Due diligence tab\n",
"htmlcode = \"\"\n",
"htmlcode += widgets.row(\n",
" [widgets.h(3, f\"Trading pair info {ticker}/USDT\") + trading_pair_info.to_html()]\n",
")\n",
"if not trading_pair_info.empty:\n",
" htmlcode += widgets.row(\n",
" [widgets.h(3, f\"Trading pair info {ticker}/USDT\") + trading_pair_info.to_html()]\n",
" )\n",
"if not mcapdom_df.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Market cap dominance\")])\n",
" htmlcode += widgets.row([mcapdom])\n",
@@ -1078,7 +1039,7 @@
" htmlcode += widgets.row([widgets.h(3, \"Tokenomics\") + tokenomics_model.to_html()])\n",
" htmlcode += widgets.row([tokenomics_view])\n",
"\n",
"if not fundraise_df.empty:\n",
"if fundraise:\n",
" htmlcode += widgets.row([widgets.h(3, \"Fundraising Details\")])\n",
" htmlcode += widgets.row([widgets.p(fundraise_info)])\n",
" htmlcode += widgets.row([fundraise_df.to_html()])\n",
@@ -1091,29 +1052,38 @@
" htmlcode += widgets.row([widgets.h(3, \"All time low\")])\n",
" htmlcode += widgets.row([atl.to_html()])\n",
"\n",
"htmlcode += widgets.row([widgets.h(3, \"All markets\")])\n",
"htmlcode += widgets.row([market.sample(n=20).sort_index().to_html(escape=False)])\n",
"htmlcode += widgets.row([widgets.h(3, \"Exchanges where loaded coin is listed\")])\n",
"htmlcode += widgets.row([ex.sample(n=20).sort_index().to_html()])\n",
"htmlcode += widgets.row([widgets.h(3, \"Last trades\")])\n",
"htmlcode += widgets.row([trades.tail(20).to_html()])\n",
"if not market.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"All markets\")])\n",
" htmlcode += widgets.row([market.sample(n=20).sort_index().to_html(escape=False)])\n",
"\n",
"if not ex.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Exchanges where loaded coin is listed\")])\n",
" htmlcode += widgets.row([ex.sample(n=20).sort_index().to_html()])\n",
"\n",
"if not trades.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Last trades\")])\n",
" htmlcode += widgets.row([trades.tail(20).to_html()])\n",
"\n",
"if order_book_raw:\n",
" htmlcode += widgets.row([widgets.h(3, \"Order book\")])\n",
" htmlcode += widgets.row([order_book])\n",
"\n",
"htmlcode += widgets.row(\n",
" [widgets.h(3, \"Price and supply related metrics for loaded coin\")]\n",
")\n",
"htmlcode += widgets.row([ps.to_html()])\n",
"if not ps.empty:\n",
" htmlcode += widgets.row(\n",
" [widgets.h(3, \"Price and supply related metrics for loaded coin\")]\n",
" )\n",
" htmlcode += widgets.row([ps.to_html()])\n",
"\n",
"if not events.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Events\")])\n",
" htmlcode += widgets.row([events.to_html(escape=False)])\n",
"\n",
"# TODO: print rich table\n",
"# htmlcode += widgets.row([widgets.h(3, \"Tweets for loaded coin\")])\n",
"# htmlcode += widgets.row([tweets])\n",
"# htmlcode += widgets.row([widgets.h(3, \"Social media\")])\n",
"# htmlcode += widgets.row([social.to_html()])\n",
"\n",
"if not gh_data.empty:\n",
" htmlcode += widgets.row([widgets.h(3, \"Github activity over time\")])\n",
" htmlcode += widgets.row([gh])\n",
@@ -1171,7 +1141,7 @@
"metadata": {
"celltoolbar": "Tags",
"kernelspec": {
"display_name": "Python 3.9.6 ('obb')",
"display_name": "obb-full",
"language": "python",
"name": "python3"
},
@@ -1189,7 +1159,7 @@
},
"vscode": {
"interpreter": {
"hash": "cb66ba39c97f15743fbb79e204a841ea03600987d49579cfb0ffc8e8dd934c69"
"hash": "73442d10f374b1f81e7aab42e2dddb832a354757dce244164d617e7faf60ecd1"
}
}
},