Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
最近我們被客戶要求撰寫關(guān)于時(shí)間序列的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
時(shí)間序列是以固定時(shí)間區(qū)間記錄的觀察序列。本指南帶你完成在Python中分析一個(gè)給定的時(shí)間序列的特征的過(guò)程。
內(nèi)容
1. 什么是時(shí)間序列?
時(shí)間序列是以固定時(shí)間區(qū)間記錄的觀察序列。
根據(jù)觀察的頻率,一個(gè)時(shí)間序列通常可能是每小時(shí)、每天、每周、每月、每季度和每年。有時(shí),你也可能有以秒為單位的時(shí)間序列,比如,每分鐘的點(diǎn)擊量和用戶訪問(wèn)量等等。
為什么要分析一個(gè)時(shí)間序列?
因?yàn)檫@是你對(duì)該序列進(jìn)行預(yù)測(cè)前的準(zhǔn)備步驟。
此外,時(shí)間序列預(yù)測(cè)具有巨大的商業(yè)意義,因?yàn)閷?duì)企業(yè)來(lái)說(shuō)很重要的東西,如需求和銷售,網(wǎng)站的訪問(wèn)量,股票價(jià)格等基本上都是時(shí)間序列數(shù)據(jù)。
那么,分析一個(gè)時(shí)間序列涉及什么呢?
時(shí)間序列分析涉及到對(duì)序列性質(zhì)的各個(gè)方面的理解,這樣你就能更好地了解創(chuàng)造有意義和準(zhǔn)確的預(yù)測(cè)。
2. 如何在Python中導(dǎo)入時(shí)間序列?
那么,如何導(dǎo)入時(shí)間序列數(shù)據(jù)呢?
時(shí)間序列的數(shù)據(jù)通常存儲(chǔ)在.csv文件或其他電子表格格式中,包含兩列:日期和測(cè)量值。
我們使用pandas包中的read_csv()來(lái)讀取時(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)測(cè)量的相關(guān)變量。
通常情況下,面板數(shù)據(jù)中存在的列包含了有助于預(yù)測(cè)Y的解釋變量,前提是這些列在未來(lái)的預(yù)測(cè)期是可用的。
下面是一個(gè)面板數(shù)據(jù)的例子。
df.head()面板序列
4. 時(shí)間序列的可視化
讓我們用matplotlib來(lái)可視化這個(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)增長(zhǎng)。
# 導(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ú)的線條來(lái)繪制。這讓你可以并排比較每年的模式。
時(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è)漂亮的年度圖表很好地展示這一趨勢(shì)以及它每年的變化情況。同樣地,你也可以做一個(gè)按月排列的boxplot來(lái)顯示每月的分布情況。
逐月(季節(jié)性)和逐年(趨勢(shì))分布的箱線圖
你可以按季節(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í)別模式的相似性。現(xiàn)在,如何找出與通常模式的任何偏差?
5. 時(shí)間序列中的模式
任何時(shí)間序列都可以被分成以下幾個(gè)部分。?基礎(chǔ)水平+趨勢(shì)+季節(jié)性+誤差
當(dāng)在時(shí)間序列中觀察到有一個(gè)增加或減少的斜率時(shí),就可以觀察到趨勢(shì)。而季節(jié)性是指由于季節(jié)性因素,在定期區(qū)間之間觀察到明顯的重復(fù)模式。這可能是由于一年中的哪個(gè)月,哪個(gè)月的哪一天,工作日或甚至一天中的哪個(gè)時(shí)間。
然而,并非所有時(shí)間序列都必須有趨勢(shì)和/或季節(jié)性。一個(gè)時(shí)間序列可能沒(méi)有一個(gè)明顯的趨勢(shì),但有一個(gè)季節(jié)性。反之,也可以是真實(shí)的。
因此,一個(gè)時(shí)間序列可以被想象為趨勢(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)?#xff0c;與季節(jié)性不同,周期性效應(yīng)通常受到商業(yè)和其他社會(huì)經(jīng)濟(jì)因素的影響。
6. 加法和乘法的時(shí)間序列
根據(jù)趨勢(shì)和季節(jié)性的性質(zhì),一個(gè)時(shí)間序列可以被建模為加法或乘法,其中,序列中的每個(gè)觀測(cè)值可以表示為各組成部分的和或積。
加法時(shí)間序列:值=基礎(chǔ)+趨勢(shì)+季節(jié)性+誤差
?
乘法時(shí)間序列:值=基礎(chǔ)x趨勢(shì)x季節(jié)性x誤差
7. 如何將一個(gè)時(shí)間序列分解成其組成部分?
你可以對(duì)一個(gè)時(shí)間序列進(jìn)行經(jīng)典的分解,將該序列視為基數(shù)、趨勢(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í)趨勢(shì)和殘差中的任何缺失值。
如果你仔細(xì)看一下加法分解的殘差,它有一些模式殘留。然而,乘法分解看起來(lái)相當(dāng)隨機(jī)。因此,理想情況下,對(duì)于這個(gè)特定的序列,乘法分解應(yīng)該是首選。
趨勢(shì)、季節(jié)性和殘差成分的數(shù)字輸出存儲(chǔ)在result_mul輸出本身。讓我們把它們提取出來(lái),放在一個(gè)數(shù)據(jù)框中。
# 提取成分---- # 實(shí)際值=(季節(jié)性*趨勢(shì)*殘差)的乘積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ù)。
也就是說(shuō),序列的統(tǒng)計(jì)屬性,如平均數(shù)、方差和自相關(guān),隨著時(shí)間的推移是不變的。序列的自相關(guān)只不過(guò)是序列與它以前的值的相關(guān)性,更多的是關(guān)于這一點(diǎn)。
一個(gè)平穩(wěn)的時(shí)間序列也沒(méi)有季節(jié)性影響。
那么,如何識(shí)別一個(gè)序列是否是平穩(wěn)的?讓我們繪制一些例子來(lái)說(shuō)明。
平穩(wěn)和非平穩(wěn)的時(shí)間序列
那么,為什么平穩(wěn)的序列很重要呢?
我稍后會(huì)說(shuō)到這個(gè)問(wèn)題,但要知道,通過(guò)應(yīng)用適當(dāng)?shù)霓D(zhuǎn)換,幾乎可以使任何時(shí)間序列成為平穩(wěn)的。大多數(shù)統(tǒng)計(jì)預(yù)測(cè)方法都被設(shè)計(jì)為在平穩(wěn)的時(shí)間序列上工作。預(yù)測(cè)過(guò)程的第一步通常是做一些轉(zhuǎn)換,把非平穩(wěn)序列轉(zhuǎn)換成平穩(wěn)的。
9. 如何使一個(gè)時(shí)間序列平穩(wěn)?
你可以通過(guò)以下方式使序列平穩(wěn)
使序列平穩(wěn)的最常見和最方便的方法是對(duì)數(shù)列至少進(jìn)行一次差分,直到它成為近似平穩(wěn)的。
那么,什么是差分?
如果Y_t是時(shí)間't'的值,那么Y的第一個(gè)差值=Yt-Yt-1。更簡(jiǎn)單地說(shuō),序列只不過(guò)是用當(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ù)測(cè)前要使非穩(wěn)態(tài)序列成為穩(wěn)態(tài)?
預(yù)測(cè)一個(gè)平穩(wěn)的序列是相對(duì)容易的,而且預(yù)測(cè)結(jié)果也更可靠。
一個(gè)重要的原因是,自回歸預(yù)測(cè)模型本質(zhì)上是線性回歸模型,利用序列本身的滯后期作為預(yù)測(cè)因子。
我們知道,如果預(yù)測(cè)因子(X變量)不相互關(guān)聯(lián),線性回歸效果最好。因此,序列的平穩(wěn)化解決了這個(gè)問(wèn)題,因?yàn)樗巳魏纬掷m(xù)的自相關(guān),從而使預(yù)測(cè)模型中的預(yù)測(cè)因子(序列的滯后)幾乎是獨(dú)立的。
現(xiàn)在我們已經(jīng)確定了序列平穩(wěn)化的重要性,那么你如何檢查一個(gè)給定的序列是否是平穩(wěn)的?
10. 如何檢驗(yàn)平穩(wěn)性?
一個(gè)序列的平穩(wěn)性可以通過(guò)觀察序列的圖表來(lái)確定,就像我們之前做的那樣。
另一種方法是將序列分成2個(gè)或更多的連續(xù)部分,并計(jì)算平均數(shù)、方差和自相關(guān)等匯總統(tǒng)計(jì)數(shù)據(jù)。如果統(tǒng)計(jì)數(shù)字有很大差異,那么這個(gè)序列就不可能是平穩(wěn)的。
然而,你需要一種方法來(lái)定量地確定一個(gè)給定的序列是否是平穩(wěn)的。這可以通過(guò)稱為 "單位根測(cè)試 "的統(tǒng)計(jì)測(cè)試來(lái)完成。這方面有多種變化,測(cè)試檢查一個(gè)時(shí)間序列是否是非穩(wěn)態(tài)的并擁有單位根。
單位根測(cè)試有多種實(shí)現(xiàn)方式,例如。
最常用的是ADF檢驗(yàn),無(wú)效假設(shè)是時(shí)間序列擁有單位根,并且是非平穩(wěn)的。所以,如果ADH檢驗(yàn)中的P值小于顯著性水平(0.05),你就拒絕無(wú)效假設(shè)。
另一方面,KPSS檢驗(yàn)是用來(lái)檢驗(yàn)趨勢(shì)平穩(wěn)性的。空假設(shè)和P值的解釋與ADH檢驗(yàn)正好相反。下面的代碼使用python中的statsmodels包來(lái)實(shí)現(xiàn)這兩個(gè)檢驗(yàn)。
# ADF測(cè)試 result = adfuller(df.value.values, autolag='AIC')# KPSS測(cè)試 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。
在白噪聲中,沒(méi)有任何模式。如果你把調(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ì)處理?
去時(shí)間序列的趨勢(shì)是指從一個(gè)時(shí)間序列中去除趨勢(shì)成分。但如何提取趨勢(shì)呢?有多種方法。
去除我們前面看到的從時(shí)間序列分解中得到的趨勢(shì)成分。
去除平均數(shù)
應(yīng)用像Baxter-King濾波器或Hodrick-Prescott濾波器這樣的濾波器來(lái)去除移動(dòng)平均趨勢(shì)線或周期成分。
讓我們來(lái)實(shí)現(xiàn)前兩種方法。
# 使用scipy。減去最佳擬合線signal.detrend(df.value.values) plt.plot(detrended)通過(guò)減去最小二乘法來(lái)解讀時(shí)間序列的趨勢(shì)
# 使用statmodels。減去趨勢(shì)成分。 decompose(df['value'], model='multiplicative', detrended = df.value.value - trend plt.plot(detrended)通過(guò)減去趨勢(shì)成分進(jìn)行去勢(shì)
13. 如何對(duì)一個(gè)時(shí)間序列進(jìn)行去季節(jié)化?
有多種方法可以使時(shí)間序列去季候性化。下面是幾個(gè)例子。
- 1.取一個(gè)以季節(jié)性窗口為長(zhǎng)度的移動(dòng)平均線。這將在這個(gè)過(guò)程中使序列變得平滑。- 2.序列的季節(jié)性差異(用當(dāng)前值減去前一季的值)。- 3.用從STL分解得到的季節(jié)性指數(shù)除以該序列。如果除以季節(jié)性指數(shù)效果不好,可以嘗試取序列的對(duì)數(shù),然后進(jìn)行去季節(jié)性處理。之后你可以通過(guò)取指數(shù)來(lái)恢復(fù)到原來(lái)的規(guī)模。
# 時(shí)間序列分解 seasonal_decompose(df['value'], model='multiplicative'')# 去季節(jié)化 df. value.values / result_mul.seasonal # 繪圖 plt.plot(deseason)對(duì)時(shí)間序列進(jìn)行反季節(jié)處理
14. 如何測(cè)試一個(gè)時(shí)間序列的季節(jié)性?
常見的方法是繪制序列圖,檢查平穩(wěn)時(shí)間區(qū)間內(nèi)的可重復(fù)模式。所以,季節(jié)性的類型是由時(shí)鐘或日歷決定的。
然而,如果你想對(duì)季節(jié)性有一個(gè)更明確的檢查,可以使用自相關(guān)函數(shù)(ACF)圖。更多關(guān)于ACF的內(nèi)容將在接下來(lá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ì)測(cè)試,CHTest可以確定是否需要進(jìn)行季節(jié)性差分以使序列平穩(wěn)化。
15. 如何處理時(shí)間序列中的缺失值?
有時(shí),你的時(shí)間序列會(huì)有缺失的日期/時(shí)間。這意味著,這些時(shí)期的數(shù)據(jù)沒(méi)有被捕獲或無(wú)法獲得。在這種情況下,你可以用零來(lái)填補(bǔ)這些時(shí)期。
其次,當(dāng)涉及到時(shí)間序列時(shí),你通常不應(yīng)該用序列的平均值來(lái)替換缺失值,特別是在序列不是平穩(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 "過(guò)去最近的鄰居的平均值 ------knnmean(df.value.values, 8)np.round(meansquarerr('), 2)## 7. 季節(jié)性平均值 ----------------------------"""計(jì)算相應(yīng)季節(jié)性時(shí)期的平均值ts: 時(shí)間序列的一維數(shù)組式n: 時(shí)間序列的季節(jié)性窗口長(zhǎng)度"""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) * lrseasonal_mean(df.value, n=12, lr=1.25)缺失值處理方法
你也可以考慮以下方法,這取決于你希望推斷的準(zhǔn)確程度。
16. 什么是自相關(guān)和偏自相關(guān)函數(shù)?
自相關(guān)只是一個(gè)序列與它自己的滯后期的相關(guān)關(guān)系。如果一個(gè)序列是顯著的自相關(guān),那就意味著,該序列以前的值(滯后)可能有助于預(yù)測(cè)當(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的自回歸方程只不過(guò)是以其自身的滯后期為預(yù)測(cè)因素的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)圖。它通常是用來(lái)檢查自相關(guān)的。如果在序列中存在任何像你下面看到的模式,該序列是自相關(guān)的。如果沒(méi)有這樣的模式,該序列可能是隨機(jī)白噪聲。
在下面關(guān)于太陽(yáng)黑子區(qū)域時(shí)間序列的例子中,隨著n_lag的增加,圖變得越來(lái)越分散。
# #導(dǎo)入a10 = pd.read_csv('10.csv')# 繪圖 for i, ax in enumerate(axes.flatten()[:4]):fig.suptitle('藥物銷售的滯后圖', y=1.05)藥物銷售滯后曲線圖
滯后圖 太陽(yáng)黑子
19. 如何估計(jì)一個(gè)時(shí)間序列的可預(yù)測(cè)性?
一個(gè)時(shí)間序列的規(guī)律性和可重復(fù)性越強(qiáng),就越容易進(jìn)行預(yù)測(cè)。近似熵 "可以用來(lái)量化一個(gè)時(shí)間序列中波動(dòng)的規(guī)律性和不可預(yù)測(cè)性。
近似熵越高,預(yù)測(cè)就越困難。
另一個(gè)更好的替代方法是 "樣本熵"。
樣本熵與近似熵相似,但在估計(jì)復(fù)雜性方面更加一致,即使是較小的時(shí)間序列。例如,一個(gè)數(shù)據(jù)點(diǎn)較少的隨機(jī)時(shí)間序列的 "近似熵 "可能比一個(gè)較 "規(guī)則 "的時(shí)間序列低,而一個(gè)較長(zhǎng)的隨機(jī)時(shí)間序列的 "近似熵 "會(huì)更高。
樣本熵很好地處理了這個(gè)問(wèn)題。請(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)過(guò)噪聲過(guò)濾的序列的近似值。
- 平滑化后的序列可以作為解釋原始序列本身的一個(gè)特征。
- 更好地觀察基本趨勢(shì)
那么,如何對(duì)一個(gè)序列進(jìn)行平滑處理?讓我們討論一下以下方法。
移動(dòng)平均數(shù)只不過(guò)是定義寬度的滾動(dòng)窗口的平均值。但你必須合理地選擇窗口寬度,因?yàn)榇蟮拇翱诔叽鐣?huì)使序列過(guò)度平滑。例如,窗口尺寸等于季節(jié)性持續(xù)時(shí)間(例如:12個(gè)月的序列),將有效地消除季節(jié)性效應(yīng)。
LOESS是 "LOcalized regrESSion "的簡(jiǎn)稱,它在每個(gè)點(diǎn)的局部附近進(jìn)行多次回歸。它是在statsmodels軟件包中實(shí)現(xiàn)的,你可以用frac參數(shù)來(lái)控制平滑的程度,該參數(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í)間序列
如何使用格蘭杰因果測(cè)試來(lái)了解一個(gè)時(shí)間序列是否有助于預(yù)測(cè)另一個(gè)時(shí)間序列?
格蘭杰因果檢驗(yàn)是用來(lái)確定一個(gè)時(shí)間序列是否有助于預(yù)測(cè)另一個(gè)時(shí)間序列的。
格蘭杰因果關(guān)系測(cè)試是如何工作的?
它是基于這樣的想法:如果X導(dǎo)致Y,那么基于Y的前值和X的前值對(duì)Y的預(yù)測(cè)應(yīng)該優(yōu)于僅基于Y的前值的預(yù)測(cè)。
因此,理解格蘭杰因果關(guān)系不應(yīng)該被用來(lái)測(cè)試Y的滯后期是否導(dǎo)致Y。
無(wú)效假設(shè)是:第二列中的序列不會(huì)導(dǎo)致第一列中的序列的格蘭杰。如果P值小于顯著性水平(0.05),那么你就拒絕無(wú)效假設(shè),并得出結(jié)論:上述X的滯后期確實(shí)是有用的。
第二個(gè)參數(shù)maxlag說(shuō)的是在測(cè)試中應(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í)可以用來(lái)預(yù)測(cè)航空乘客。
總結(jié)
以上是生活随笔為你收集整理的Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Good Luck!
- 下一篇: 管网三维激光扫描建模_BIM建模_可视化