diff --git a/gamestonk_terminal/main_helper.py b/gamestonk_terminal/main_helper.py index 2c813d24a46..526a37c2a60 100644 --- a/gamestonk_terminal/main_helper.py +++ b/gamestonk_terminal/main_helper.py @@ -181,41 +181,40 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock): if not ns_parser: return [s_ticker, s_start, s_interval, df_stock] - except SystemExit: - print("") - return [s_ticker, s_start, s_interval, df_stock] - - # Update values: - s_ticker = ns_parser.s_ticker.upper() - s_start = ns_parser.s_start_date - s_interval = str(ns_parser.n_interval) + "min" - - try: # Daily - if s_interval == "1440min": + if ns_parser.n_interval == 1440: + # Alpha Vantage Source if ns_parser.source == "av": ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas") # pylint: disable=unbalanced-tuple-unpacking - df_stock, _ = ts.get_daily_adjusted( + df_stock_candidate, _ = ts.get_daily_adjusted( symbol=ns_parser.s_ticker, outputsize="full" ) - # pylint: disable=no-member - df_stock.sort_index(ascending=True, inplace=True) - # Slice dataframe from the starting date YYYY-MM-DD selected - df_stock = df_stock[ns_parser.s_start_date :] - - elif ns_parser.source == "yf": - df_stock = yf.download( - ns_parser.s_ticker, start=ns_parser.s_start_date, progress=False - ) - # Check that a stock was successfully retrieved - if df_stock.empty: + # Check that loading a stock was not successful + if df_stock_candidate.empty: print("") return [s_ticker, s_start, s_interval, df_stock] - df_stock = df_stock.rename( + # pylint: disable=no-member + df_stock_candidate.sort_index(ascending=True, inplace=True) + + # Slice dataframe from the starting date YYYY-MM-DD selected + df_stock_candidate = df_stock_candidate[ns_parser.s_start_date :] + + # Yahoo Finance Source + elif ns_parser.source == "yf": + df_stock_candidate = yf.download( + ns_parser.s_ticker, start=ns_parser.s_start_date, progress=False + ) + + # Check that loading a stock was not successful + if df_stock_candidate.empty: + print("") + return [s_ticker, s_start, s_interval, df_stock] + + df_stock_candidate = df_stock_candidate.rename( columns={ "Open": "1. open", "High": "2. high", @@ -225,41 +224,57 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock): "Volume": "6. volume", } ) - df_stock.index.name = "date" + df_stock_candidate.index.name = "date" - if df_stock.index[0] > s_start: - s_start = df_stock.index[0] + # Check if start time from dataframe is more recent than specified + if df_stock_candidate.index[0] > pd.to_datetime(ns_parser.s_start_date): + s_start = df_stock_candidate.index[0] + else: + s_start = ns_parser.s_start_date # Intraday else: + + # Alpha Vantage Source if ns_parser.source == "av": ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas") # pylint: disable=unbalanced-tuple-unpacking - df_stock, _ = ts.get_intraday( - symbol=ns_parser.s_ticker, outputsize="full", interval=s_interval + df_stock_candidate, _ = ts.get_intraday( + symbol=ns_parser.s_ticker, + outputsize="full", + interval=str(ns_parser.n_interval) + "min", ) + + # Check that loading a stock was not successful + if df_stock_candidate.empty: + print("") + return [s_ticker, s_start, s_interval, df_stock] + # pylint: disable=no-member - df_stock.sort_index(ascending=True, inplace=True) + df_stock_candidate.sort_index(ascending=True, inplace=True) # Slice dataframe from the starting date YYYY-MM-DD selected - df_stock = df_stock[ns_parser.s_start_date :] + df_stock_candidate = df_stock_candidate[ns_parser.s_start_date :] + # Check if start time from dataframe is more recent than specified + if df_stock_candidate.index[0] > pd.to_datetime(ns_parser.s_start_date): + s_start = df_stock_candidate.index[0] + else: + s_start = ns_parser.s_start_date + + # Yahoo Finance Source elif ns_parser.source == "yf": - s_int = s_interval[:-2] + s_int = str(ns_parser.n_interval) + "m" d_granularity = {"1m": 6, "5m": 59, "15m": 59, "30m": 59, "60m": 729} s_start_dt = datetime.utcnow() - timedelta(days=d_granularity[s_int]) s_date_start = s_start_dt.strftime("%Y-%m-%d") - s_start = pytz.utc.localize(s_start_dt) - if s_start_dt > ns_parser.s_start_date: - print( - f"Using Yahoo Finance with granularity {s_int} the starting date is set to: {s_date_start}\n" - ) + # Using Yahoo Finance with granularity {s_int} the starting date is set to: {s_date_start} - df_stock = yf.download( + df_stock_candidate = yf.download( ns_parser.s_ticker, start=s_date_start, progress=False, @@ -268,7 +283,7 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock): ) else: - df_stock = yf.download( + df_stock_candidate = yf.download( ns_parser.s_ticker, start=ns_parser.s_start_date.strftime("%Y-%m-%d"), progress=False, @@ -276,12 +291,17 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock): prepost=ns_parser.b_prepost, ) - # Check that a stock was successfully retrieved - if df_stock.empty: + # Check that loading a stock was not successful + if df_stock_candidate.empty: print("") return [s_ticker, s_start, s_interval, df_stock] - df_stock = df_stock.rename( + if s_start_dt > ns_parser.s_start_date: + s_start = pytz.utc.localize(s_start_dt) + else: + s_start = ns_parser.s_start_date + + df_stock_candidate = df_stock_candidate.rename( columns={ "Open": "1. open", "High": "2. high", @@ -291,26 +311,28 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock): "Volume": "6. volume", } ) - df_stock.index.name = "date" + df_stock_candidate.index.name = "date" - return [s_ticker, s_start, s_interval, df_stock] + s_intraday = (f"Intraday {s_interval}", "Daily")[ns_parser.n_interval == 1440] + + print( + f"Loading {s_intraday} {ns_parser.s_ticker.upper()} stock with starting period {s_start.strftime('%Y-%m-%d')} for analysis.\n" + ) + + return [ + ns_parser.s_ticker.upper(), + s_start, + str(ns_parser.n_interval) + "min", + df_stock_candidate, + ] except Exception as e: - print(e) - print("Either the ticker or the API_KEY are invalids. Try again!\n") + print(e, "\nEither the ticker or the API_KEY are invalids. Try again!\n") return [s_ticker, s_start, s_interval, df_stock] - s_intraday = (f"Intraday {s_interval}", "Daily")[s_interval == "1440min"] - - if s_start: - print( - f"Loading {s_intraday} {s_ticker} stock with starting period {s_start.strftime('%Y-%m-%d')} for analysis." - ) - else: - print(f"Loading {s_intraday} {s_ticker} stock for analysis.") - - print("") - return [s_ticker, s_start, s_interval, df_stock] + except SystemExit: + print("") + return [s_ticker, s_start, s_interval, df_stock] def candle(s_ticker: str, s_start: str): diff --git a/terminal.py b/terminal.py index 6765b0f68f5..c8a6e8b85f6 100644 --- a/terminal.py +++ b/terminal.py @@ -47,7 +47,7 @@ def main(): os.system("") s_ticker = "" - s_start = "" + s_start = "2015-01-01" df_stock = pd.DataFrame() s_interval = "1440min"