python時間序列預測
A. python時間序列(2)
時期(period)表示的是時間區間,比如數日、數月、數季、數年等。Period類所 表示的就是這種數據類型,其構造函數需要用到一個字元串或整數,以及表11-4中 的頻率:
這里,這個Period對象表示的是從2007年1月1日到2007年12月31日之間的整段時間。
只需對Period對象加上或減去一個整數即可達到根據其頻率進行位移的效果:
如果兩個Period對象擁有相同的頻率,則它們的差就是它們之間的單位數量:
period_range函數可用於創建規則的時期范圍:
PeriodIndex類保存了一組Period,它可以在任何pandas數據結構中被用作軸索引:
如果你有一個字元串數組,你也可以使用PeriodIndex類:
Period和PeriodIndex對象都可以通過其asfreq方法被轉換成別的頻率。假設我們有 一個年度時期,希望將其轉換為當年年初或年末的一個月度時期。該任務非常簡 單:
你可以將Period('2007','A-DEC')看做一個被劃分為多個月度時期的時間段中的游 標。圖11-1對此進行了說明。
對於一個不以12月結束的財政年度,月度子時期的歸屬情況就不一樣了:
在將高頻率轉換為低頻率時,超時期(superperiod)是由子時期(subperiod)所 屬的位置決定的。例如,在A-JUN頻率中,月份「2007年8月」實際上是屬於周期「2008年」的:
完整的PeriodIndex或TimeSeries的頻率轉換方式也是如此:
這里,根據年度時期的第一個月,每年的時期被取代為每月的時期。
如果我們想要 每年的最後一個工作日,我們可以使用「B」頻率,並指明想要該時期的末尾:
未完待續。。。
B. python中的雜訊是什麼意思
白雜訊是時間序列預測中的一個重要概念。如果一個時間序列是白雜訊,它是一個隨機數序列,不能預測。如果預測誤差不是白雜訊,它暗示了預測模型仍有改進空間。
什麼是白雜訊時間序列?
時間序列可能是白雜訊。時間序列如果變數是獨立的且恆等分布的均值為0,那麼它是白雜訊。這意味著所有變數具有相同的方差 (sigma^2),並且每個值與該系列中的所有其他值具有零相關。
如果序列中的變數被高斯分布繪制,則該系列稱為高斯白雜訊。
為什麼這么重要?
白雜訊是時間序列分析和預測中的一個重要的概念。
重要的兩個主要原因為:
1.可預測性:如果你的時間序列是白雜訊,那麼根據定義它是隨機的。你無法對它合理的建模並進行預測。
2.模型診斷:時間序列上一系列誤差的預測模型最好是白雜訊。
模型診斷是時間序列預測的重要領域。
時間序列數據在潛在的因素產生的信號上被預測,它包含一些白雜訊成分。
例如:
y(t)= signal(t)+ noise(t)
通過時間序列預測模型進行預測,可以對其進行收集和分析。在理想情況下,預測誤差應該是白雜訊。
當預測誤差為白雜訊時,意味著時間序列中的所有信號已全部被模型利用進行預測。剩下的就是無法建模的隨機波動。
模型預測的信號不是白雜訊則表明可以進一步對預測模型改進。
你的時間序列白噪音嗎?
你的時間序列如果符合下面條件則不是白雜訊:
你的序列均值為零嗎?
方差隨時間變化嗎?
值與延遲值相關嗎?
創建一個折線圖。檢查總體特徵,如變化的平均值,方差或延遲變數之間的明顯關系。
計算匯總統計。對照序列中有意義的連續塊的均值和方差,檢查整個序列的均值和方差(如年、月、日)。
創建一個自相關的圖。檢查延遲變數之間的總體相關性。
- from randomimport gaussfrom randomimport seedfrom pandasimport Seriesfrom pandas.tools.plottingimport autocorrelation_plot
- # seed random number generatorseed(1)# create white noise series
- series= [gauss(0.0,1.0)for iin range(1000)]series= Series(series)
- # summary statsprint(series.describe())
- count 1000.000000mean -0.013222std 1.003685min -2.96121425% -0.68419250% -0.01093475% 0.703915max 2.737260
- # line plot
- series.plot()pyplot.show()
- from randomimport gaussfrom randomimport seedfrom pandasimport Seriesfrom pandas.tools.plottingimport autocorrelation_plotfrom matplotlibimport pyplot
- # seed random number generatorseed(1)# create white noise series
- series= [gauss(0.0,1.0)for iin range(1000)]series= Series(series)# summary statsprint(series.describe())# line plot
- series.plot()pyplot.show()# histogram plot
- series.hist()pyplot.show()# _plot(series)pyplot.show()
你可以用一些工具來檢查你的時間序列是否為白噪音:
白雜訊時間序列的例子
在本節中,我們將使用Python創建一個高斯白雜訊序列並做一些檢查。它有助於在實踐中創建和評估白雜訊時間序列。它將提供參考框架和示例圖並且使用和比較自己的時間序列項目的統計測試,以檢查它們是否為白雜訊
首先,我們可以使用隨機模塊的gauss()函數創建一個1,000個隨機高斯變數的列表。
我們將從高斯分布提取變數:平均值(mu)0.0和標准偏差(sigma)1.0。
一旦創建,為方便起見,我們可以在Pandas序列中打包這個列表。
接下來,我們可以計算和列印一些匯總統計數據,包含序列的平均值和標准偏差。
鑒於我們在繪制隨機數時定義了平均值和標准偏差,所以應該不會有意外。
我們可以看到平均值接近0.0,標准偏差接近1.0。考慮到樣本較小預測會有些誤差。
如果我們有更多的數據,將序列分成兩半計算和比較每一半的匯總統計可能會更有趣。我們認為每個子系列的平均值和標准差都會相似。
現在我們可以創建一些序列的線條圖。
我們可以看到,這個序列似乎是隨機的。
為了完整性,下面提供了完整的代碼清單。
原文:網頁鏈接
C. python 時間序列分析 收斂性問題
Python與R相比速度要快。Python可以直接處理上G的數據;R不行,R分析數據時需要先通過資料庫把大數據轉化為小數據(通過groupby)才能交給R做分析,因此R不可能直接分析行為詳單,只能分析統計結果。所以有人說:Python=R+SQL/Hive,並不是沒有道理的。
D. python 時間序列模型中forecast和predict的區別
舉例說明,2017.01.01-.017.12.31的周期為12的月度數據中,用ARIMA擬合得到模型model。
model.get_prediction(start='2017.09.01')則得到用擬合模型計算出來的樣本內2017.09.01-2017.12.31的預測值;
model.get_forcast(step=5)則得到樣本外推5期即2018.01.01-2018.05.31五個月的預測值;
註:
model.get_prediction也可做外推值的預測,設定好具體終止周期即可。
E. 用Python預測「周期性時間序列」的正確姿勢
公司平台上有不同的api,供內部或外部調用,這些api承擔著不同的功能,如查詢賬號、發版、搶紅包等等。日誌會記錄下每分鍾某api被訪問了多少次,即一個api每天會有1440條記錄(1440分鍾),將每天的數據連起來觀察,有點類似於股票走勢的意思。我想通過前N天的歷史數據預測出第N+1天的流量訪問情況,預測值即作為合理參考,供新一天與真實值做實時對比。當真實流量跟預測值有較大出入,則認為有異常訪問,觸發報警。
我放了一份樣例數據在data文件夾下,
看一下數據大小和結構
畫圖看一下序列的走勢:(一些畫圖等探索類的方法放在了test_stationarity.py 文件中,包含時間序列圖,移動平均圖,有興趣的可以自己嘗試下)。
看這糟心的圖,那些驟降為0的點這就是我遇到的第一個坑,我當初一拿到這份數據就開始做了。後來折騰了好久才發現,那些驟降為0的點是由於數據缺失,ETL的同學自動補零造成的,溝通晚了(TДT)。
把坑填上,用前後值的均值把缺失值補上,再看一眼:
發現這份數據有這樣幾個特點,在模型設計和數據預處理的時候要考慮到:
前六天的數據做訓練,第七天做測試集。
消除數據的毛刺,可以用移動平均法,我這里沒有採用,因為我試過發現對於我的數據來說,移動平均處理完後並不能使數據平滑,我這里採用的方法很簡單,但效果還不錯:把每個點與上一點的變化值作為一個新的序列,對這里邊的異常值,也就是變化比較離譜的值剃掉,用前後數據的均值填充,注意可能會連續出現變化較大的點:
平滑後的訓練數據:
採用statsmodels工具包:
對分解出來的趨勢部分單獨用arima模型做訓練:
預測出趨勢數據後,加上周期數據即作為最終的預測結果,但更重要的是,我們要得到的不是具體的值,而是一個合理區間,當真實數據超過了這個區間,則觸發報警,誤差高低區間的設定來自剛剛分解出來的殘差resial數據:
預測並完成最後的加法處理,得到第七天的預測值即高低置信區間:
對第七天作出預測,評估的指標為均方根誤差rmse,畫圖對比和真實值的差距:
可以看到,均方根誤差462.8,相對於原始數據幾千的量級,還是可以的。測試數據中的兩個突變的點,也超過了置信區間,能准確報出來。
前文提到不同的api形態差異巨大,本文只展示了一個,我在該項目中還接觸了其他形態的序列,有的有明顯的上升或下降趨勢;有的開始比較平緩,後面開始增長... ... ,但是都屬於典型的周期性時間序列,它的核心思想很簡單:做好分解,做好預測結果的還原,和置信區間的設置,具體操作可根據具體業務邏輯做調整,祝大家建模愉快:-D。
F. 如何在Python中用LSTM網路進行時間序列預測
時間序列模型
時間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測未來一段時間內該事件的特徵。這是一類相對比較復雜的預測建模問題,和回歸分析模型的預測不同,時間序列模型是依賴於事件發生的先後順序的,同樣大小的值改變順序後輸入模型產生的結果是不同的。
舉個栗子:根據過去兩年某股票的每天的股價數據推測之後一周的股價變化;根據過去2年某店鋪每周想消費人數預測下周來店消費的人數等等
RNN 和 LSTM 模型
時間序列模型最常用最強大的的工具就是遞歸神經網路(recurrent neural network, RNN)。相比與普通神經網路的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。
典型的RNN網路結構如下:
4. 模型訓練和結果預測
將上述數據集按4:1的比例隨機拆分為訓練集和驗證集,這是為了防止過度擬合。訓練模型。然後將數據的X列作為參數導入模型便可得到預測值,與實際的Y值相比便可得到該模型的優劣。
實現代碼
時間間隔序列格式化成所需的訓練集格式
這里的輸入數據來源是csv文件,如果輸入數據是來自資料庫的話可以參考這里
LSTM網路結構搭建
這里寫的只涉及LSTM網路的結構搭建,至於如何把數據處理規范化成網路所需的結構以及把模型預測結果與實際值比較統計的可視化,就需要根據實際情況做調整了。
G. python數據分析時間序列如何提取一個月的數據
Pandas中,最基本的時間序列類型就是以時間戳為索引的Series對象。
時間戳使用Timestamp(Series派生的子類)對象表示,該對象與datetime具有高度的兼容性,可以直接通過to_datetime()函數將datetime轉換為TimeStamp對象。
import pandas as pd # 導入pandas模塊,並起個別名pd from datetime import datetime import numpy as np pd.to_datetime('20200828') # 將datetime轉換為Timestamp對象
Timestamp('2020-08-28 00:00:00')
當傳入的是多個datetime組成的列表,則Pandas會將其強制轉換為DatetimeIndex類對象。
# 傳入多個datetime字元串 date_index = pd.to_datetime(['20200820', '20200828', '20200908']) date_index
DatetimeIndex(['2020-08-20', '2020-08-28', '2020-09-08'],
dtype='datetime64[ns]', freq=None)
如何取出第一個時間戳
date_index[0] # 取出第一個時間戳
Timestamp('2020-08-20 00:00:00')
2.在Pandas中,最基本的時間序列類型就是以時間戳為索引的Series對象。
# 創建時間序列類型的Series對象 date_ser = pd.Series([11, 22, 33], index=date_index) date_ser
2020-08-20 11
2020-08-28 22
2020-09-08 33
dtype: int64
也可將包含多個datetime對象的列表傳給index參數,同樣能創建具有時間戳索引的Series對象。
# 指定索引為多個datetime的列表 date_list = [datetime(2020, 1, 1), datetime(2020, 1, 15), datetime(2020, 2, 20), datetime(2020, 4, 1), datetime(2020,
H. PyFlux庫函數是什麼
PyFlux是Python編程語言的開源時間序列庫。PyFlux是Python中為處理時間序列問題而創建的開源庫。該庫有一系列極好的時間序列模型,包括但不限於 ARIMA、 GARCH 和 VAR 模型。簡而言之,PyFlux提供了一個時間序列建模的概率方法。
PyFlux允許使用時間序列建模,並且已經實現了像GARCH這樣的現代時間序列模型。
時間序列研究是統計學和計量經濟學的一個子領域,目標可以描述時間序列如何表現(以潛在的因素或興趣的特徵來表示),也可以藉此預測未來的行為。
(8)python時間序列預測擴展閱讀:
Python擁有一個強大的標准庫。Python語言的核心只包含數字、字元串、列表、字典、文件等常見類型和函數,而由Python標准庫提供了系統管理、網路通信、文本處理、資料庫介面、圖形系統、XML處理等額外的功能。Python標准庫命名介面清晰、文檔良好,很容易學習和使用。
Python標准庫的主要功能有:
文本處理,包含文本格式化、正則表達式匹配、文本差異計算與合並、Unicode支持,二進制數據處理等功能
文件處理,包含文件操作、創建臨時文件、文件壓縮與歸檔、操作配置文件等功能
操作系統功能,包含線程與進程支持、IO復用、日期與時間處理、調用系統函數、寫日記(logging)等功能
網路通信,包含網路套接字,SSL加密通信、非同步網路通信等功能
網路協議,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多種網路協議,並提供了編寫網路伺服器的框架
W3C格式支持,包含HTML,SGML,XML的處理
其它功能,包括國際化支持、數學運算、HASH、Tkinter等
I. python中時間序列數據的一些處理方式
datetime.timedelta對象代表兩個時間之間的時間差,兩個date或datetime對象相減就可以返回一個timedelta對象。
利用以下數據進行說明:
如果我們發現時間相關內容的變數為int,float,str等類型,不方便後面的分析,就需要使用該函數轉化為常用的時間變數格式:pandas.to_datetime
轉換得到的時間單位如下:
如果時間序列格式不統一,pd.to_datetime()的處理方式:
當然,正確的轉換是這樣的:
第一步:to_datetime()
第二步:astype(datetime64[D]),astype(datetime64[M])
本例中:
order_dt_diff必須是Timedelta(Ɔ days 00:00:00')格式,可能是序列使用了diff()
或者pct_change()。
前者往往要通過'/np.timedelta'去掉單位days。後者其實沒有單位。
假如我們要統計某共享單車一天內不同時間點的用戶使用數據,例如
還有其他維度的提取,年、月、日、周,參見:
Datetime properties
注意 :.dt的對象必須為pandas.Series,而不可以是Series中的單個元素