{"spec_id":"line-timeseries-rolling","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nline-timeseries-rolling: Time Series with Rolling Average Overlay\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 84/100 | Updated: 2026-05-13\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import *\n\n\nLetsPlot.setup_html()\n\n# Data: Simulated daily sensor temperature readings\nnp.random.seed(42)\nn_days = 180\ndates = pd.date_range(\"2024-01-01\", periods=n_days, freq=\"D\")\n\n# Generate realistic temperature data with seasonal trend and noise\nbase_temp = 15  # Base temperature in Celsius\nseasonal = 10 * np.sin(2 * np.pi * np.arange(n_days) / 365)  # Seasonal variation\nnoise = np.random.normal(0, 3, n_days)  # Daily fluctuations\ntrend = np.linspace(0, 2, n_days)  # Slight warming trend\nvalues = base_temp + seasonal + noise + trend\n\n# Calculate 14-day rolling average\nrolling_window = 14\nrolling_avg = pd.Series(values).rolling(window=rolling_window, center=False).mean()\n\n# Create DataFrame for plotting\ndf = pd.DataFrame({\"date\": dates, \"value\": values, \"rolling_avg\": rolling_avg})\n\n# Reshape data for lets-plot (long format for legend)\ndf_raw = df[[\"date\", \"value\"]].copy()\ndf_raw[\"series\"] = \"Raw Data\"\ndf_raw = df_raw.rename(columns={\"value\": \"temp\"})\n\ndf_rolling = df[[\"date\", \"rolling_avg\"]].dropna().copy()\ndf_rolling[\"series\"] = f\"{rolling_window}-Day Rolling Avg\"\ndf_rolling = df_rolling.rename(columns={\"rolling_avg\": \"temp\"})\n\ndf_long = pd.concat([df_raw, df_rolling], ignore_index=True)\n\n# Plot\nplot = (\n    ggplot(df_long, aes(x=\"date\", y=\"temp\", color=\"series\"))\n    + geom_line(aes(alpha=\"series\", size=\"series\"))\n    + labs(x=\"Date\", y=\"Temperature (°C)\", title=\"line-timeseries-rolling · letsplot · pyplots.ai\")\n    + scale_color_manual(name=\"\", values=[\"#306998\", \"#FFD43B\"])\n    + scale_alpha_manual(name=\"\", values=[0.5, 1.0])\n    + scale_size_manual(name=\"\", values=[0.8, 2.5])\n    + theme_minimal()\n    + theme(\n        plot_title=element_text(size=24),\n        axis_title=element_text(size=20),\n        axis_text=element_text(size=16),\n        legend_text=element_text(size=16),\n        legend_position=\"top\",\n        panel_grid_major=element_line(color=\"#CCCCCC\", size=0.5),\n    )\n    + ggsize(1600, 900)\n)\n\n# Save PNG (scale 3x for 4800 × 2700 px)\nggsave(plot, \"plot.png\", path=\".\", scale=3)\n\n# Save HTML for interactive version\nggsave(plot, \"plot.html\", path=\".\")\n"}