{"spec_id":"line-timeseries-rolling","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nline-timeseries-rolling: Time Series with Rolling Average Overlay\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 84/100 | Updated: 2026-05-13\n\"\"\"\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Data - Daily temperature readings over 6 months with 7-day rolling average\nnp.random.seed(42)\ndates = pd.date_range(\"2024-01-01\", periods=180, freq=\"D\")\n\n# Simulate temperature with seasonal trend + noise (winter to early summer)\nday_of_year = np.arange(180)\n# Temperature rises from winter (Jan) toward summer (Jun)\nseasonal_trend = 10 + 12 * np.sin(2 * np.pi * (day_of_year - 90) / 365)\nnoise = np.random.normal(0, 3, 180)\nraw_values = seasonal_trend + noise\n\ndf = pd.DataFrame({\"date\": dates, \"value\": raw_values})\n\n# Calculate 7-day rolling average\ndf[\"rolling_avg\"] = df[\"value\"].rolling(window=7, center=True).mean()\n\n# Prepare data for layered chart with proper legend\ndf_long = pd.melt(\n    df, id_vars=[\"date\"], value_vars=[\"value\", \"rolling_avg\"], var_name=\"series\", value_name=\"temperature\"\n)\n\n# Rename series for cleaner legend\ndf_long[\"series\"] = df_long[\"series\"].map({\"value\": \"Raw Data\", \"rolling_avg\": \"7-Day Rolling Average\"})\n\n# Remove NaN values from rolling average\ndf_long = df_long.dropna()\n\n# Create chart with both lines\nchart = (\n    alt.Chart(df_long)\n    .mark_line()\n    .encode(\n        x=alt.X(\"date:T\", title=\"Date\", axis=alt.Axis(labelFontSize=18, titleFontSize=22, format=\"%b %d\")),\n        y=alt.Y(\n            \"temperature:Q\",\n            title=\"Temperature (°C)\",\n            axis=alt.Axis(labelFontSize=18, titleFontSize=22),\n            scale=alt.Scale(zero=False),\n        ),\n        color=alt.Color(\n            \"series:N\",\n            scale=alt.Scale(domain=[\"Raw Data\", \"7-Day Rolling Average\"], range=[\"#306998\", \"#FFD43B\"]),\n            legend=alt.Legend(title=\"Series\", labelFontSize=16, titleFontSize=18, orient=\"top-right\", offset=10),\n        ),\n        strokeWidth=alt.condition(alt.datum.series == \"7-Day Rolling Average\", alt.value(4), alt.value(1.5)),\n        opacity=alt.condition(alt.datum.series == \"7-Day Rolling Average\", alt.value(1.0), alt.value(0.5)),\n    )\n    .properties(\n        width=1600,\n        height=900,\n        title=alt.Title(\"line-timeseries-rolling · altair · pyplots.ai\", fontSize=28, anchor=\"middle\"),\n    )\n    .configure_axis(gridOpacity=0.3, gridDash=[4, 4])\n    .configure_view(strokeWidth=0)\n)\n\n# Save\nchart.save(\"plot.png\", scale_factor=3.0)\nchart.save(\"plot.html\")\n"}