Spaces:
Running
Running
Update app.py
Browse filesStock plots 40 days
app.py
CHANGED
|
@@ -21,6 +21,7 @@ import pandas as pd
|
|
| 21 |
import yfinance as yf
|
| 22 |
from datetime import datetime, timedelta
|
| 23 |
import pytz
|
|
|
|
| 24 |
|
| 25 |
|
| 26 |
load_dotenv(override=True)
|
|
@@ -96,16 +97,20 @@ def stock_list():
|
|
| 96 |
rv += f'{symbol} {name}\n'
|
| 97 |
return rv
|
| 98 |
|
| 99 |
-
def
|
| 100 |
stock_list = {}
|
| 101 |
-
fuzzy = True
|
| 102 |
-
have_symbol = False
|
| 103 |
-
search_symbol = search_symbol.strip().upper()
|
| 104 |
with open(stock_data_path, 'rt') as fp:
|
| 105 |
lines = fp.readlines()
|
| 106 |
for line in lines:
|
| 107 |
(name, symbol, shares) = line.rstrip().split(',')
|
| 108 |
-
stock_list[symbol.strip()] = name.strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
search_term = search_symbol
|
| 110 |
if search_symbol in stock_list.keys():
|
| 111 |
have_symbol = True
|
|
@@ -155,7 +160,7 @@ def stock_week_df(symbol):
|
|
| 155 |
etime = etz_now()
|
| 156 |
if etime.hour >= 16:
|
| 157 |
etime = etime + timedelta(days=1)
|
| 158 |
-
week_ago = etime - timedelta(days=8
|
| 159 |
end = etime.strftime('%Y-%m-%d')
|
| 160 |
start = week_ago.strftime('%Y-%m-%d')
|
| 161 |
df = yf.download(symbol.upper(),
|
|
@@ -169,12 +174,12 @@ def stock_week_df(symbol):
|
|
| 169 |
for i in range(numDays):
|
| 170 |
valsTxt.append(vals2d[i][0])
|
| 171 |
for val in valsTxt:
|
| 172 |
-
v = float(val)
|
| 173 |
values.append(v)
|
| 174 |
if v > ymax:
|
| 175 |
ymax = v
|
| 176 |
for row in df.index:
|
| 177 |
-
dates.append(row.strftime('%
|
| 178 |
data = {
|
| 179 |
"date": dates,
|
| 180 |
"value" : values
|
|
@@ -263,6 +268,85 @@ def get_last_closing(symbol, offset=0, timeout=10):
|
|
| 263 |
except:
|
| 264 |
return (0.0, "0000-00-00")
|
| 265 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 266 |
def create_stock_data_file(txt):
|
| 267 |
with open(stock_data_path, 'wt') as fp:
|
| 268 |
fp.write(txt)
|
|
@@ -496,7 +580,7 @@ def chat(prompt, user_window, pwd_window, past, response, gptModel, uploaded_ima
|
|
| 496 |
if args[1] == 'value':
|
| 497 |
return [past, md(response), None, gptModel, uploaded_image_file, plot]
|
| 498 |
elif args[1] == 'history':
|
| 499 |
-
(plot_df, ymax) = stock_history_df(12)
|
| 500 |
# ymax = float(ymax)
|
| 501 |
return [past, md(response), None, gptModel, uploaded_image_file,
|
| 502 |
gr.LinePlot(plot_df, x="date", y="value", visible=True,
|
|
@@ -506,12 +590,13 @@ def chat(prompt, user_window, pwd_window, past, response, gptModel, uploaded_ima
|
|
| 506 |
symbol = ' '.join(args[2:])
|
| 507 |
(response, plot_df, ymax) = get_stock_news(symbol)
|
| 508 |
ymax *= 1.1
|
|
|
|
| 509 |
if plot_df.empty:
|
| 510 |
-
return [past,
|
| 511 |
else:
|
| 512 |
-
return [past,
|
| 513 |
gr.LinePlot(plot_df, x="date", y="value", visible=True,
|
| 514 |
-
y_lim=[0, ymax],label=f"{symbol} Recent Prices")]
|
| 515 |
# elif arg[1] == 'history':
|
| 516 |
# symbol = arg[2]
|
| 517 |
# response = 'ok' # get_
|
|
|
|
| 21 |
import yfinance as yf
|
| 22 |
from datetime import datetime, timedelta
|
| 23 |
import pytz
|
| 24 |
+
import math
|
| 25 |
|
| 26 |
|
| 27 |
load_dotenv(override=True)
|
|
|
|
| 97 |
rv += f'{symbol} {name}\n'
|
| 98 |
return rv
|
| 99 |
|
| 100 |
+
def get_stock_list():
|
| 101 |
stock_list = {}
|
|
|
|
|
|
|
|
|
|
| 102 |
with open(stock_data_path, 'rt') as fp:
|
| 103 |
lines = fp.readlines()
|
| 104 |
for line in lines:
|
| 105 |
(name, symbol, shares) = line.rstrip().split(',')
|
| 106 |
+
stock_list[symbol.strip()] = (name.strip(),shares.strip())
|
| 107 |
+
return stock_list
|
| 108 |
+
|
| 109 |
+
def get_stock_news(search_symbol):
|
| 110 |
+
fuzzy = True
|
| 111 |
+
have_symbol = False
|
| 112 |
+
search_symbol = search_symbol.strip().upper()
|
| 113 |
+
stock_list = get_stock_list()
|
| 114 |
search_term = search_symbol
|
| 115 |
if search_symbol in stock_list.keys():
|
| 116 |
have_symbol = True
|
|
|
|
| 160 |
etime = etz_now()
|
| 161 |
if etime.hour >= 16:
|
| 162 |
etime = etime + timedelta(days=1)
|
| 163 |
+
week_ago = etime - timedelta(days=40) # was 8
|
| 164 |
end = etime.strftime('%Y-%m-%d')
|
| 165 |
start = week_ago.strftime('%Y-%m-%d')
|
| 166 |
df = yf.download(symbol.upper(),
|
|
|
|
| 174 |
for i in range(numDays):
|
| 175 |
valsTxt.append(vals2d[i][0])
|
| 176 |
for val in valsTxt:
|
| 177 |
+
v = round(float(val),2)
|
| 178 |
values.append(v)
|
| 179 |
if v > ymax:
|
| 180 |
ymax = v
|
| 181 |
for row in df.index:
|
| 182 |
+
dates.append(row.strftime('%m-%d'))
|
| 183 |
data = {
|
| 184 |
"date": dates,
|
| 185 |
"value" : values
|
|
|
|
| 268 |
except:
|
| 269 |
return (0.0, "0000-00-00")
|
| 270 |
|
| 271 |
+
def get_total_daily_closing_sequence(num_days):
|
| 272 |
+
try:
|
| 273 |
+
first_loop = True
|
| 274 |
+
max_val = 0.0
|
| 275 |
+
stock_list = get_stock_list()
|
| 276 |
+
symbols = [s for s in stock_list.keys()]
|
| 277 |
+
# symbols = symbols[8:10]
|
| 278 |
+
etime = etz_now()
|
| 279 |
+
if etime.hour >= 16:
|
| 280 |
+
etime = etime + timedelta(days=1)
|
| 281 |
+
end = etime.strftime('%Y-%m-%d')
|
| 282 |
+
start_time = etime - timedelta(days = num_days)
|
| 283 |
+
start = start_time.strftime('%Y-%m-%d')
|
| 284 |
+
df = yf.download(symbols,
|
| 285 |
+
start = start,
|
| 286 |
+
end = end,
|
| 287 |
+
progress = False,
|
| 288 |
+
)
|
| 289 |
+
# val2d = df.values.tolist()
|
| 290 |
+
dates = []
|
| 291 |
+
for row in df.index:
|
| 292 |
+
dates.append(row.strftime('%m-%d'))
|
| 293 |
+
# columns = list(df.columns.values)
|
| 294 |
+
# cvals = df[columns[0]].tolist()
|
| 295 |
+
|
| 296 |
+
for sym in symbols:
|
| 297 |
+
(name, shares) = stock_list[sym]
|
| 298 |
+
values = df[('Close', sym)].tolist()
|
| 299 |
+
n = len(values)
|
| 300 |
+
for i in range(n):
|
| 301 |
+
if math.isnan(float(values[i])):
|
| 302 |
+
if i == 0:
|
| 303 |
+
values[0] = values[1]
|
| 304 |
+
else:
|
| 305 |
+
values[i] = values[i-1]
|
| 306 |
+
if first_loop:
|
| 307 |
+
first_loop = False
|
| 308 |
+
total_values = values.copy()
|
| 309 |
+
for i in range(n):
|
| 310 |
+
total_values[i] = float(total_values[i]) * float(shares)
|
| 311 |
+
else:
|
| 312 |
+
for i in range(n):
|
| 313 |
+
total_values[i] += (float(values[i]) * float(shares))
|
| 314 |
+
for i in range(n):
|
| 315 |
+
total_values[i] = round(total_values[i], 2)
|
| 316 |
+
if total_values[i] > max_val:
|
| 317 |
+
max_val = total_values[i]
|
| 318 |
+
data = {
|
| 319 |
+
"date": dates,
|
| 320 |
+
"value" : total_values
|
| 321 |
+
}
|
| 322 |
+
return (pd.DataFrame(data), max_val)
|
| 323 |
+
except:
|
| 324 |
+
return (pd.DataFrame(), 0.0)
|
| 325 |
+
|
| 326 |
+
def get_daily_closing_sequence(symbol, num_days):
|
| 327 |
+
try:
|
| 328 |
+
dates = []
|
| 329 |
+
values = []
|
| 330 |
+
etime = etz_now()
|
| 331 |
+
if etime.hour >= 16:
|
| 332 |
+
etime = etime + timedelta(days=1)
|
| 333 |
+
end = etime.strftime('%Y-%m-%d')
|
| 334 |
+
start_time = etime - timedelta(days = num_days)
|
| 335 |
+
start = start_time.strftime('%Y-%m-%d')
|
| 336 |
+
df = yf.download(symbol,
|
| 337 |
+
start = start,
|
| 338 |
+
end = end,
|
| 339 |
+
progress = False,
|
| 340 |
+
)
|
| 341 |
+
vals2d = df.values.tolist()
|
| 342 |
+
valsTxt = []
|
| 343 |
+
values = [round(float(vals2d[i][0]),2) for i in range(len(vals2d))]
|
| 344 |
+
for row in df.index:
|
| 345 |
+
dates.append(row.strftime('%Y-%m-%d'))
|
| 346 |
+
return(dates, values)
|
| 347 |
+
except:
|
| 348 |
+
return([],[])
|
| 349 |
+
|
| 350 |
def create_stock_data_file(txt):
|
| 351 |
with open(stock_data_path, 'wt') as fp:
|
| 352 |
fp.write(txt)
|
|
|
|
| 580 |
if args[1] == 'value':
|
| 581 |
return [past, md(response), None, gptModel, uploaded_image_file, plot]
|
| 582 |
elif args[1] == 'history':
|
| 583 |
+
(plot_df, ymax) = get_total_daily_closing_sequence(40) #stock_history_df(12)
|
| 584 |
# ymax = float(ymax)
|
| 585 |
return [past, md(response), None, gptModel, uploaded_image_file,
|
| 586 |
gr.LinePlot(plot_df, x="date", y="value", visible=True,
|
|
|
|
| 590 |
symbol = ' '.join(args[2:])
|
| 591 |
(response, plot_df, ymax) = get_stock_news(symbol)
|
| 592 |
ymax *= 1.1
|
| 593 |
+
mdtxt = md(f'News for {symbol}:\n\n' + response)
|
| 594 |
if plot_df.empty:
|
| 595 |
+
return [past, mdtxt, None, gptModel, uploaded_image_file, plot]
|
| 596 |
else:
|
| 597 |
+
return [past, mdtxt, None, gptModel, uploaded_image_file,
|
| 598 |
gr.LinePlot(plot_df, x="date", y="value", visible=True,
|
| 599 |
+
y_lim=[0, ymax],label=f"{symbol.upper()} Recent Prices")]
|
| 600 |
# elif arg[1] == 'history':
|
| 601 |
# symbol = arg[2]
|
| 602 |
# response = 'ok' # get_
|