Spaces:
Sleeping
Sleeping
import gradio as gr | |
import yfinance as yf | |
import plotly.graph_objects as go | |
import plotly.express as px | |
from datetime import datetime | |
import matplotlib.pyplot as plt | |
import numpy as np | |
import pandas as pd | |
# Function to construct the pie chart | |
def get_pie_graph(data): | |
data['Change'] = data['Open'] - data['Close'].shift(1) | |
data['Movement'] = data['Change'].apply(lambda x : 'Up' if x > 0 else 'Down') | |
fig, ax = plt.subplots() | |
ax.pie(data['Movement'].value_counts(), labels=[f"{label}: {count}" for label, count in zip(data['Movement'].unique(), data['Movement'].value_counts().tolist())]) | |
return fig | |
# Function to construct the chart with markers | |
def get_trading_markers(data, t, tll): | |
val = data['Close'] | |
th = [] | |
marker = [] | |
for i in range(len(data)): | |
if(i == 0): | |
th.append(0) | |
else: | |
x = val[i] - val[i-1] | |
x = (x / val[i-1] )*10 | |
th.append(abs(x)) | |
data['Value'] = th | |
data['Marker'] = np.where(data['Value'] > t, 'yes', 'no') | |
df = data[data['Marker'] == 'yes'] | |
df = df.Close | |
x = pd.DataFrame({tll: data["Close"]}) | |
plt.plot(x) | |
plt.scatter(df.index, df, marker = 'x', c = 'b' , s = 60, zorder=2) | |
plt.title(tll) | |
return plt | |
def get_stock_data(start_date, end_date, stock_ticker, graph_type, t): | |
# Validate date format | |
try: | |
start_date = datetime.strptime(start_date, "%Y-%m-%d").date() | |
end_date = datetime.strptime(end_date, "%Y-%m-%d").date() | |
except ValueError: | |
return "Invalid date format. Please use the YYYY-MM-DD format." | |
# Fetch stock data using Yahoo Finance API | |
data = yf.download(stock_ticker, start=start_date, end=end_date) | |
data.reset_index(inplace=True) # Reset index to get separate "Date" column | |
# Return a different graph type depending on which option the user selected | |
match graph_type: | |
case 'Line chart of open prices': | |
# Create the line plot using Plotly Express | |
line_fig = px.line(data, x='Date', y='Open', title='Open Price') | |
return line_fig | |
case 'Candle chart of stocks': | |
candle_fig = go.Figure(data=[go.Candlestick(x=data['Date'], | |
open=data['Open'], | |
high=data['High'], | |
low=data['Low'], | |
close=data['Close'])]) | |
return candle_fig | |
case 'Chart of volume traded': | |
bar_fig = px.line(data, x = 'Date', y = 'Volume', title = 'Volume Traded') | |
return bar_fig | |
case 'Pie chart of stock movement': | |
pie_fig = get_pie_graph(data) | |
return pie_fig | |
case 'Chart of trading markers': | |
trade_markers_fig = get_trading_markers(data,t, stock_ticker) | |
return trade_markers_fig | |
outputs = [gr.Plot(label="Plot")] | |
iface = gr.Interface( | |
fn=get_stock_data, | |
inputs=[ | |
gr.inputs.Textbox(placeholder="YYYY-MM-DD", label="Start Date"), | |
gr.inputs.Textbox(placeholder="YYYY-MM-DD", label="End Date"), | |
gr.inputs.Textbox(placeholder="AAPL", label="Stock Ticker"), | |
# Dropdown of different choices of graphs to display | |
gr.inputs.Dropdown(choices=['Line chart of open prices', | |
'Candle chart of stocks', | |
'Chart of volume traded', | |
'Pie chart of stock movement', | |
'Chart of trading markers'], | |
label='Graph type'), | |
gr.inputs.Number(label="Marker value") | |
], | |
outputs=outputs, | |
title="Stock Data Viewer", | |
description="Enter the start date, end date, and stock ticker to view the stock data.", | |
) | |
iface.launch() | |