From d91eb57f1616d7ed65a981ae46e1cf27df4a30cd Mon Sep 17 00:00:00 2001 From: James Maslek Date: Thu, 17 Nov 2022 05:03:14 -0500 Subject: [PATCH] SDK mapping refactors + FA refactor (#3440) * First commit * Other sources * Update trail map * Couple more trail map updates * Balance Sheet SDK * Cash flow for SDK Co-authored-by: Chavithra --- .../miscellaneous/library/trail_map.csv | 26 +-- .../stocks/fundamental_analysis/fmp_model.py | 6 + .../fundamental_analysis/sdk_helpers.py | 200 ++++++++++++++++++ 3 files changed, 215 insertions(+), 17 deletions(-) create mode 100644 openbb_terminal/stocks/fundamental_analysis/sdk_helpers.py diff --git a/openbb_terminal/miscellaneous/library/trail_map.csv b/openbb_terminal/miscellaneous/library/trail_map.csv index 938c9cd22e63..98223402ca00 100644 --- a/openbb_terminal/miscellaneous/library/trail_map.csv +++ b/openbb_terminal/miscellaneous/library/trail_map.csv @@ -35,7 +35,7 @@ stocks.ba.infer,openbb_terminal.common.behavioural_analysis.twitter_model.load_a stocks.ba.sentiment,openbb_terminal.common.behavioural_analysis.twitter_model.get_sentiment,openbb_terminal.common.behavioural_analysis.twitter_view.display_sentiment etf.news,openbb_terminal.common.newsapi_model.get_news,openbb_terminal.common.newsapi_view.display_news news,openbb_terminal.common.feedparser_model.get_news, -qa.bw,openbb_terminal.common.quantitative_analysis.qa_view.display_bw,openbb_terminal.common.quantitative_analysis.qa_view.display_bw +qa.bw,openbb_terminal.common.quantitative_analysis.qa_view.display_bw, qa.calculate_adjusted_var,openbb_terminal.common.quantitative_analysis.qa_model.calculate_adjusted_var, qa.es,openbb_terminal.common.quantitative_analysis.qa_model.get_es,openbb_terminal.common.quantitative_analysis.qa_view.display_es qa.normality,openbb_terminal.common.quantitative_analysis.qa_model.get_normality,openbb_terminal.common.quantitative_analysis.qa_view.display_normality @@ -105,7 +105,6 @@ crypto.disc.categories_keys,openbb_terminal.cryptocurrency.discovery.pycoingecko crypto.disc.coin_list,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_coin_list, crypto.disc.coins,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_coins,openbb_terminal.cryptocurrency.discovery.pycoingecko_view.display_coins crypto.disc.coins_for_given_exchange,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_coins_for_given_exchange, -crypto.disc.gainers_or_losers,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_gainers_or_losers, crypto.disc.gainers,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_gainers,openbb_terminal.cryptocurrency.discovery.pycoingecko_view.display_gainers crypto.disc.losers,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_losers,openbb_terminal.cryptocurrency.discovery.pycoingecko_view.display_losers crypto.disc.trending,openbb_terminal.cryptocurrency.discovery.pycoingecko_model.get_trending_coins,openbb_terminal.cryptocurrency.discovery.pycoingecko_view.display_trending @@ -250,11 +249,10 @@ economy.perfmap,openbb_terminal.economy.finviz_model.get_performance_map, economy.fred_series,openbb_terminal.economy.fred_model.get_aggregated_series_data,openbb_terminal.economy.fred_view.display_fred_series economy.fred_ids,openbb_terminal.economy.fred_model.get_series_ids, economy.fred_notes,openbb_terminal.economy.fred_model.get_series_notes, -economy.fred_yield_curve,openbb_terminal.economy.fred_model.get_yield_curve,openbb_terminal.economy.fred_view.display_yield_curve +economy.ycrv,openbb_terminal.economy.fred_model.get_yield_curve,openbb_terminal.economy.fred_view.display_yield_curve economy.get_events_countries,openbb_terminal.economy.investingcom_model.get_events_countries, economy.events,openbb_terminal.economy.nasdaq_model.get_economic_calendar, economy.get_ycrv_countries,openbb_terminal.economy.investingcom_model.get_ycrv_countries, -economy.ycrv,openbb_terminal.economy.fred_model.get_yield_curve,openbb_terminal.economy.fred_view.display_yield_curve economy.country_codes,openbb_terminal.economy.nasdaq_model.get_country_codes, economy.bigmac,openbb_terminal.economy.nasdaq_model.get_big_mac_indices,openbb_terminal.economy.nasdaq_view.display_big_mac_index economy.glbonds,openbb_terminal.economy.wsj_model.global_bonds, @@ -278,9 +276,8 @@ etf.etf_by_name,openbb_terminal.etf.stockanalysis_model.get_etfs_by_name,openbb_ etf.weights,openbb_terminal.etf.yfinance_model.get_etf_sector_weightings,openbb_terminal.etf.yfinance_view.display_etf_weightings etf.summary,openbb_terminal.etf.yfinance_model.get_etf_summary_description,openbb_terminal.etf.yfinance_view.display_etf_description forex.get_currency_list,openbb_terminal.forex.av_model.get_currency_list, -forex.hist,openbb_terminal.forex.av_model.get_historical, -forex.quote,openbb_terminal.forex.av_model.get_quote,openbb_terminal.forex.av_view.display_quote -forex.oanda.fwd,openbb_terminal.forex.fxempire_model.get_forward_rates,openbb_terminal.forex.fxempire_view.display_forward_rates +forex.quote,openbb_terminal.forex.av_model.get_quote, +forex.fwd,openbb_terminal.forex.fxempire_model.get_forward_rates,openbb_terminal.forex.fxempire_view.display_forward_rates forex.oanda.summary,openbb_terminal.forex.oanda.oanda_model.account_summary_request,openbb_terminal.forex.oanda.oanda_view.get_account_summary forex.oanda.cancel,openbb_terminal.forex.oanda.oanda_model.cancel_pending_order_request,openbb_terminal.forex.oanda.oanda_view.cancel_pending_order forex.oanda.close,openbb_terminal.forex.oanda.oanda_model.close_trades_request,openbb_terminal.forex.oanda.oanda_view.close_trade @@ -409,12 +406,12 @@ stocks.dd.analyst,openbb_terminal.stocks.due_diligence.finviz_model.get_analyst_ stocks.dd.news,openbb_terminal.stocks.due_diligence.finviz_model.get_news, stocks.dd.rating,openbb_terminal.stocks.due_diligence.fmp_model.get_rating, stocks.dd.sec,openbb_terminal.stocks.due_diligence.marketwatch_model.get_sec_filings,openbb_terminal.stocks.due_diligence.marketwatch_view.sec_filings -stocks.fa.av_balance,openbb_terminal.stocks.fundamental_analysis.av_model.get_balance_sheet, -stocks.fa.av_cash,openbb_terminal.stocks.fundamental_analysis.av_model.get_cash_flow,openbb_terminal.stocks.fundamental_analysis.av_view.display_cash_flow stocks.fa.dupont,openbb_terminal.stocks.fundamental_analysis.av_model.get_dupont, stocks.fa.earnings,openbb_terminal.stocks.fundamental_analysis.av_model.get_earnings, stocks.fa.fraud,openbb_terminal.stocks.fundamental_analysis.av_model.get_fraud_ratios, -stocks.fa.av_income,openbb_terminal.stocks.fundamental_analysis.av_model.get_income_statements, +stocks.fa.income,openbb_terminal.stocks.fundamental_analysis.sdk_helpers.get_income_statement, +stocks.fa.cash,openbb_terminal.stocks.fundamental_analysis.sdk_helpers.get_cash_flow, +stocks.fa.balance,openbb_terminal.stocks.fundamental_analysis.sdk_helpers.get_balance_sheet, stocks.fa.av_metrics,openbb_terminal.stocks.fundamental_analysis.av_model.get_key_metrics, stocks.fa.av_overview,openbb_terminal.stocks.fundamental_analysis.av_model.get_overview, stocks.fa.mgmt,openbb_terminal.stocks.fundamental_analysis.business_insider_model.get_management, @@ -423,22 +420,17 @@ stocks.fa.fama_raw,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_fam stocks.fa.historical_5,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_historical_5, stocks.fa.similar_dfs,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_similar_dfs, stocks.fa.analysis,openbb_terminal.stocks.fundamental_analysis.eclect_us_model.get_filings_analysis, -stocks.fa.fmp_balance,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_balance, -stocks.fa.fmp_cash,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_cash, stocks.fa.dcf,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_dcf, stocks.fa.enterprise,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_enterprise, stocks.fa.growth,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_financial_growth, -stocks.fa.fmp_income,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_income, stocks.fa.fmp_metrics,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_key_metrics, -stocks.fa.fmp_ratios,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_key_ratios, +stocks.fa.ratios,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_key_ratios, stocks.fa.profile,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_profile, stocks.fa.quote,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_quote, stocks.fa.score,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_score, stocks.fa.data,openbb_terminal.stocks.fundamental_analysis.finviz_model.get_data, -stocks.fa.poly_financials,openbb_terminal.stocks.fundamental_analysis.polygon_model.get_financials,openbb_terminal.stocks.fundamental_analysis.polygon_view.display_fundamentals stocks.fa.cal,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_calendar_earnings, stocks.fa.divs,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_dividends, -stocks.fa.yf_financials,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_financials,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_view.display_fundamentals stocks.fa.hq,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_hq, stocks.fa.info,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_info, stocks.fa.mktcap,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_mktcap,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_view.display_mktcap @@ -555,4 +547,4 @@ keys.shroom,openbb_terminal.keys_model.set_shroom_key, futures.search,openbb_terminal.futures.yfinance_model.get_search_futures,openbb_terminal.futures.yfinance_view.display_search futures.historical,openbb_terminal.futures.yfinance_model.get_historical_futures,openbb_terminal.futures.yfinance_view.display_historical futures.curve,openbb_terminal.futures.yfinance_model.get_curve_futures,openbb_terminal.futures.yfinance_view.display_curve -economy.get_groups,openbb_terminal.economy.finviz_model.get_groups \ No newline at end of file +economy.get_groups,openbb_terminal.economy.finviz_model.get_groups diff --git a/openbb_terminal/stocks/fundamental_analysis/fmp_model.py b/openbb_terminal/stocks/fundamental_analysis/fmp_model.py index c6d8f81a12fd..3cad2cc0016d 100644 --- a/openbb_terminal/stocks/fundamental_analysis/fmp_model.py +++ b/openbb_terminal/stocks/fundamental_analysis/fmp_model.py @@ -252,9 +252,11 @@ def get_income( # Invalid API Keys except ValueError as e: console.print(e) + return pd.DataFrame() # Premium feature, API plan is not authorized except HTTPError as e: console.print(e) + return pd.DataFrame() if ratios: types = df_fa.copy().applymap(lambda x: isinstance(x, (float, int))).all(axis=1) @@ -321,9 +323,11 @@ def get_balance( # Invalid API Keys except ValueError as e: console.print(e) + return pd.DataFrame() # Premium feature, API plan is not authorized except HTTPError as e: console.print(e) + return pd.DataFrame() if ratios: types = df_fa.copy().applymap(lambda x: isinstance(x, (float, int))).all(axis=1) @@ -387,9 +391,11 @@ def get_cash( # Invalid API Keys except ValueError as e: console.print(e) + return pd.DataFrame() # Premium feature, API plan is not authorized except HTTPError as e: console.print(e) + return pd.DataFrame() if ratios: types = df_fa.copy().applymap(lambda x: isinstance(x, (float, int))).all(axis=1) diff --git a/openbb_terminal/stocks/fundamental_analysis/sdk_helpers.py b/openbb_terminal/stocks/fundamental_analysis/sdk_helpers.py new file mode 100644 index 000000000000..de983a62b3cc --- /dev/null +++ b/openbb_terminal/stocks/fundamental_analysis/sdk_helpers.py @@ -0,0 +1,200 @@ +"""SDK Helper Functions""" +__docformat__ = "numpy" + +import pandas as pd +from openbb_terminal.stocks.fundamental_analysis import ( + yahoo_finance_model, + polygon_model, + av_model, + fmp_model, + eodhd_model, +) + + +def get_income_statement( + symbol: str, + quarterly: bool = False, + ratios: bool = False, + source: str = "YahooFinance", + limit: int = 10, +) -> pd.DataFrame: + """Get income statement. + + Parameters + ---------- + symbol : str + Symbol to get income statement for + source : str, optional + Data source for income statement, by default "YahooFinance" + quarterly : bool, optional + Flag to get quarterly data + ratios : bool, optional + Flag to return data as a percent change. + limit : int + Number of statements to return (free tiers may be limited to 5 years) + + Returns + ------- + pd.DataFrame + Dataframe of income statement + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> income_statement = openbb.stocks.fa.income("AAPL", source="YahooFinance) + + If you have a premium AlphaVantage key, you can use the quarterly flag to get quarterly statements + >>> quarterly_income_statement = openbb.stocks.fa.income("AAPL", source="AlphaVantage", quarterly=True) + """ + if source == "YahooFinance": + if quarterly: + print( + "Quarterly income statement not available from Yahoo Finance. Returning annual" + ) + df = yahoo_finance_model.get_financials( + symbol=symbol, statement="financials", ratios=ratios + ) + return df + if source == "AlphaVantage": + df = av_model.get_income_statements( + symbol=symbol, quarterly=quarterly, ratios=ratios, limit=limit + ) + return df + if source == "FinancialModelingPrep": + df = fmp_model.get_income( + symbol=symbol, limit=limit, quarterly=quarterly, ratios=ratios + ) + return df + if source == "Polygon": + df = polygon_model.get_financials(symbol, "income", quarterly, ratios) + return df + if source == "EODHD": + df = eodhd_model.get_financials(symbol, "income", quarterly, ratios) + return df + return pd.DataFrame() + + +def get_balance_sheet( + symbol: str, + quarterly: bool = False, + ratios: bool = False, + source: str = "YahooFinance", + limit: int = 10, +) -> pd.DataFrame: + """Get balance sheet. + + Parameters + ---------- + symbol : str + Symbol to get balance sheet for + source : str, optional + Data source for balance sheet, by default "YahooFinance" + quarterly : bool, optional + Flag to get quarterly data + ratios : bool, optional + Flag to return data as a percent change. + limit : int + Number of statements to return (free tiers may be limited to 5 years) + + Returns + ------- + pd.DataFrame + Dataframe of balance sheet + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> balance_sheet = openbb.stocks.fa.balance("AAPL", source="YahooFinance) + + If you have a premium AlphaVantage key, you can use the quarterly flag to get quarterly statements + >>> quarterly_income_statement = openbb.stocks.fa.balance("AAPL", source="AlphaVantage", quarterly=True) + """ + if source == "YahooFinance": + if quarterly: + print( + "Quarterly statements not available from Yahoo Finance. Returning annual" + ) + df = yahoo_finance_model.get_financials( + symbol=symbol, statement="balance-sheet", ratios=ratios + ) + return df + if source == "AlphaVantage": + df = av_model.get_balance_sheet( + symbol=symbol, quarterly=quarterly, ratios=ratios, limit=limit + ) + return df + if source == "FinancialModelingPrep": + df = fmp_model.get_balance( + symbol=symbol, limit=limit, quarterly=quarterly, ratios=ratios + ) + return df + if source == "Polygon": + df = polygon_model.get_financials(symbol, "balance", quarterly, ratios) + return df + if source == "EODHD": + df = eodhd_model.get_financials(symbol, "balance", quarterly, ratios) + return df + return pd.DataFrame() + + +def get_cash_flow( + symbol: str, + quarterly: bool = False, + ratios: bool = False, + source: str = "YahooFinance", + limit: int = 10, +) -> pd.DataFrame: + """Get Cash Flow. + + Parameters + ---------- + symbol : str + Symbol to get cash flow for + source : str, optional + Data source for cash flow, by default "YahooFinance" + quarterly : bool, optional + Flag to get quarterly data + ratios : bool, optional + Flag to return data as a percent change. + limit : int + Number of statements to return (free tiers may be limited to 5 years) + + Returns + ------- + pd.DataFrame + Dataframe of cash flow + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> cash_flow = openbb.stocks.fa.cash("AAPL", source="YahooFinance) + + If you have a premium AlphaVantage key, you can use the quarterly flag to get quarterly statements + >>> quarterly_income_statement = openbb.stocks.fa.cash("AAPL", source="AlphaVantage", quarterly=True) + """ + if source == "YahooFinance": + if quarterly: + print( + "Quarterly statements not available from Yahoo Finance. Returning annual" + ) + df = yahoo_finance_model.get_financials( + symbol=symbol, statement="cash-flow", ratios=ratios + ) + return df + if source == "AlphaVantage": + df = av_model.get_cash_flow( + symbol=symbol, quarterly=quarterly, ratios=ratios, limit=limit + ) + return df + if source == "FinancialModelingPrep": + df = fmp_model.get_cash( + symbol=symbol, limit=limit, quarterly=quarterly, ratios=ratios + ) + return df + if source == "Polygon": + df = polygon_model.get_financials(symbol, "cash", quarterly, ratios) + return df + if source == "EODHD": + df = eodhd_model.get_financials(symbol, "cash", quarterly, ratios) + return df + return pd.DataFrame()