| """Chart creation utilities for the financial dashboard.""" | |
| import plotly.graph_objects as go | |
| import pandas as pd | |
| def get_dark_theme_layout(): | |
| """Get common dark theme layout settings for all charts.""" | |
| return dict( | |
| plot_bgcolor="#0d1117", | |
| paper_bgcolor="#0e1117", | |
| font=dict(color="#e6edf3", size=12, family="Arial, sans-serif"), | |
| xaxis=dict( | |
| gridcolor="#30363d", | |
| showgrid=True, | |
| zeroline=False, | |
| color="#8b949e" | |
| ), | |
| yaxis=dict( | |
| gridcolor="#30363d", | |
| showgrid=True, | |
| zeroline=False, | |
| color="#8b949e" | |
| ), | |
| legend=dict( | |
| bgcolor="rgba(13, 17, 23, 0.8)", | |
| bordercolor="#30363d", | |
| borderwidth=1, | |
| font=dict(color="#e6edf3") | |
| ), | |
| hoverlabel=dict( | |
| bgcolor="#0d1117", | |
| bordercolor="#30363d", | |
| font=dict(color="#e6edf3") | |
| ) | |
| ) | |
| def create_price_chart(df: pd.DataFrame, symbol: str, period: int) -> go.Figure: | |
| """Create price chart with SMA and EMA indicators.""" | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter( | |
| x=df.index, y=df["close"], | |
| name="Close Price", | |
| line=dict(color="#0066ff", width=2.5) | |
| )) | |
| fig.add_trace(go.Scatter( | |
| x=df.index, y=df["SMA"], | |
| name=f"SMA {period}", | |
| line=dict(color="#00d084", width=2, dash="dash") | |
| )) | |
| fig.add_trace(go.Scatter( | |
| x=df.index, y=df["EMA"], | |
| name=f"EMA {period}", | |
| line=dict(color="#ffa500", width=2, dash="dot") | |
| )) | |
| layout = get_dark_theme_layout() | |
| fig.update_layout( | |
| title=f"{symbol} - Price with Moving Averages", | |
| xaxis_title="Date", | |
| yaxis_title="Price ($)", | |
| hovermode="x unified", | |
| template="plotly_dark", | |
| height=500, | |
| margin=dict(l=0, r=0, t=40, b=0), | |
| **layout | |
| ) | |
| return fig | |
| def create_rsi_chart(df: pd.DataFrame, symbol: str) -> go.Figure: | |
| """Create RSI (Relative Strength Index) chart.""" | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter( | |
| x=df.index, y=df["RSI"], | |
| name="RSI", | |
| line=dict(color="#ff3838", width=2.5), | |
| fill="tozeroy", | |
| fillcolor="rgba(255, 56, 56, 0.15)" | |
| )) | |
| fig.add_hline(y=70, line_dash="dash", line_color="rgba(255, 165, 0, 0.6)", | |
| annotation_text="Overbought (70)") | |
| fig.add_hline(y=30, line_dash="dash", line_color="rgba(0, 208, 132, 0.6)", | |
| annotation_text="Oversold (30)") | |
| fig.add_hline(y=50, line_dash="dot", line_color="rgba(139, 148, 158, 0.3)") | |
| layout = get_dark_theme_layout() | |
| layout["yaxis"]["range"] = [0, 100] | |
| fig.update_layout( | |
| title=f"{symbol} - Relative Strength Index (RSI)", | |
| xaxis_title="Date", | |
| yaxis_title="RSI", | |
| hovermode="x unified", | |
| template="plotly_dark", | |
| height=500, | |
| margin=dict(l=0, r=0, t=40, b=0), | |
| **layout | |
| ) | |
| return fig | |
| def create_financial_chart(income_data: pd.DataFrame) -> go.Figure: | |
| """Create financial revenue and net income chart.""" | |
| fig = go.Figure() | |
| fig.add_trace(go.Bar( | |
| x=income_data['period_ending'], | |
| y=income_data['total_revenue'], | |
| name="Total Revenue", | |
| marker=dict(color='#0066ff', opacity=0.9), | |
| yaxis='y1' | |
| )) | |
| fig.add_trace(go.Bar( | |
| x=income_data['period_ending'], | |
| y=income_data['net_income'], | |
| name="Net Income", | |
| marker=dict(color='#00d084', opacity=0.9), | |
| yaxis='y1' | |
| )) | |
| layout = get_dark_theme_layout() | |
| fig.update_layout( | |
| title="Revenue & Net Income (Annual)", | |
| xaxis_title="Period", | |
| yaxis_title="Amount ($)", | |
| hovermode="x unified", | |
| template="plotly_dark", | |
| height=400, | |
| barmode='group', | |
| margin=dict(l=0, r=0, t=40, b=0), | |
| **layout | |
| ) | |
| return fig | |