拓端tecdat|Python面板時(shí)間序列數(shù)據(jù)預(yù)測:格蘭杰因果關(guān)系檢驗(yàn)Granger causality test
原文鏈接:http://tecdat.cn/?p=23940
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
時(shí)間序列是以固定時(shí)間區(qū)間記錄的觀察序列。本指南帶你完成在Python中分析一個(gè)給定的時(shí)間序列的特征的過程。
內(nèi)容
什么是時(shí)間序列?
如何在 Python 中導(dǎo)入時(shí)間序列?
什么是面板數(shù)據(jù)?
時(shí)間序列的可視化
時(shí)間序列中的模式
加法和乘法的時(shí)間序列
如何將一個(gè)時(shí)間序列分解成其組成部分?
平穩(wěn)的和非平穩(wěn)的時(shí)間序列
如何使一個(gè)時(shí)間序列成為平穩(wěn)的?
如何測試平穩(wěn)性?
白噪聲和平穩(wěn)序列之間的區(qū)別是什么?
如何使一個(gè)時(shí)間序列去趨勢化?
如何使時(shí)間序列去季節(jié)化?
如何檢驗(yàn)時(shí)間序列的季節(jié)性?
如何處理時(shí)間序列中的缺失值?
什么是自相關(guān)和部分自相關(guān)函數(shù)?
如何計(jì)算部分自相關(guān)函數(shù)?
滯后圖
如何估計(jì)一個(gè)時(shí)間序列的可預(yù)測性?
為什么和如何使時(shí)間序列平滑化?
如何使用格蘭杰因果檢驗(yàn)來了解一個(gè)時(shí)間序列是否有助于預(yù)測另一個(gè)時(shí)間序列?
1. 什么是時(shí)間序列?
時(shí)間序列是以固定時(shí)間區(qū)間記錄的觀察序列。
根據(jù)觀察的頻率,一個(gè)時(shí)間序列通??赡苁敲啃r(shí)、每天、每周、每月、每季度和每年。有時(shí),你也可能有以秒為單位的時(shí)間序列,比如,每分鐘的點(diǎn)擊量和用戶訪問量等等。
為什么要分析一個(gè)時(shí)間序列?
因?yàn)檫@是你對(duì)該序列進(jìn)行預(yù)測前的準(zhǔn)備步驟。
此外,時(shí)間序列預(yù)測具有巨大的商業(yè)意義,因?yàn)閷?duì)企業(yè)來說很重要的東西,如需求和銷售,網(wǎng)站的訪問量,股票價(jià)格等基本上都是時(shí)間序列數(shù)據(jù)。
那么,分析一個(gè)時(shí)間序列涉及什么呢?
時(shí)間序列分析涉及到對(duì)序列性質(zhì)的各個(gè)方面的理解,這樣你就能更好地了解創(chuàng)造有意義和準(zhǔn)確的預(yù)測。
2. 如何在Python中導(dǎo)入時(shí)間序列?
那么,如何導(dǎo)入時(shí)間序列數(shù)據(jù)呢?
時(shí)間序列的數(shù)據(jù)通常存儲(chǔ)在.csv文件或其他電子表格格式中,包含兩列:日期和測量值。
我們使用pandas包中的read_csv()來讀取時(shí)間序列數(shù)據(jù)集(一個(gè)關(guān)于藥品銷售的csv文件)作為pandas數(shù)據(jù)框。添加parse_dates=['date']參數(shù)將使日期列被解析為一個(gè)日期字段。
import pandas as pd
# 導(dǎo)入數(shù)據(jù)
df = pd.read_csv('10.csv
', parse_dates=['date'])
df.head()

數(shù)據(jù)框架時(shí)間序列
另外,你也可以把它導(dǎo)入為一個(gè)以日期為索引的pandas序列。你只需要在pd.read_csv()中指定index_col參數(shù)就可以了。
pd.read_csv('10.csv', parse_dates=['date'], index_col='date')

3. 什么是面板數(shù)據(jù)?
面板數(shù)據(jù)也是一種基于時(shí)間的數(shù)據(jù)集。
不同的是,除了時(shí)間序列之外,它還包含一個(gè)或多個(gè)在相同時(shí)間段內(nèi)測量的相關(guān)變量。
通常情況下,面板數(shù)據(jù)中存在的列包含了有助于預(yù)測Y的解釋變量,前提是這些列在未來的預(yù)測期是可用的。
下面是一個(gè)面板數(shù)據(jù)的例子。
df.head()

面板序列
4. 時(shí)間序列的可視化
讓我們用matplotlib來可視化這個(gè)序列。
# 時(shí)間序列數(shù)據(jù)源:R中的fpp pacakge。
import matplotlib.pyplot as plt
# 繪制圖表
def plot_df(df, x, y, title="", xlabel='日期', dpi=100):
plt.show()

時(shí)間序列的可視化
由于所有的值都是正數(shù),你可以在Y軸的兩邊顯示,以強(qiáng)調(diào)增長。
# 導(dǎo)入數(shù)據(jù)
x = df['date'].values
# 繪圖
fig, ax = plt.subplots(1, 1, figsize=(16,5), dpi= 120)
plt.fill(x, y1=y1, y2=-y1, alpha=0.5)

航空乘客數(shù)據(jù)--兩面序列
由于它是一個(gè)月度的時(shí)間序列,并且每年都遵循一定的重復(fù)模式,你可以在同一張圖中把每年的情況作為一個(gè)單獨(dú)的線條來繪制。這讓你可以并排比較每年的模式。
時(shí)間序列的季節(jié)圖
# 導(dǎo)入數(shù)據(jù)
df.reset_index(inplace=True)
# 準(zhǔn)備好數(shù)據(jù)
years = df['year'].unique()
# 預(yù)備顏色
np.random.choice(list(mpl.color), len(year),
# 繪制圖表
plt.text(df.loc[df.year==y, :].shape[0]-.9]
plt.gca().set(xlim=(-0.3, 11)
plt.title("藥品銷售時(shí)間序列的季節(jié)圖", fontsize=20)

藥品銷售的季節(jié)性圖譜
每年2月,藥品銷售量急劇下降,3月再次上升,4月再次下降,如此反復(fù)。顯然,這種模式每年都會(huì)在某一年內(nèi)重復(fù)出現(xiàn)。
然而,隨著時(shí)間的推移,藥品銷售量總體上有所增加。你可以用一個(gè)漂亮的年度圖表很好地展示這一趨勢以及它每年的變化情況。同樣地,你也可以做一個(gè)按月排列的boxplot來顯示每月的分布情況。
逐月(季節(jié)性)和逐年(趨勢)分布的箱線圖
你可以按季節(jié)性對(duì)數(shù)據(jù)進(jìn)行分組,看看數(shù)值在某年或某月是如何分布的,以及它在不同時(shí)期的對(duì)比情況。
# 導(dǎo)入數(shù)據(jù)
df.reset_index(inplace=True)
# 準(zhǔn)備好數(shù)據(jù)
df['年'] = [d.year for d in df.date]
df['月'] = [d.strftime('%b') for d in df.date]
# 繪制圖表
sns.boxplot(x='年', y='值', data=df, ax=axes[0])
sns.boxplot(x='月', y='值', data=df.loc[~df.year.isin([1991, 2008]), :] )

按年和按月排列的箱線圖
箱線圖使年度和月份的分布變得明顯。另外,在按月排列的圖表中,12月和1月的藥品銷售量明顯較高,這可歸因于假日折扣季節(jié)。
到目前為止,我們已經(jīng)看到了識(shí)別模式的相似性?,F(xiàn)在,如何找出與通常模式的任何偏差?
5. 時(shí)間序列中的模式
任何時(shí)間序列都可以被分成以下幾個(gè)部分。?基礎(chǔ)水平+趨勢+季節(jié)性+誤差
當(dāng)在時(shí)間序列中觀察到有一個(gè)增加或減少的斜率時(shí),就可以觀察到趨勢。而季節(jié)性是指由于季節(jié)性因素,在定期區(qū)間之間觀察到明顯的重復(fù)模式。這可能是由于一年中的哪個(gè)月,哪個(gè)月的哪一天,工作日或甚至一天中的哪個(gè)時(shí)間。
然而,并非所有時(shí)間序列都必須有趨勢和/或季節(jié)性。一個(gè)時(shí)間序列可能沒有一個(gè)明顯的趨勢,但有一個(gè)季節(jié)性。反之,也可以是真實(shí)的。
因此,一個(gè)時(shí)間序列可以被想象為趨勢、季節(jié)性和誤差項(xiàng)的組合。
fig, axes = plt.subplots(1,3, figsize=(20,4), dpi=100)
pd.read_csv.plot( legend=False, ax=axes[2])

時(shí)間序列中的模式
另一個(gè)需要考慮的方面是周期性行為。當(dāng)序列中的上升和下降模式不發(fā)生在固定的基于日歷的時(shí)間區(qū)間內(nèi)時(shí),就會(huì)發(fā)生這種情況。應(yīng)注意不要將 "周期性 "效應(yīng)與 "季節(jié)性 "效應(yīng)混淆。
那么,如何區(qū)分 "周期性 "和 "季節(jié)性 "模式?
如果這些模式不是基于固定的日歷頻率,那么它就是周期性的。因?yàn)?,與季節(jié)性不同,周期性效應(yīng)通常受到商業(yè)和其他社會(huì)經(jīng)濟(jì)因素的影響。
6. 加法和乘法的時(shí)間序列
根據(jù)趨勢和季節(jié)性的性質(zhì),一個(gè)時(shí)間序列可以被建模為加法或乘法,其中,序列中的每個(gè)觀測值可以表示為各組成部分的和或積。
加法時(shí)間序列:值=基礎(chǔ)+趨勢+季節(jié)性+誤差
?
乘法時(shí)間序列:值=基礎(chǔ)x趨勢x季節(jié)性x誤差
7. 如何將一個(gè)時(shí)間序列分解成其組成部分?
你可以對(duì)一個(gè)時(shí)間序列進(jìn)行經(jīng)典的分解,將該序列視為基數(shù)、趨勢、季節(jié)性指數(shù)和殘差的加法或乘法組合。
statsmodels中的 seasonal_decompose 可以方便地實(shí)現(xiàn)這一點(diǎn)。
# 乘法分解
decompose(df['value'], model='multiplicative')
# 加法分解
decompose(df['value'], model='additive')
# 繪圖
result_mul.plot().suptitle( fontsize=22)

加法和乘法分解
設(shè)置extrapolate_trend='freq'可以看到序列開始時(shí)趨勢和殘差中的任何缺失值。
如果你仔細(xì)看一下加法分解的殘差,它有一些模式殘留。然而,乘法分解看起來相當(dāng)隨機(jī)。因此,理想情況下,對(duì)于這個(gè)特定的序列,乘法分解應(yīng)該是首選。
趨勢、季節(jié)性和殘差成分的數(shù)字輸出存儲(chǔ)在result_mul輸出本身。讓我們把它們提取出來,放在一個(gè)數(shù)據(jù)框中。
# 提取成分----
# 實(shí)際值=(季節(jié)性*趨勢*殘差)的乘積
constructed.columns = ['seas', 'trendance', 'resid', 'actual_values'] 。
constructed.head()
如果你檢查一下,seas、trend和resid列的乘積應(yīng)該正好等于actual_values。
8. 平穩(wěn)和非平穩(wěn)的時(shí)間序列
平穩(wěn)性是時(shí)間序列的一個(gè)屬性。一個(gè)平穩(wěn)的序列是指該序列的值不是時(shí)間的函數(shù)。
也就是說,序列的統(tǒng)計(jì)屬性,如平均數(shù)、方差和自相關(guān),隨著時(shí)間的推移是不變的。序列的自相關(guān)只不過是序列與它以前的值的相關(guān)性,更多的是關(guān)于這一點(diǎn)。
一個(gè)平穩(wěn)的時(shí)間序列也沒有季節(jié)性影響。
那么,如何識(shí)別一個(gè)序列是否是平穩(wěn)的?讓我們繪制一些例子來說明。

平穩(wěn)和非平穩(wěn)的時(shí)間序列
那么,為什么平穩(wěn)的序列很重要呢?
我稍后會(huì)說到這個(gè)問題,但要知道,通過應(yīng)用適當(dāng)?shù)霓D(zhuǎn)換,幾乎可以使任何時(shí)間序列成為平穩(wěn)的。大多數(shù)統(tǒng)計(jì)預(yù)測方法都被設(shè)計(jì)為在平穩(wěn)的時(shí)間序列上工作。預(yù)測過程的第一步通常是做一些轉(zhuǎn)換,把非平穩(wěn)序列轉(zhuǎn)換成平穩(wěn)的。
9. 如何使一個(gè)時(shí)間序列平穩(wěn)?
你可以通過以下方式使序列平穩(wěn)
對(duì)序列進(jìn)行差分(一次或多次
取序列的對(duì)數(shù)
取序列的第n次根
上述方法的組合
使序列平穩(wěn)的最常見和最方便的方法是對(duì)數(shù)列至少進(jìn)行一次差分,直到它成為近似平穩(wěn)的。
那么,什么是差分?
如果Y_t是時(shí)間't'的值,那么Y的第一個(gè)差值=Yt-Yt-1。更簡單地說,序列只不過是用當(dāng)前值減去下一個(gè)值。
如果第一次差分不能使一個(gè)序列平穩(wěn),你可以進(jìn)行第二次差分。以此類推。
例如,考慮以下序列。[1, 5, 2, 12, 20]
第一次差分可以得到。[5-1, 2-5, 12-2, 20-12] = [4, -3, 10, 8]
二次差分得出。[-3-4, -10-3, 8-10] = [-7, -13, -2]
9. 為什么在預(yù)測前要使非穩(wěn)態(tài)序列成為穩(wěn)態(tài)?
預(yù)測一個(gè)平穩(wěn)的序列是相對(duì)容易的,而且預(yù)測結(jié)果也更可靠。
一個(gè)重要的原因是,自回歸預(yù)測模型本質(zhì)上是線性回歸模型,利用序列本身的滯后期作為預(yù)測因子。
我們知道,如果預(yù)測因子(X變量)不相互關(guān)聯(lián),線性回歸效果最好。因此,序列的平穩(wěn)化解決了這個(gè)問題,因?yàn)樗巳魏纬掷m(xù)的自相關(guān),從而使預(yù)測模型中的預(yù)測因子(序列的滯后)幾乎是獨(dú)立的。
現(xiàn)在我們已經(jīng)確定了序列平穩(wěn)化的重要性,那么你如何檢查一個(gè)給定的序列是否是平穩(wěn)的?
10. 如何檢驗(yàn)平穩(wěn)性?
一個(gè)序列的平穩(wěn)性可以通過觀察序列的圖表來確定,就像我們之前做的那樣。
另一種方法是將序列分成2個(gè)或更多的連續(xù)部分,并計(jì)算平均數(shù)、方差和自相關(guān)等匯總統(tǒng)計(jì)數(shù)據(jù)。如果統(tǒng)計(jì)數(shù)字有很大差異,那么這個(gè)序列就不可能是平穩(wěn)的。
然而,你需要一種方法來定量地確定一個(gè)給定的序列是否是平穩(wěn)的。這可以通過稱為 "單位根測試 "的統(tǒng)計(jì)測試來完成。這方面有多種變化,測試檢查一個(gè)時(shí)間序列是否是非穩(wěn)態(tài)的并擁有單位根。
單位根測試有多種實(shí)現(xiàn)方式,例如。
Augmented Dickey Fuller 檢驗(yàn)(ADH Test)
Kwiatkowski-Phillips-Schmidt-Shin – KPSS 檢驗(yàn)(趨勢平穩(wěn))
Philips Perron 檢驗(yàn)(PP 檢驗(yàn))
最常用的是ADF檢驗(yàn),無效假設(shè)是時(shí)間序列擁有單位根,并且是非平穩(wěn)的。所以,如果ADH檢驗(yàn)中的P值小于顯著性水平(0.05),你就拒絕無效假設(shè)。
另一方面,KPSS檢驗(yàn)是用來檢驗(yàn)趨勢平穩(wěn)性的??占僭O(shè)和P值的解釋與ADH檢驗(yàn)正好相反。下面的代碼使用python中的statsmodels包來實(shí)現(xiàn)這兩個(gè)檢驗(yàn)。
# ADF測試
result = adfuller(df.value.values, autolag='AIC')
# KPSS測試
result = kpss(df.value.values, regression='c')
print('\nKPSS Statistic: %f' % result[0])

?

11. 白噪聲和平穩(wěn)數(shù)列之間有什么區(qū)別?
與平穩(wěn)序列一樣,白噪聲也不是時(shí)間的函數(shù),即它的平均值和方差不隨時(shí)間變化。但不同的是,白噪聲是完全隨機(jī)的,平均值為0。
在白噪聲中,沒有任何模式。如果你把調(diào)頻收音機(jī)中的聲音信號(hào)看作是一個(gè)時(shí)間序列,你在各頻道之間聽到的空白聲音就是白噪聲。
在數(shù)學(xué)上,一個(gè)平均數(shù)為0的完全隨機(jī)的數(shù)字序列就是白噪聲。
np.random.randn(1000)

隨機(jī)白噪聲
12. 如何對(duì)時(shí)間序列進(jìn)行去趨勢處理?
去時(shí)間序列的趨勢是指從一個(gè)時(shí)間序列中去除趨勢成分。但如何提取趨勢呢?有多種方法。
從時(shí)間序列中去除最佳擬合線。最佳擬合線可以從以時(shí)間步驟為預(yù)測因素的線性回歸模型中獲得。對(duì)于更復(fù)雜的趨勢,你可能想在模型中使用二次項(xiàng)(x^2)。
去除我們前面看到的從時(shí)間序列分解中得到的趨勢成分。
去除平均數(shù)
應(yīng)用像Baxter-King濾波器或Hodrick-Prescott濾波器這樣的濾波器來去除移動(dòng)平均趨勢線或周期成分。
讓我們來實(shí)現(xiàn)前兩種方法。
# 使用scipy。減去最佳擬合線
signal.detrend(df.value.values)
plt.plot(detrended)

通過減去最小二乘法來解讀時(shí)間序列的趨勢
# 使用statmodels。減去趨勢成分。
decompose(df['value'], model='multiplicative',
detrended = df.value.value - trend
plt.plot(detrended)

通過減去趨勢成分進(jìn)行去勢
13. 如何對(duì)一個(gè)時(shí)間序列進(jìn)行去季節(jié)化?
有多種方法可以使時(shí)間序列去季候性化。下面是幾個(gè)例子。
- 1.取一個(gè)以季節(jié)性窗口為長度的移動(dòng)平均線。這將在這個(gè)過程中使序列變得平滑。
- 2.序列的季節(jié)性差異(用當(dāng)前值減去前一季的值)。
- 3.用從STL分解得到的季節(jié)性指數(shù)除以該序列。
如果除以季節(jié)性指數(shù)效果不好,可以嘗試取序列的對(duì)數(shù),然后進(jìn)行去季節(jié)性處理。之后你可以通過取指數(shù)來恢復(fù)到原來的規(guī)模。
# 時(shí)間序列分解
seasonal_decompose(df['value'], model='multiplicative'')
# 去季節(jié)化
df. value.values / result_mul.seasonal
# 繪圖
plt.plot(deseason)
對(duì)時(shí)間序列進(jìn)行反季節(jié)處理
14. 如何測試一個(gè)時(shí)間序列的季節(jié)性?
常見的方法是繪制序列圖,檢查平穩(wěn)時(shí)間區(qū)間內(nèi)的可重復(fù)模式。所以,季節(jié)性的類型是由時(shí)鐘或日歷決定的。
一天中的小時(shí)
月的一天
每周
月度
年
然而,如果你想對(duì)季節(jié)性有一個(gè)更明確的檢查,可以使用自相關(guān)函數(shù)(ACF)圖。更多關(guān)于ACF的內(nèi)容將在接下來的章節(jié)中介紹。但是,當(dāng)有強(qiáng)烈的季節(jié)性模式時(shí),ACF圖通常會(huì)顯示出在季節(jié)性窗口的倍數(shù)上有明確的重復(fù)峰值。
例如,藥品銷售時(shí)間序列是一個(gè)月度序列,每年都有重復(fù)的模式。因此,你可以看到在第12、24、36......行的尖峰。
在真實(shí)的數(shù)據(jù)集中,這種強(qiáng)烈的模式很難被注意到,并可能被任何噪音所扭曲,所以你需要仔細(xì)觀察。
# 畫圖
correlation_plot(df.value.tolist())

自相關(guān)圖
另外,如果你想進(jìn)行統(tǒng)計(jì)測試,CHTest可以確定是否需要進(jìn)行季節(jié)性差分以使序列平穩(wěn)化。
15. 如何處理時(shí)間序列中的缺失值?
有時(shí),你的時(shí)間序列會(huì)有缺失的日期/時(shí)間。這意味著,這些時(shí)期的數(shù)據(jù)沒有被捕獲或無法獲得。在這種情況下,你可以用零來填補(bǔ)這些時(shí)期。
其次,當(dāng)涉及到時(shí)間序列時(shí),你通常不應(yīng)該用序列的平均值來替換缺失值,特別是在序列不是平穩(wěn)的情況下。你可以做的是是向前填充前一個(gè)值。
然而,根據(jù)序列的性質(zhì),你要在得出結(jié)論之前嘗試多種方法。一些有效的替代歸因法的方法是。
后向填充
線性插值
二次插值
最近鄰平均
季節(jié)性差值平均
為了衡量歸因性能,我手動(dòng)引入時(shí)間序列的缺失值,用上述方法進(jìn)行歸因,然后衡量歸因與實(shí)際值的平均平方誤差。
# 生成數(shù)據(jù)集
prcPupdate({'xtick.bottom' : False})
## 1. Actual -------------------------------
df_or.plot(style=".-")
## 2. 正向填充--------------------------
df_ffill = df.ffill()
## 3. 后向填充-------------------------
df_bfill = df.bfill()
## 4. 線性插值 ------------------
df['rownum'] = np.arange(df.shape[0])
## 5. 立體插值--------------------
f2 = interp1d(df_um'], df_nona['v kind='cubic')
# 內(nèi)插法參考。
## 6. n "過去最近的鄰居的平均值 ------
knnmean(df.value.values, 8)
np.round(meansquarerr('), 2)
## 7. 季節(jié)性平均值 ----------------------------
"""
計(jì)算相應(yīng)季節(jié)性時(shí)期的平均值
ts: 時(shí)間序列的一維數(shù)組式
n: 時(shí)間序列的季節(jié)性窗口長度
"""
out = np.cpy(ts)
for i, val in merate(ts):
if np.isnan(val):
ts_seas = ts[i-1::-n] # 只有以前的季節(jié)
如果np.isan(np.naean(ts_seas))。
ts_seas = np.concenate([ts[i-1::-n], ts[i::n]]) # 以前和以后的
out[i] = np.nanan(ts_seas) * lr
seasonal_mean(df.value, n=12, lr=1.25)
缺失值處理方法
你也可以考慮以下方法,這取決于你希望推斷的準(zhǔn)確程度。
如果你有解釋變量,使用預(yù)測模型,如隨機(jī)森林或k-Nearest Neighbors來預(yù)測。
如果你有足夠的過去觀測值,就預(yù)測缺失的值。
如果你有足夠的未來觀測值,就對(duì)缺失值進(jìn)行反向預(yù)測
預(yù)測以前周期的對(duì)應(yīng)值。
16. 什么是自相關(guān)和偏自相關(guān)函數(shù)?
自相關(guān)只是一個(gè)序列與它自己的滯后期的相關(guān)關(guān)系。如果一個(gè)序列是顯著的自相關(guān),那就意味著,該序列以前的值(滯后)可能有助于預(yù)測當(dāng)前的值。
偏自相關(guān)也傳達(dá)了類似的信息,但它傳達(dá)的是一個(gè)序列與其滯后期的純相關(guān),排除了中間滯后期的相關(guān)貢獻(xiàn)。
# 計(jì)算ACF和PACF直到50個(gè)滯后期
acf_50 = acf(value, nlags=50)
pacf_50 = pacf(value, nlags=50)
# 繪制圖表
fig, axes = plt.subplots(1,2,figsize=(16,3))

ACF和PACF
17. 如何計(jì)算偏自相關(guān)函數(shù)?
那么,如何計(jì)算偏自相關(guān)?
一個(gè)序列的滯后期(k)的偏自相關(guān)是該滯后期在Y的自回歸方程中的系數(shù)。Y的自回歸方程只不過是以其自身的滯后期為預(yù)測因素的Y的線性回歸。
例如,如果Y_t是當(dāng)前序列,Y_t-1是Y的滯后1,那么滯后3的偏自相關(guān)(Y_t-3)是Y_t-3的系數(shù)$alpha_3$,在以下方程中。
自回歸方程
18. 滯后圖
滯后圖是一個(gè)時(shí)間序列與自身滯后的散點(diǎn)圖。它通常是用來檢查自相關(guān)的。如果在序列中存在任何像你下面看到的模式,該序列是自相關(guān)的。如果沒有這樣的模式,該序列可能是隨機(jī)白噪聲。
在下面關(guān)于太陽黑子區(qū)域時(shí)間序列的例子中,隨著n_lag的增加,圖變得越來越分散。
# #導(dǎo)入
a10 = pd.read_csv('10.csv')
# 繪圖
for i, ax in enumerate(axes.flatten()[:4]):
fig.suptitle('藥物銷售的滯后圖', y=1.05)
藥物銷售滯后曲線圖
滯后圖 太陽黑子
19. 如何估計(jì)一個(gè)時(shí)間序列的可預(yù)測性?
一個(gè)時(shí)間序列的規(guī)律性和可重復(fù)性越強(qiáng),就越容易進(jìn)行預(yù)測。近似熵 "可以用來量化一個(gè)時(shí)間序列中波動(dòng)的規(guī)律性和不可預(yù)測性。
近似熵越高,預(yù)測就越困難。
另一個(gè)更好的替代方法是 "樣本熵"。
樣本熵與近似熵相似,但在估計(jì)復(fù)雜性方面更加一致,即使是較小的時(shí)間序列。例如,一個(gè)數(shù)據(jù)點(diǎn)較少的隨機(jī)時(shí)間序列的 "近似熵 "可能比一個(gè)較 "規(guī)則 "的時(shí)間序列低,而一個(gè)較長的隨機(jī)時(shí)間序列的 "近似熵 "會(huì)更高。
樣本熵很好地處理了這個(gè)問題。請(qǐng)看下面的演示。
def AEn(U, m, r):
""計(jì)算Aproximate entropy""
def _maxdit(x_i, x_j):
returnmax([abs(u- va) for ua, va in zp(x_i, x_j)])
def _phi(m):
x = [[U[j]for in range(i, i ] for i in range(N - m + 1)]
C = [len([1 for x_jn x if _maist(x_i, x_j) <= r]) / (N - m + 1.0) for xi in x] 。
返回 (N - m +.0)**(-1) * sump.log(C))
N = len(U)
def Samp:
""計(jì)算樣本熵"""
maxstx_i, x_j):
retur max([abs(ua - va) fo ua, vain zip(_i x_j)])
phi(m)
x = [[j]or j i ane(i, i ?m - 1 + 1] for iin age(N - m + 1)]
C= [len([1 for j in rane(len(x)) if i != j and _mist(x[i, xj]) <= r]) for i in rane(ln(x)) ]
= en()
20. 為什么和如何對(duì)時(shí)間序列進(jìn)行平滑處理?
對(duì)一個(gè)時(shí)間序列進(jìn)行平滑處理可能在以下方面有用。
減少信號(hào)中噪聲的影響,得到一個(gè)經(jīng)過噪聲過濾的序列的近似值。
平滑化后的序列可以作為解釋原始序列本身的一個(gè)特征。
更好地觀察基本趨勢
那么,如何對(duì)一個(gè)序列進(jìn)行平滑處理?讓我們討論一下以下方法。
取一個(gè)移動(dòng)平均線
做一個(gè) LOESS 平滑(局部回歸)。
做一個(gè)LOWESS平滑(局部加權(quán)回歸)。
移動(dòng)平均數(shù)只不過是定義寬度的滾動(dòng)窗口的平均值。但你必須合理地選擇窗口寬度,因?yàn)榇蟮拇翱诔叽鐣?huì)使序列過度平滑。例如,窗口尺寸等于季節(jié)性持續(xù)時(shí)間(例如:12個(gè)月的序列),將有效地消除季節(jié)性效應(yīng)。
LOESS是 "LOcalized regrESSion "的簡稱,它在每個(gè)點(diǎn)的局部附近進(jìn)行多次回歸。它是在statsmodels軟件包中實(shí)現(xiàn)的,你可以用frac參數(shù)來控制平滑的程度,該參數(shù)指定了附近的數(shù)據(jù)點(diǎn)的百分比,應(yīng)該被視為適合回歸模型。
# 導(dǎo)入
pd.read_csv('ele.csv', parse_dates=['date'], index_col='date')
# 1. 移動(dòng)平均數(shù)
dma = df_rg.vale.r.man()
# 2. 平滑(5%和15%)
pd.DtaFame(lowess(dfoig.alu, np.ane(len(d_origale)), fac=0.05)
# 繪圖
fig, axes = plt.ubplos(4,1, figsiz=(7, 7, sharex=rue, dp=120)
df_ori['aue'].pot(ax=axes0], color='k')
平滑化時(shí)間序列
如何使用格蘭杰因果測試來了解一個(gè)時(shí)間序列是否有助于預(yù)測另一個(gè)時(shí)間序列?
格蘭杰因果檢驗(yàn)是用來確定一個(gè)時(shí)間序列是否有助于預(yù)測另一個(gè)時(shí)間序列的。
格蘭杰因果關(guān)系測試是如何工作的?
它是基于這樣的想法:如果X導(dǎo)致Y,那么基于Y的前值和X的前值對(duì)Y的預(yù)測應(yīng)該優(yōu)于僅基于Y的前值的預(yù)測。
因此,理解格蘭杰因果關(guān)系不應(yīng)該被用來測試Y的滯后期是否導(dǎo)致Y。
無效假設(shè)是:第二列中的序列不會(huì)導(dǎo)致第一列中的序列的格蘭杰。如果P值小于顯著性水平(0.05),那么你就拒絕無效假設(shè),并得出結(jié)論:上述X的滯后期確實(shí)是有用的。
第二個(gè)參數(shù)maxlag說的是在測試中應(yīng)該包括多少個(gè)Y的滯后期。
df = pd.rea_csv('a10.csv', parse_dates=['date'])
df['moth'] = df.date.dt.nth
gragecaslitess(df[['alue', 'moh']], maxag2)
在上述情況下,所有檢驗(yàn)的P值都是零。因此,"月 "數(shù)據(jù)確實(shí)可以用來預(yù)測航空乘客。
最受歡迎的見解
1.在python中使用lstm和pytorch進(jìn)行時(shí)間序列預(yù)測
2.python中利用長短期記憶模型lstm進(jìn)行時(shí)間序列預(yù)測分析
3.使用r語言進(jìn)行時(shí)間序列(arima,指數(shù)平滑)分析
4.r語言多元copula-garch-模型時(shí)間序列預(yù)測
5.r語言copulas和金融時(shí)間序列案例
6.使用r語言隨機(jī)波動(dòng)模型sv處理時(shí)間序列中的隨機(jī)波動(dòng)
7.r語言時(shí)間序列tar閾值自回歸模型
8.r語言k-shape時(shí)間序列聚類方法對(duì)股票價(jià)格時(shí)間序列聚類
9.python3用arima模型進(jìn)行時(shí)間序列預(yù)測