diff --git a/gamestonk_terminal/fundamental_analysis/fa_menu.py b/gamestonk_terminal/fundamental_analysis/fa_menu.py index 3009a753715..44bb4d3ab82 100644 --- a/gamestonk_terminal/fundamental_analysis/fa_menu.py +++ b/gamestonk_terminal/fundamental_analysis/fa_menu.py @@ -32,11 +32,8 @@ def print_fundamental_analysis(s_ticker, s_start, s_interval): print("") print("Market Watch API") print(" income income statement of the company") - print(" assets assets of the company") - print(" liabilities liabilities and shareholders equity of the company") - print(" operating cash flow operating activities of the company") - print(" investing cash flow investing activities of the company") - print(" financing cash flow financing activities of the company") + print(" balance balance sheet of the company") + print(" cash cash flow statement of the company") print("") print("Yahoo Finance API") print(" info information scope of the company") @@ -113,11 +110,8 @@ def fa_menu(s_ticker, s_start, s_interval): "sust", "cal", "income", - "assets", - "liabilities", - "operating", - "investing", - "financing", + "balance", + "cash", "overview", "key", "incom", @@ -175,20 +169,11 @@ def fa_menu(s_ticker, s_start, s_interval): elif ns_known_args.cmd == "income": mw_api.income(l_args, s_ticker) - elif ns_known_args.cmd == "assets": - mw_api.assets(l_args, s_ticker) + elif ns_known_args.cmd == "balance": + mw_api.balance(l_args, s_ticker) - elif ns_known_args.cmd == "liabilities": - mw_api.liabilities(l_args, s_ticker) - - elif ns_known_args.cmd == "operating": - mw_api.operating(l_args, s_ticker) - - elif ns_known_args.cmd == "investing": - mw_api.investing(l_args, s_ticker) - - elif ns_known_args.cmd == "financing": - mw_api.financing(l_args, s_ticker) + elif ns_known_args.cmd == "cash": + mw_api.cash(l_args, s_ticker) # YAHOO FINANCE API elif ns_known_args.cmd == "info": diff --git a/gamestonk_terminal/fundamental_analysis/market_watch_api.py b/gamestonk_terminal/fundamental_analysis/market_watch_api.py index 248547e396f..c039b24efc5 100644 --- a/gamestonk_terminal/fundamental_analysis/market_watch_api.py +++ b/gamestonk_terminal/fundamental_analysis/market_watch_api.py @@ -1,5 +1,4 @@ import argparse -import re import requests import pandas as pd from bs4 import BeautifulSoup @@ -50,8 +49,6 @@ def income(l_args, s_ticker): df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - df_financials = df_financials.drop(index="Item") - print(df_financials.to_string(index=False)) print("") @@ -61,9 +58,9 @@ def income(l_args, s_ticker): return -def assets(l_args, s_ticker): +def balance(l_args, s_ticker): parser = argparse.ArgumentParser( - prog="assets", + prog="balance", description=""" Prints either yearly or quarterly assets from balance sheet of the company. The following fields are expected: Cash & Short Term Investments, Cash & Short Term @@ -77,44 +74,8 @@ def assets(l_args, s_ticker): Other Property, Plant & Equipment, Accumulated Depreciation, Total Investments and Advances, Other Long-Term Investments, Long-Term Note Receivables, Intangible Assets, Net Goodwill, Net Other Intangibles, Other Assets [Source: Market Watch] - """, - ) - parser.add_argument( - "-q", - "--quarter", - action="store_true", - default=False, - dest="b_quarter", - help="Quarter fundamental data flag.", - ) - - try: - ns_parser = parse_known_args_and_warn(parser, l_args) - - if ns_parser.b_quarter: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/balance-sheet/quarter" - else: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/balance-sheet" - - df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - - df_financials.drop(index="Item") - - print(df_financials.iloc[:33].to_string()) - print("") - - except Exception as e: - print(e) - print("") - return - - -def liabilities(l_args, s_ticker): - parser = argparse.ArgumentParser( - prog="liabilities", - description=""" - Prints either yearly or quarterly liablities and shareholders' equity from balance + Prints either yearly or quarterly liabilities and shareholders' equity from balance sheet of the company. The following fields are expected: ST Debt & Current Portion LT Debt, Short Term Debt, Current Portion of Long Term Debt, Accounts Payable, Accounts Payable Growth, Income Tax Payable, Other Current Liabilities, Dividends Payable, @@ -153,7 +114,7 @@ def liabilities(l_args, s_ticker): df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - print(df_financials.iloc[34:].to_string()) + print(df_financials.to_string(index=False)) print("") except Exception as e: @@ -162,9 +123,9 @@ def liabilities(l_args, s_ticker): return -def operating(l_args, s_ticker): +def cash(l_args, s_ticker): parser = argparse.ArgumentParser( - prog="operating", + prog="cash_flow", description=""" Prints either yearly or quarterly cash flow operating activities of the company. The following fields are expected: Net Income before Extraordinaries, Net Income @@ -173,84 +134,14 @@ def operating(l_args, s_ticker): Taxes, Investment Tax Credit, Other Funds, Funds from Operations, Extraordinaries, Changes in Working Capital, Receivables, Accounts Payable, Other Assets/Liabilities, and Net Operating Cash Flow Growth. [Source: Market Watch] - """, - ) - parser.add_argument( - "-q", - "--quarter", - action="store_true", - default=False, - dest="b_quarter", - help="Quarter fundamental data flag.", - ) - - try: - ns_parser = parse_known_args_and_warn(parser, l_args) - - if ns_parser.b_quarter: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/cash-flow/quarter" - else: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/cash-flow" - - df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - - df_financials.drop(index="Item") - - print(df_financials.iloc[:16].to_string()) - print("") - - except Exception as e: - print(e) - print("") - return - - -def investing(l_args, s_ticker): - parser = argparse.ArgumentParser( - prog="investing", - description=""" Prints either yearly or quarterly cash flow investing activities of the company. The following fields are expected: Capital Expenditures, Capital Expenditures Growth, Capital Expenditures/Sales, Capital Expenditures (Fixed Assets), Capital Expenditures (Other Assets), Net Assets from Acquisitions, Sale of Fixed Assets & Businesses, Purchase/Sale of Investments, Purchase of Investments, Sale/Maturity of Investments, Other Uses, Other Sources, Net Investing Cash Flow Growth. [Source: Market Watch] - """, - ) - parser.add_argument( - "-q", - "--quarter", - action="store_true", - default=False, - dest="b_quarter", - help="Quarter fundamental data flag.", - ) - - try: - ns_parser = parse_known_args_and_warn(parser, l_args) - - if ns_parser.b_quarter: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/cash-flow/quarter" - else: - url_financials = f"https://www.marketwatch.com/investing/stock/{s_ticker}/financials/cash-flow" - - df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - - print(df_financials.iloc[17:30].to_string()) - print("") - - except Exception as e: - print(e) - print("") - return - - -def financing(l_args, s_ticker): - parser = argparse.ArgumentParser( - prog="financing", - description=""" Prints either yearly or quarterly cash flow financing activities of the company. The following fields are expected: Cash Dividends Paid - Total, Common Dividends, Preferred Dividends, Change in Capital Stock, Repurchase of Common & Preferred Stk., @@ -283,7 +174,7 @@ def financing(l_args, s_ticker): df_financials = prepare_df_financials(url_financials, ns_parser.b_quarter) - print(df_financials.iloc[31:].to_string()) + print(df_financials.to_string(index=False)) print("") except Exception as e: @@ -310,26 +201,35 @@ def prepare_df_financials(url_financials: str, quarter: bool) -> pd.DataFrame: columns=a_financials_header[0 : a_financials_header.index(s_header_end_trend)] ) - # Add financials values - soup_financials = text_soup_financials.findAll( - lambda tag: tag.name == "tr" and tag.get("class") == ["table__row"] + find_table = text_soup_financials.findAll( + "div", {"class": "element element--table table--fixed financials"} ) - soup_financials += text_soup_financials.findAll( - "tr", {"class": "table__row is-highlighted"} - ) - for financials_info in soup_financials: - financials_row = financials_info.text.split("\n") - if len(financials_row) > 5: - for item in financials_row: - if bool(re.search(r"\d", item)): - a_financials_info = financials_info.text.split("\n") - l_financials = [a_financials_info[2]] - l_financials.extend(a_financials_info[5:-2]) - # Append data values to financials - df_financials.loc[len(df_financials.index)] = l_financials - break - # Set item name as index - df_financials = df_financials.set_index("Item") + if not find_table: + return df_financials + + financials_rows = find_table[0].findAll( + "tr", {"class": ["table__row is-highlighted", "table__row"]} + ) + + for a_row in financials_rows: + constructed_row = list() + financial_columns = a_row.findAll( + "td", {"class": ["overflow__cell", "overflow__cell fixed--column"]} + ) + + if not financial_columns: + continue + + for a_column in financial_columns: + column_to_text = a_column.text.strip() + if "\n" in column_to_text: + column_to_text = column_to_text.split("\n")[0] + + if column_to_text == "": + continue + constructed_row.append(column_to_text) + + df_financials.loc[len(df_financials)] = constructed_row return df_financials diff --git a/tests/test_fa_market_watch_api.py b/tests/test_fa_market_watch_api.py index 25edfa89b12..da8057c5d38 100644 --- a/tests/test_fa_market_watch_api.py +++ b/tests/test_fa_market_watch_api.py @@ -6,4 +6,4 @@ from gamestonk_terminal.fundamental_analysis.market_watch_api import income class TestFaMarketWatchApi(unittest.TestCase): def test_income(self): - income([], "PLTR") + income([], "GME")