Spaces:
Sleeping
Sleeping
import pandas as pd | |
import plotly.express as px | |
import plotly.graph_objects as go | |
from plotly.subplots import make_subplots | |
def handle_click(state, context: dict, ui): | |
# Resetting the classes for active button | |
if state["active_button"]: | |
active_button = ui.find(state["active_button"]) | |
active_button.content["cssClasses"] = "" | |
event_target = context["target"] | |
button = ui.find(event_target) | |
# Storing the clicked button ID in state | |
state["active_button"] = event_target | |
button_text = button.content["text"] | |
_handle_time_period(state, button_text) | |
button.content["cssClasses"] = "button-click" | |
button_max = ui.find("e13teponreio9yyz") | |
button_max.content["cssClasses"] = "" | |
ui.component_tree.updated = True | |
def _handle_time_period(state, period): | |
state["main_df_subset"] = state["main_df"] | |
if period == "5D": | |
state["main_df_subset"] = state["main_df_subset"][:5] | |
elif period == "1M": | |
state["main_df_subset"] = state["main_df_subset"][:30] | |
elif period == "3M": | |
state["main_df_subset"] = state["main_df_subset"][:90] | |
elif period == "1Y": | |
state["main_df_subset"] = state["main_df_subset"][:360] | |
elif period == "5Y": | |
state["main_df_subset"] = state["main_df_subset"][:1800] | |
elif period == "Max": | |
# No need to slice, already has the full data | |
pass | |
update_scatter_chart(state) | |
def update_scatter_chart(state): | |
fig = px.line(state["main_df_subset"], x="Date", y="Open", height=400) | |
df1 = state["main_df_subset"] | |
df2 = state["another_df"] | |
df2 = df2.head(len(df1)) | |
# Add a new column to each dataframe to identify the source | |
df1["Source"] = "Main_DF" | |
df2["Source"] = "Another_DF" | |
# Concatenate the dataframes | |
combined_df = pd.concat([df1, df2]) | |
state["main_df_subset"] = combined_df | |
# Plot the lines | |
fig = make_subplots(specs=[[{"secondary_y": True}]]) | |
# Add traces for the primary y-axis (Main_DF) | |
fig.add_trace( | |
go.Scatter(x=df1["Date"], y=df1["Open"], name=state["symbol"], mode='lines'), | |
secondary_y=False, | |
) | |
# Add traces for the secondary y-axis (Another_DF) | |
fig.add_trace( | |
go.Scatter(x=df2["Date"], y=df2["Open"], name="S&P 500", mode='lines'), | |
secondary_y=True, | |
) | |
# Set axis titles | |
fig.update_yaxes(title_text=f"{state['symbol']} Stock Price", secondary_y=False) | |
fig.update_yaxes(title_text="S&P 500", secondary_y=True) | |
# Update layout | |
fig.update_layout(height=550, title_text=f"{state['symbol']} Stock vs the S&P 500", title_x = 0.5, title_y = 0.9, legend=dict( | |
orientation='h', | |
yanchor='top', | |
y=-0.2, # Adjust this value as needed | |
xanchor='center', | |
x=0.5 | |
)) | |
state["scatter_chart"] = fig | |
def update_bar_graph(state): | |
fig = px.line(state["main_df_subset"], x="Date", y="Open", height=400) | |
df = state["income_statement_df"] | |
selected_metrics = ["Total Revenue", "Net Income", "Operating Income"] | |
df_filtered = df.loc[selected_metrics] | |
# Transpose the DataFrame for easier plotting | |
df_transposed = df_filtered.transpose().reset_index() | |
df_transposed = df_transposed.melt( | |
id_vars=["index"], var_name="Metric", value_name="Value" | |
) | |
# Create the bar graph using Plotly Express | |
fig = px.bar( | |
df_transposed, | |
x="index", | |
y="Value", | |
color="Metric", | |
barmode="group", | |
labels={"index": "", "Value": ""}, | |
title="Summary of Quarterly Income Statement", | |
) | |
fig.update_layout( | |
legend=dict(orientation="h", yanchor="top", y=-0.2, xanchor="center", x=0.5) | |
) | |
state["bar_graph"] = fig |