"""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