基于python的數據分解-趨勢-季節性-波動變化

系列文章目錄


前言

時間序列數據的分解,一般分為趨勢項,季節變化項和隨機波動項。可以基于加法或者乘法模型。季節變化呈現出周期變化,因此也叫季節效應(周期)。

一、數據分解步驟

(1)估計時間序列的長期趨勢,一種是通過數據平滑方式進行估計;一種是通過模擬回歸方程進行估計;
(2)去掉時間序列數據的長期趨勢。 加法模型則減去,乘法模型即除去;
(3)去掉長期趨勢的時間序列數據,估計時間序列的季節變化;
(4)剩下的即為隨機波動項;

二、使用步驟

1.數據分解方法

import os
#移動平均法
os.chdir("D:/Pythonmatlab學習資料/") 
#改變工作目錄
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
import numpy as npfrom statsmodels.tsa.seasonal import seasonal_decomposetraveller_df = pd.read_csv("NZTravellersDestination.csv", usecols=['Date','China'], parse_dates=['Date'], index_col='Date')deco_muti = seasonal_decompose(traveller_df, model='mutiplicative', extrapolate_trend='freq')new,(ax1,ax2,ax3,ax4) = plt.subplots(4, 1, sharex=True, figsize=(12,8), dpi=150)
ax1.plot(deco_muti.observed, color='r')
ax1.set_ylabel(ylabel="Observed", fontsize=15)
ax2.plot(deco_muti.trend, color='b')
ax2.set_ylabel(ylabel="Trend", fontsize=15)
ax3.plot(deco_muti.seasonal, color='g')
ax3.set_ylabel(ylabel="Seasonal", fontsize=15)
ax4.plot(deco_muti.resid, color='b')
ax4.set_ylabel(ylabel="Resid", fontsize=15)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
plt.tight_layout(); plt.savefig(fname='fig/4_1.png')deco_value = pd.concat([deco_muti.trend, deco_muti.seasonal, deco_muti.resid, deco_muti.observed], axis=1)
deco_value.columns = ['trend', 'season', 'resid', 'actual_values']
deco_value.head()
##%

2.分解項計算方法


import statsmodels.formula.api as smf
#表示線性擬合計算趨勢
df = np.loadtxt("elec_prod.txt")
t = np.arange(1,397)df_t = np.vstack((df,t)).swapaxes(0,1).astype(int)
model_data = pd.DataFrame(df_t,columns=['df','t'])results_f = smf.ols('df~t',data=model_data).fit()
print(results_f.summary().tables[1])
print('std = ',np.std(results_f.resid))fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(model_data, linestyle="-", color='red')
ax.plot(t,1.423e+05 + 499.2576*t, color='blue')
ax.set_ylim((130000, 410000))
ax.set_ylabel(ylabel="Electricity", fontsize=17)
ax.set_xlabel(xlabel="Time", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_2.png')##%表示曲線擬合計算趨勢
df = pd.read_excel('ningxiaGDP.xlsx').rename(columns={'t':'t1'})
df = pd.DataFrame(df['t1'].values**2,columns=['t2']).join(df)results_f = smf.ols('gdp~ 0 + t1+ t2', data=df).fit()
print(results_f.summary().tables[1])
print('std = ', np.std(results_f.resid))from scipy.optimize import curve_fitdf = pd.read_excel('ningxiaGDP.xlsx')
t = df['t'].values
gdp = df['gdp'].valuesdef func(x, b,c):return b*x + c*x**2popt, pcov = curve_fit(func,t,gdp,p0=(1.0,1.0))
print(popt)b = popt[0]
c = popt[1]
residuals = gdp - func(t, b, c)
print(np.std(residuals))t = np.arange(1996, 2016)fig = plt.figure(figsize=(12,4),dpi=150)
ax = fig.add_subplot(111)
ax.scatter(y=gdp, x=t, color='blue')
ax.plot(t, results_f.predict())
ax.xaxis.set_major_locator(ticker.MultipleLocator(3))
ax.set_ylabel(ylabel="寧夏地區生產總值",fontsize=17)
ax.set_xlabel(xlabel="時間", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_3.png')##%表示5期移動平均擬合,移動平均法計算趨勢
from statsmodels.tsa.seasonal import seasonal_decompose
nile_ar = np.loadtxt("Nile.txt"); Date = np.arange(1871, 1971)
nile_df = pd.DataFrame({"Date":Date, "Nile":nile_ar})
nile_df.index = nile_df["Date"]nile_df['5-period Moving Avg'] = nile_df['Nile'].rolling(5).mean()fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
nile_df['Nile'].plot(ax=ax, color='b', marker="o", linestyle='--')
nile_df['5-period Moving Avg'].plot(ax=ax, color='r')
ax.legend(loc=1,labels=['Index','Moving average'], fontsize=13)
ax.set_ylabel(ylabel="Index", fontsize=17)
ax.set_xlabel(xlabel="Time", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_4.png')#%%二次移動平均法計算趨勢
gdp_df = pd.read_csv('JDGDP.csv')gdp_df['Moving_Avg_1'] = gdp_df['JDGDP'].rolling(4).mean()
gdp_df['Moving_Avg_2'] = gdp_df['Moving_Avg_1'].rolling(4).mean()gdp_df['at'] = 2*gdp_df['Moving_Avg_1'] - gdp_df['Moving_Avg_2']fig = plt.figure(figsize=(12,4),dpi=150)
ax = fig.add_subplot(111)
gdp_df['JDGDP'].plot(ax=ax, color='b',marker="o",linestyle='--')
gdp_df['at'].plot(ax=ax, color='r')
ax.xaxis.set_major_locator(ticker.MultipleLocator(3))
ax.legend(loc=2,labels=['季度GDP','兩次移動平均'], fontsize=13)
ax.set_ylabel(ylabel="中國季度國內生產總值", fontsize=17)
ax.set_xlabel(xlabel="時間", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_5.png')##%指數平滑法,考慮近期變化對現在影響較大,而遠期的變化對現在影響要小一些
from statsmodels.tsa.api import SimpleExpSmoothing
df = np.loadtxt("retail_price_index.txt")
index = pd.date_range(start="1990", end="2021", freq="A")
retail_df = pd.Series(df, index)fit1 = SimpleExpSmoothing(retail_df, initialization_method="heuristic").fit(smoothing_level=0.2, optimized=False)
fcast1 = fit1.forecast(3).rename(r"α=0.2")fit2 = SimpleExpSmoothing(retail_df, initialization_method="heuristic").fit(smoothing_level=0.6, optimized=False)
fcast2 = fit2.forecast(3).rename(r"α=0.6")fit3 = SimpleExpSmoothing(retail_df, initialization_method="estimated").fit()
fcast3 = fit3.forecast(3).rename(r"α=
"% fit3.model.params["smoothing_level"] )
fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(retail_df, marker="o", color="black")
ax.plot(fit1.fittedvalues, marker="8", color="green",linestyle="-.")
(line1,) = ax.plot(fcast1, marker="8", color="green",linestyle="-.")
ax.plot(fit2.fittedvalues, marker="s", color="red",linestyle=":")
(line2,) = ax.plot(fcast2, marker="s", color="red",linestyle=":")
ax.plot(fit3.fittedvalues, marker="p", color="blue",linestyle="--")
(line3,) = ax.plot(fcast3, marker="p", color="blue",linestyle="--")
plt.legend([line1, line2, line3], [fcast1.name, fcast2.name, fcast3.name], fontsize=15)
ax.set_ylabel(ylabel="商品零售價格指數", fontsize=17)
ax.set_xlabel(xlabel="時間", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_6.png')##%對于含有季節變動部分的時間序列為Holt-Winters指數平滑法
from statsmodels.tsa.api import ExponentialSmoothing
df = np.loadtxt("QGDP.txt")
index = pd.date_range(start="2000", end="2021", freq="Q")
QGDP_df = pd.Series(df, index)fit = ExponentialSmoothing(QGDP_df, seasonal_periods=4, trend="add", seasonal="mul",initialization_method="estimated").fit()
simulations = fit.simulate(8, repetitions=1000, error="mul")fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(QGDP_df, marker="o", color="black")
ax.plot(fit.fittedvalues, marker="o", color="blue", linestyle=":")
ax.plot(simulations, marker="o", color="blue", linestyle=":")
ax.set_ylabel(ylabel="國內季度生產總值累計值", fontsize=17)
ax.set_xlabel(xlabel="時間",fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_8.png')##%季節效應,季節指數,用簡單平均法計算的周期內各時期季節性影響的相對數。
df = np.loadtxt("tempdub.txt")
index = pd.date_range(start="1964", end="1976", freq="M")
tempdub_df = pd.Series(df, index)fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(tempdub_df, marker="o", color="blue")
ax.set_ylabel(ylabel="杜比克市月平均氣溫",fontsize=17)
ax.set_xlabel(xlabel="時間",fontsize=17)
plt.xticks(fontsize=15);plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_9.png')t = np.arange(1,13)
SI = np.array([0.36,0.45,0.7,1.00,1.26,1.46,1.55,1.50,1.32,1.10,0.79,0.51])
Season_index = pd.Series(SI, t)fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(Season_index, marker="o", color="blue")
ax.set_ylabel(ylabel="季節指數",fontsize=17)
ax.set_xlabel(xlabel="時間",fontsize=17)
plt.xticks(fontsize=15);plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/4_10.png')

出圖

分解效果在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述參考書籍
基于Python的時間序列分析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41038.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

儀器校準后出了校準證書后,是不是就代表儀器合格了?

儀器校準是一門技術活,對于從事生產制造的企業而言,是不可或缺的一環,因為這與產品質量密切相關。所以,了解儀器校準的相關知識也變得尤為重要。 在拿到校準證書后,是不是說明儀器合格了?相信不少企業品管人…

指針回顧.

指針的主要作用:提供一種間接訪問數據的方法 1.地址:區分不同內存空間的編號 2.指針:指針就是地址,地址就是指針 3.指針變量:存放指針的變量稱為指針變量,簡稱為指針 1.指針的定義 int *p NULL; int *q NULL; char *p NULL; double *p NUL…

PCDN技術如何提高內容分發效率?(貳)

PCDN技術通過以下方式提高內容分發效率: 1.利用用戶設備作為分發節點:與傳統的 CDN技術主要依賴中心化服務器不同, PCDN技術利用用戶的設備作為內容分發的節點。當用戶下載內容時,他們的設備也會成為內容分發的一部分,將已下載的內容傳遞給其…

第34集《大乘起信論》

好,請大家打開《講義》七十六頁, 子三、釋雙行 前面是把大乘的止跟大乘的觀,各別的說明,這個是針對初學的菩薩,應該是這樣修學的;這個地方是告訴我們的目標,應該使令自己在操作上最好是能夠止…

STL--求交集,并集,差集(set_intersection,set_union,set_difference)

set_intersection(重要) 求兩個有序的序列的交集. 函數聲明如下: template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_intersection(InputIterator1 _First1, //容器1開頭InputIterator1 _Last1, //容器2結尾(不包含)Inp…

jenkins配置gitee源碼地址連接不上

報錯信息如下&#xff1a; 網上找了好多都沒說具體原因&#xff0c;最后還是看jenkins控制臺輸出日志發現&#xff1a; ssh命令執行失敗&#xff08;git環境有問題&#xff0c;可能插件沒安裝成功等其他問題&#xff09; 后面發現是jenkins配置git的地方git安裝路徑錯了。新手…

加入新數據預測,基于黏菌優化算法SMA優化SVM支持向量機回歸預測(多輸入單輸出)

加入新數據預測&#xff0c;基于黏菌優化算法SMA優化SVM支持向量機回歸預測&#xff08;多輸入單輸出&#xff09; 1.數據均為Excel數據&#xff0c;直接替換數據就可以運行程序。 2.所有程序都經過驗證&#xff0c;保證程序可以運行。 3.具有良好的編程習慣&#xff0c;程序…

cmake find_package 使用筆記

目錄 1 find_package2 config mode2.1 搜索的文件名2.2 搜索路徑 3 module mode3.1 搜索的文件名3.2 搜索路徑 參考 1 find_package 這是官方文檔 下面是學習總結&#xff1a; 首先是find_package的作用是什么&#xff1f;引入預編譯的庫。 find_package有兩種模式&#xff1a…

error executing init.py No module name “imp“ ida

在某論壇下了個IDA&#xff0c;打開報錯No module name “imp”&#xff0c;這是由于高版本python已經移除了imp&#xff0c;新版使用import importlib。 1、打開文件D:\IDA_Pro_7.7\python\3\ida_idaapi.py 2、替換import imp 為 import importlib。 3、替換IDAPython_LoadPr…

【LInux】從動態庫的加載深入理解頁表機制

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

【MindSpore學習打卡】應用實踐-自然語言處理-基于RNN的情感分類:使用MindSpore實現IMDB影評分類

情感分類是自然語言處理&#xff08;NLP&#xff09;中的一個經典任務&#xff0c;廣泛應用于社交媒體分析、市場調研和客戶反饋等領域。本篇博客將帶領大家使用MindSpore框架&#xff0c;基于RNN&#xff08;循環神經網絡&#xff09;實現一個情感分類模型。我們將詳細介紹數據…

X86和ARM架構的服務器 的區別

X86和ARM架構的服務器各有其優缺點,并適用于不同的應用場景。 一、X86架構服務器的優缺點及應用場景: 優點: 1. 易于獲取和成本較低:X86服務器在市場上品牌和型號眾多,價格相對較低,適合中小型企業。 2. 處理能力強大:X86服務器通常具有強大的處理器性能,支持多核心…

CLIP-EBC:通過增強的逐塊分類,CLIP能夠準確計數

摘要 https://arxiv.org/pdf/2403.09281v1 CLIP&#xff08;Contrastive Language-Image Pretraining&#xff0c;對比語言-圖像預訓練&#xff09;模型在識別問題中表現出了卓越的性能&#xff0c;如零樣本圖像分類和對象檢測。然而&#xff0c;由于其固有的挑戰——即將計數…

Nettyの參數優化簡單RPC框架實現

本篇介紹Netty調優&#xff0c;在上篇聊天室的案例中進行改造&#xff0c;手寫一個簡單的RPC實現。 1、超時時間參數 CONNECT_TIMEOUT_MILLIS 是Netty的超時時間參數&#xff0c;屬于客戶端SocketChannel的參數&#xff0c;客戶端連接時如果一定時間沒有連接上&#xff0c;就會…

Spring Cloud 是什么?(Spring Cloud 組件介紹)

什么是 Spring Cloud&#xff1f; Spring Cloud 是微服務系統架構的一站式解決方案&#xff0c;是各個微服務架構落地技術的集合體&#xff0c;讓架構師、 開發者在使用微服務理念構建應用系統的時候&#xff0c; 面對各個環節的問題都可以找到相應的組件來處理&#xff0c;比…

二叉樹的遍歷算法:前序、中序與后序遍歷

在數據結構與算法中&#xff0c;二叉樹的遍歷是基礎且重要的操作之一&#xff0c;它允許我們按照某種順序訪問樹中的每個節點。常見的二叉樹遍歷方式有前序遍歷&#xff08;Preorder Traversal&#xff09;、中序遍歷&#xff08;Inorder Traversal&#xff09;和后序遍歷&…

React 19 競態問題解決

競態問題/競態條件 指的是&#xff0c;當我們在交互過程中&#xff0c;由于各種原因導致同一個接口短時間之內連續發送請求&#xff0c;后發送的請求有可能先得到請求結果&#xff0c;從而導致數據渲染出現預期之外的錯誤。 因為防止重復執行可以有效的解決競態問題&#xff0…

聊天廣場(Vue+WebSocket+SpringBoot)

由于心血來潮想要做個聊天室項目 &#xff0c;但是仔細找了一下相關教程&#xff0c;卻發現這么多的WebSocket教程里面&#xff0c;很多都沒有介紹詳細&#xff0c;代碼都有所殘缺&#xff0c;所以這次帶來一個比較完整得使用WebSocket的項目。 目錄 一、效果展示 二、準備工…

html+css+js圖片手動輪播

源代碼在界面圖片后面 輪播演示用的幾張圖片是Bing上的&#xff0c;直接用的幾張圖片的URL&#xff0c;誰加載可能需要等一下&#xff0c;現實中替換成自己的圖片即可 關注一下點個贊吧&#x1f604; 謝謝大佬 界面圖片 源代碼 <!DOCTYPE html> <html lang&quo…

內存對齊宏ALIGN的理解

內存對齊宏ALIGN的理解 在Android Camera HAL代碼中經常看到ALIGN這個宏&#xff0c;主要用來進行內存對齊&#xff0c;下面是v4l2_wrapper.cpp中ALIGN的一些定義 //v4l2_wrapper.cpp中內存分配進行對其的操作和定義#define ALIGN( num, to ) (((num) (to-1)) & (~(to-1)…