Increase robustness of load command

This commit is contained in:
didier
2021-05-01 00:53:16 +01:00
parent 4f581f7243
commit 3df6da2889
2 changed files with 80 additions and 58 deletions

View File

@@ -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):

View File

@@ -47,7 +47,7 @@ def main():
os.system("")
s_ticker = ""
s_start = ""
s_start = "2015-01-01"
df_stock = pd.DataFrame()
s_interval = "1440min"