diff --git a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py index f3dfa10cbf9..4c21816223e 100644 --- a/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py +++ b/openbb_terminal/cryptocurrency/cryptocurrency_helpers.py @@ -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) diff --git a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py index db42333406c..0d0e1db417e 100644 --- a/openbb_terminal/cryptocurrency/due_diligence/messari_model.py +++ b/openbb_terminal/cryptocurrency/due_diligence/messari_model.py @@ -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" diff --git a/openbb_terminal/reports/templates/crypto.ipynb b/openbb_terminal/reports/templates/crypto.ipynb index 130ece82da5..8cff5e6ca0d 100644 --- a/openbb_terminal/reports/templates/crypto.ipynb +++ b/openbb_terminal/reports/templates/crypto.ipynb @@ -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'{x}')\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'{x}')\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'{x}')\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'{x}'\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'{x}')\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" } } },