import%20marimo%0A%0A__generated_with%20%3D%20%220.14.17%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Interactive%20Finance%20Dashboard%0A%0A%20%20%20%20%20%20%20%20Welcome%20to%20your%20personal%20finance%20analysis%20dashboard!%20This%20tool%20provides%3A%0A%20%20%20%20%20%20%20%20-%20Real-time%20stock%20data%20visualization%20powered%20by%20Alpha%20Vantage%0A%20%20%20%20%20%20%20%20-%20Interactive%20charts%20and%20analysis%20with%20live%20market%20data%0A%20%20%20%20%20%20%20%20-%20Performance%20metrics%20calculations%20using%20actual%20prices%0A%20%20%20%20%20%20%20%20-%20Modern%20web%20interface%20with%20automatic%20data%20updates%0A%0A%20%20%20%20%20%20%20%20*Data%20is%20updated%20daily%20after%20market%20close%20via%20automated%20GitHub%20Actions.*%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20altair%20as%20alt%0A%20%20%20%20from%20datetime%20import%20datetime%2C%20timedelta%0A%20%20%20%20import%20json%0A%0A%20%20%20%20%23%20Enable%20Altair%20to%20render%20in%20marimo%0A%20%20%20%20alt.data_transformers.enable('json')%0A%20%20%20%20return%20alt%2C%20datetime%2C%20json%2C%20mo%2C%20np%2C%20pd%2C%20timedelta%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Stock%20Selection%20and%20Analysis%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20%23%20Create%20interactive%20widgets%20for%20stock%20selection%0A%20%20%20%20stock_input%20%3D%20mo.ui.text(%0A%20%20%20%20%20%20%20%20value%3D%22AAPL%2CGOOGL%2CMSFT%2CAMZN%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Stock%20Tickers%20(comma-separated)%3A%22%2C%0A%20%20%20%20%20%20%20%20placeholder%3D%22Enter%20stock%20symbols%20like%20AAPL%2CGOOGL%2CMSFT%22%0A%20%20%20%20)%0A%0A%20%20%20%20period_selector%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%221M%22%2C%20%223M%22%2C%20%226M%22%2C%20%221Y%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%223M%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Time%20Period%3A%22%0A%20%20%20%20)%0A%0A%20%20%20%20chart_type%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22line%22%2C%20%22area%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22line%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Chart%20Type%3A%22%0A%20%20%20%20)%0A%0A%20%20%20%20mo.hstack(%5Bstock_input%2C%20period_selector%2C%20chart_type%5D%2C%20justify%3D%22space-around%22)%0A%20%20%20%20return%20chart_type%2C%20period_selector%2C%20stock_input%0A%0A%0A%40app.cell%0Adef%20_(datetime%2C%20json%2C%20pd%2C%20period_selector%2C%20stock_input%2C%20timedelta)%3A%0A%20%20%20%20%23%20Load%20real%20financial%20data%20from%20JSON%20files%0A%20%20%20%20def%20load_real_data(tickers_str%2C%20period)%3A%0A%20%20%20%20%20%20%20%20tickers%20%3D%20%5Bticker.strip().upper()%20for%20ticker%20in%20tickers_str.split('%2C')%5D%0A%20%20%20%20%20%20%20%20if%20not%20tickers%20or%20tickers%20%3D%3D%20%5B''%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20pd.DataFrame()%2C%20%5B%5D%2C%20None%0A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Try%20to%20load%20real%20data%20from%20JSON%20files%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20For%20WebAssembly%2C%20use%20pyodide's%20fetch%20capability%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Try%20pyodide%20fetch%20first%20(WebAssembly%20environment)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20import%20pyodide_js%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20pyodide.http%20import%20open_url%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stock_data_response%20%3D%20open_url('.%2Fdata%2Fstock_data.json')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stock_data%20%3D%20json.loads(stock_data_response)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp_response%20%3D%20open_url('.%2Fdata%2Flast_updated.json')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp_info%20%3D%20json.loads(timestamp_response)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20(ImportError%2C%20Exception)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Fallback%20to%20direct%20file%20access%20for%20local%20testing%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20open('data%2Fstock_data.json'%2C%20'r')%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stock_data%20%3D%20json.load(f)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20open('data%2Flast_updated.json'%2C%20'r')%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp_info%20%3D%20json.load(f)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timestamp_info%20%3D%20%7B'last_updated'%3A%20'Unknown'%2C%20'market_date'%3A%20'Unknown'%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20DataFrame%20and%20filter%0A%20%20%20%20%20%20%20%20%20%20%20%20df%20%3D%20pd.DataFrame(stock_data)%0A%20%20%20%20%20%20%20%20%20%20%20%20df%5B'Date'%5D%20%3D%20pd.to_datetime(df%5B'Date'%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Filter%20for%20requested%20tickers%0A%20%20%20%20%20%20%20%20%20%20%20%20available_tickers%20%3D%20%5Bt%20for%20t%20in%20tickers%20if%20t%20in%20df%5B'Ticker'%5D.unique()%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20available_tickers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20pd.DataFrame()%2C%20%5B%5D%2C%20%7B'error'%3A%20'No%20data%20available%20for%20requested%20tickers'%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20df_filtered%20%3D%20df%5Bdf%5B'Ticker'%5D.isin(available_tickers)%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Apply%20period%20filter%0A%20%20%20%20%20%20%20%20%20%20%20%20period_days%20%3D%20%7B%221M%22%3A%2030%2C%20%223M%22%3A%2090%2C%20%226M%22%3A%20180%2C%20%221Y%22%3A%20365%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20days%20%3D%20period_days.get(period%2C%2090)%0A%20%20%20%20%20%20%20%20%20%20%20%20cutoff_date%20%3D%20datetime.now()%20-%20timedelta(days%3Ddays)%0A%20%20%20%20%20%20%20%20%20%20%20%20df_filtered%20%3D%20df_filtered%5Bdf_filtered%5B'Date'%5D%20%3E%3D%20cutoff_date%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20df_filtered%2C%20available_tickers%2C%20timestamp_info%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Error%20loading%20real%20data%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20pd.DataFrame()%2C%20%5B%5D%2C%20%7B'error'%3A%20f'Failed%20to%20load%20data%3A%20%7Bstr(e)%7D'%7D%0A%0A%0A%20%20%20%20stock_data%2C%20selected_tickers%2C%20data_info%20%3D%20load_real_data(stock_input.value%2C%20period_selector.value)%0A%20%20%20%20return%20data_info%2C%20selected_tickers%2C%20stock_data%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(data_info%2C%20mo%2C%20selected_tickers%2C%20stock_data)%3A%0A%20%20%20%20if%20stock_data.empty%3A%0A%20%20%20%20%20%20%20%20if%20data_info%20and%20'error'%20in%20data_info%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%E2%9D%8C%20**Error%3A**%20%7Bdata_info%5B'error'%5D%7D%5Cn%5Cn*Please%20ensure%20data%20has%20been%20collected%20via%20GitHub%20Actions.*%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%E2%9A%A0%EF%B8%8F%20**No%20data%20available.**%20Please%20check%20your%20ticker%20symbols%20and%20try%20again.%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20last_updated%20%3D%20data_info.get('last_updated'%2C%20'Unknown')%0A%20%20%20%20%20%20%20%20market_date%20%3D%20data_info.get('market_date'%2C%20'Unknown')%0A%20%20%20%20%20%20%20%20real_data_ratio%20%3D%20data_info.get('real_data_ratio'%2C%20'Unknown')%0A%20%20%20%20%20%20%20%20mo.md(f%22%F0%9F%93%88%20**Real%20market%20data%20loaded%20for%3A**%20%7B'%2C%20'.join(selected_tickers)%7D%5Cn%5Cn**Last%20updated%3A**%20%7Blast_updated%7D%20%7C%20**Market%20date%3A**%20%7Bmarket_date%7D%20%7C%20**Real%20data%3A**%20%7Breal_data_ratio%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Interactive%20Price%20Charts%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20chart_type%2C%20mo%2C%20selected_tickers%2C%20stock_data)%3A%0A%20%20%20%20%23%20Create%20interactive%20price%20chart%0A%20%20%20%20def%20create_price_chart(data%2C%20tickers%2C%20chart_style%3D%22line%22)%3A%0A%20%20%20%20%20%20%20%20if%20data.empty%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(%22No%20data%20to%20display%22)%0A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20the%20chart%20based%20on%20selected%20style%0A%20%20%20%20%20%20%20%20%20%20%20%20base_chart%20%3D%20alt.Chart(data)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20chart_style%20%3D%3D%20%22line%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chart%20%3D%20base_chart.mark_line(point%3DTrue%2C%20strokeWidth%3D2).encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X('Date%3AT'%2C%20title%3D'Date')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y('Price%3AQ'%2C%20title%3D'Price%20(%24)')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color('Ticker%3AN'%2C%20title%3D'Stock'%2C%20scale%3Dalt.Scale(scheme%3D'category10'))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B'Date%3AT'%2C%20'Ticker%3AN'%2C%20'Price%3AQ'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%20%20%23%20area%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chart%20%3D%20base_chart.mark_area(opacity%3D0.7).encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X('Date%3AT'%2C%20title%3D'Date')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y('Price%3AQ'%2C%20title%3D'Price%20(%24)')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color('Ticker%3AN'%2C%20title%3D'Stock'%2C%20scale%3Dalt.Scale(scheme%3D'category10'))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B'Date%3AT'%2C%20'Ticker%3AN'%2C%20'Price%3AQ'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20chart%20%3D%20chart.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%3D700%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20height%3D400%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3Df%22Stock%20Price%20Analysis%20-%20%7B'%2C%20'.join(tickers)%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20).resolve_scale(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3D'independent'%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.ui.altair_chart(chart)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(f%22Error%20creating%20chart%3A%20%7Bstr(e)%7D%22)%0A%0A%20%20%20%20price_chart%20%3D%20create_price_chart(stock_data%2C%20selected_tickers%2C%20chart_type.value)%0A%20%20%20%20price_chart%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Performance%20Metrics%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np%2C%20pd%2C%20selected_tickers%2C%20stock_data)%3A%0A%20%20%20%20%23%20Calculate%20and%20display%20performance%20metrics%0A%20%20%20%20def%20calculate_metrics(data%2C%20tickers)%3A%0A%20%20%20%20%20%20%20%20if%20data.empty%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(%22No%20data%20available%20for%20metrics%20calculation%22)%0A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20metrics%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20ticker%20in%20tickers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ticker_data%20%3D%20data%5Bdata%5B'Ticker'%5D%20%3D%3D%20ticker%5D.sort_values('Date')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(ticker_data)%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current_price%20%3D%20ticker_data%5B'Price'%5D.iloc%5B-1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20first_price%20%3D%20ticker_data%5B'Price'%5D.iloc%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20returns%20%3D%20((current_price%20-%20first_price)%20%2F%20first_price)%20*%20100%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20volatility%20(standard%20deviation%20of%20daily%20returns)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20daily_returns%20%3D%20ticker_data%5B'Price'%5D.pct_change().dropna()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20volatility%20%3D%20daily_returns.std()%20*%20np.sqrt(252)%20*%20100%20%20%23%20Annualized%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20some%20additional%20metrics%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_price%20%3D%20ticker_data%5B'Price'%5D.max()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_price%20%3D%20ticker_data%5B'Price'%5D.min()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20price_range%20%3D%20((max_price%20-%20min_price)%20%2F%20min_price)%20*%20100%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20metrics.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Ticker'%3A%20ticker%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Current%20Price'%3A%20f%22%24%7Bcurrent_price%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Total%20Return'%3A%20f%22%7Breturns%3A%2B.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Volatility'%3A%20f%22%7Bvolatility%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Price%20Range'%3A%20f%22%7Bprice_range%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'High'%3A%20f%22%24%7Bmax_price%3A.2f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'Low'%3A%20f%22%24%7Bmin_price%3A.2f%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20metrics%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(%22Unable%20to%20calculate%20metrics%20for%20the%20selected%20stocks%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20metrics_df%20%3D%20pd.DataFrame(metrics)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.ui.table(metrics_df%2C%20selection%3DNone)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(f%22Error%20calculating%20metrics%3A%20%7Bstr(e)%7D%22)%0A%0A%20%20%20%20metrics_table%20%3D%20calculate_metrics(stock_data%2C%20selected_tickers)%0A%20%20%20%20metrics_table%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Market%20Overview%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alt%2C%20json%2C%20mo%2C%20pd)%3A%0A%20%20%20%20%23%20Market%20overview%20with%20real%20S%26P%20500%20data%0A%20%20%20%20def%20get_market_overview()%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Try%20to%20load%20real%20market%20overview%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Try%20pyodide%20fetch%20first%20(WebAssembly%20environment)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20pyodide.http%20import%20open_url%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20market_data_response%20%3D%20open_url('.%2Fdata%2Fmarket_overview.json')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20market_data%20%3D%20json.loads(market_data_response)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20(ImportError%2C%20Exception)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Fallback%20to%20direct%20file%20access%20for%20local%20testing%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20open('data%2Fmarket_overview.json'%2C%20'r')%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20market_data%20%3D%20json.load(f)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current_price%20%3D%20market_data%5B'current_price'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20change%20%3D%20market_data%5B'change'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20change_pct%20%3D%20market_data%5B'change_pct'%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20chart%20data%20from%20real%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df%20%3D%20pd.DataFrame(market_data%5B'data'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df%5B'Date'%5D%20%3D%20pd.to_datetime(df%5B'Date'%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data_source_note%20%3D%20%22Real%20Market%20Data%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title_suffix%20%3D%20%22(Real%20Data)%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22No%20market%20overview%20data%20available%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(f%22%E2%9D%8C%20**Market%20overview%20unavailable%3A**%20No%20real%20data%20found.%5Cn%5Cn*Please%20ensure%20GitHub%20Actions%20has%20run%20to%20collect%20Alpha%20Vantage%20data.*%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20trend%20chart%0A%20%20%20%20%20%20%20%20%20%20%20%20color%20%3D%20'%232E8B57'%20if%20change%20%3E%3D%200%20else%20'%23DC143C'%20%20%23%20Green%20for%20up%2C%20red%20for%20down%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20trend_chart%20%3D%20alt.Chart(df).mark_line(color%3Dcolor%2C%20strokeWidth%3D3).encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X('Date%3AT'%2C%20title%3D'Date')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y('Price%3AQ'%2C%20title%3D'S%26P%20500%20Index'%2C%20scale%3Dalt.Scale(zero%3DFalse))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B'Date%3AT'%2C%20'Price%3AQ'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20).properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%3D600%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20height%3D250%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3Df%22S%26P%20500%20Index%20-%20Last%2030%20Days%20%7Btitle_suffix%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20area%20fill%0A%20%20%20%20%20%20%20%20%20%20%20%20area_chart%20%3D%20alt.Chart(df).mark_area(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3D0.3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dcolor%0A%20%20%20%20%20%20%20%20%20%20%20%20).encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X('Date%3AT')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y('Price%3AQ'%2C%20scale%3Dalt.Scale(zero%3DFalse))%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20combined_chart%20%3D%20(area_chart%20%2B%20trend_chart).resolve_scale(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3D'shared'%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Display%20metrics%20and%20chart%0A%20%20%20%20%20%20%20%20%20%20%20%20direction%20%3D%20%22%F0%9F%93%88%22%20if%20change%20%3E%3D%200%20else%20%22%F0%9F%93%89%22%0A%20%20%20%20%20%20%20%20%20%20%20%20status_color%20%3D%20%22green%22%20if%20change%20%3E%3D%200%20else%20%22red%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20overview_text%20%3D%20f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%23%23%20S%26P%20500%20Index%20Overview%20(%7Bdata_source_note%7D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20**Current%20Level%3A**%20%7Bcurrent_price%3A.2f%7D%20%7Bdirection%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20**30-Day%20Change%3A**%20%7Bchange%3A%2B.2f%7D%20points%20(%7Bchange_pct%3A%2B.2f%7D%25)%0A%20%20%20%20%20%20%20%20%20%20%20%20**Status%3A**%20%3Cspan%20style%3D%22color%3A%20%7Bstatus_color%7D%22%3E%7B'Bullish'%20if%20change%20%3E%3D%200%20else%20'Bearish'%7D%3C%2Fspan%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20*Data%20Source%3A%20%7Bdata_source_note%7D*%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(overview_text)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.altair_chart(combined_chart)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mo.md(f%22Error%20generating%20market%20overview%3A%20%7Bstr(e)%7D%22)%0A%0A%20%20%20%20market_overview%20%3D%20get_market_overview()%0A%20%20%20%20market_overview%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20---%0A%0A%20%20%20%20%20%20%20%20%23%23%20About%20This%20Dashboard%0A%0A%20%20%20%20%20%20%20%20**Key%20Features%3A**%0A%20%20%20%20%20%20%20%20-%20**Reactive%20Interface**%20-%20Changes%20automatically%20update%20all%20dependent%20components%0A%20%20%20%20%20%20%20%20-%20**Interactive%20Charts**%20-%20Built%20with%20Altair%2FVega-Lite%20for%20smooth%20interactions%0A%20%20%20%20%20%20%20%20-%20**WebAssembly%20Powered**%20-%20Runs%20entirely%20in%20your%20browser%0A%20%20%20%20%20%20%20%20-%20**Real%20Data**%20-%20Scheduled%20using%20Github%20Actions%20calling%20on%20Alpha%20Vantage%20API%0A%0A%20%20%20%20%20%20%20%20**Technology%20Stack%3A**%0A%20%20%20%20%20%20%20%20-%20**marimo**%20-%20Reactive%20Python%20notebooks%0A%20%20%20%20%20%20%20%20-%20**Altair**%20-%20Declarative%20statistical%20visualization%0A%20%20%20%20%20%20%20%20-%20**Pandas**%20-%20Data%20manipulation%20and%20analysis%0A%20%20%20%20%20%20%20%20-%20**WebAssembly**%20-%20High-performance%20browser%20execution%0A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
b20dcffe2ebafaa1004dcbce9cd79e2ec69b5b448943afb2bd70d41d5b565abf