{"spec_id":"acf-pacf","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nacf-pacf: Autocorrelation and Partial Autocorrelation (ACF/PACF) Plot\nLibrary: letsplot 4.10.1 | Python 3.13.13\nQuality: 89/100 | Updated: 2026-06-10\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    facet_wrap,\n    geom_hline,\n    geom_point,\n    geom_ribbon,\n    geom_segment,\n    ggplot,\n    ggsave,\n    ggsize,\n    labs,\n    scale_color_manual,\n    scale_x_continuous,\n    theme,\n    theme_minimal,\n)\nfrom statsmodels.tsa.stattools import acf, pacf\n\n\nLetsPlot.setup_html()\n\n# Theme tokens — Imprint palette\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\nGRID = \"rgba(26,26,23,0.15)\" if THEME == \"light\" else \"rgba(240,239,232,0.15)\"\nBRAND = \"#009E73\"  # Imprint position 1 — always first series\n\n# Data — monthly airline-style passenger series with trend and seasonality\nnp.random.seed(42)\nn = 200\nt = np.arange(n)\nseries = 100 + 0.05 * t + 10 * np.sin(2 * np.pi * t / 12) + np.random.normal(0, 2, n)\n\nn_lags = 36\nacf_vals = acf(series, nlags=n_lags)\npacf_vals = pacf(series, nlags=n_lags)\nci = 1.96 / np.sqrt(n)\n\nacf_df = pd.DataFrame({\"lag\": np.arange(n_lags + 1), \"value\": acf_vals, \"zero\": 0.0, \"panel\": \"ACF\"})\nacf_df[\"sig\"] = (acf_df[\"lag\"] > 0) & (acf_df[\"value\"].abs() > ci)\n\npacf_df = pd.DataFrame({\"lag\": np.arange(1, n_lags + 1), \"value\": pacf_vals[1:], \"zero\": 0.0, \"panel\": \"PACF\"})\npacf_df[\"sig\"] = pacf_df[\"value\"].abs() > ci\n\ndf = pd.concat([acf_df, pacf_df], ignore_index=True)\ndf[\"label\"] = df[\"sig\"].map({True: \"Significant\", False: \"Non-significant\"})\n\n# CI band columns — semi-transparent shaded confidence zone behind the stems\ndf[\"ci_ymin\"] = -ci\ndf[\"ci_ymax\"] = ci\n\n# Separate datasets for visual hierarchy — significant stems are drawn thicker\nsig_df = df[df[\"sig\"]].copy()\nnonsig_df = df[~df[\"sig\"]].copy()\n\ncolor_order = [\"Significant\", \"Non-significant\"]\ncolor_values = [BRAND, INK_MUTED]\n\n# Plot — faceted ACF / PACF panels; theme_minimal() as lets-plot built-in base preset\nplot = (\n    ggplot(df, aes(x=\"lag\", y=\"value\"))\n    + geom_ribbon(aes(x=\"lag\", ymin=\"ci_ymin\", ymax=\"ci_ymax\"), fill=INK_SOFT, alpha=0.1)\n    + geom_hline(yintercept=0, color=INK_SOFT, size=0.5)\n    + geom_hline(yintercept=ci, color=INK_MUTED, size=0.7, linetype=\"dashed\")\n    + geom_hline(yintercept=-ci, color=INK_MUTED, size=0.7, linetype=\"dashed\")\n    + geom_segment(aes(x=\"lag\", y=\"zero\", xend=\"lag\", yend=\"value\", color=\"label\"), data=nonsig_df, size=0.8)\n    + geom_segment(aes(x=\"lag\", y=\"zero\", xend=\"lag\", yend=\"value\", color=\"label\"), data=sig_df, size=2.0)\n    + geom_point(aes(x=\"lag\", y=\"value\", color=\"label\"), data=nonsig_df, size=1.5)\n    + geom_point(aes(x=\"lag\", y=\"value\", color=\"label\"), data=sig_df, size=3.5)\n    + scale_color_manual(values=color_values, limits=color_order, name=\"\")\n    + scale_x_continuous(breaks=list(range(0, n_lags + 1, 6)))\n    + facet_wrap(\"panel\", ncol=1, scales=\"free_y\")\n    + labs(x=\"Lag\", y=\"Correlation\", title=\"acf-pacf · python · letsplot · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_border=element_blank(),\n        strip_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT, size=0.5),\n        strip_text=element_text(color=INK, size=14, face=\"bold\"),\n        panel_grid_major_x=element_blank(),\n        panel_grid_minor=element_blank(),\n        panel_grid_major_y=element_line(color=GRID, size=0.5),\n        axis_title=element_text(color=INK, size=12),\n        axis_text=element_text(color=INK_SOFT, size=10),\n        axis_line=element_line(color=INK_SOFT, size=0.5),\n        plot_title=element_text(color=INK, size=16, hjust=0.5),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT, size=0.5),\n        legend_text=element_text(color=INK_SOFT, size=10),\n        legend_title=element_blank(),\n        legend_position=\"bottom\",\n    )\n    + ggsize(800, 450)\n)\n\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}