導航:首頁 > 編程語言 > 時間序列python7種方法

時間序列python7種方法

發布時間:2022-12-15 22:20:19

❶ 如何在python中用LSTM網路進行時間序列預測

時間序列模型

時間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測未來一段時間內該事件的特徵。這是一類相對比較復雜的預測建模問題,和回歸分析模型的預測不同,時間序列模型是依賴於事件發生的先後順序的,同樣大小的值改變順序後輸入模型產生的結果是不同的。
舉個栗子:根據過去兩年某股票的每天的股價數據推測之後一周的股價變化;根據過去2年某店鋪每周想消費人數預測下周來店消費的人數等等

RNN 和 LSTM 模型

時間序列模型最常用最強大的的工具就是遞歸神經網路(recurrent neural network, RNN)。相比與普通神經網路的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。

典型的RNN網路結構如下:

4. 模型訓練和結果預測
將上述數據集按4:1的比例隨機拆分為訓練集和驗證集,這是為了防止過度擬合。訓練模型。然後將數據的X列作為參數導入模型便可得到預測值,與實際的Y值相比便可得到該模型的優劣。

實現代碼

  • 時間間隔序列格式化成所需的訓練集格式

  • import pandas as pdimport numpy as npdef create_interval_dataset(dataset, look_back):

  • """ :param dataset: input array of time intervals :param look_back: each training set feature length :return: convert an array of values into a dataset matrix. """

  • dataX, dataY = [], [] for i in range(len(dataset) - look_back):

  • dataX.append(dataset[i:i+look_back])

  • dataY.append(dataset[i+look_back]) return np.asarray(dataX), np.asarray(dataY)


  • df = pd.read_csv("path-to-your-time-interval-file")

  • dataset_init = np.asarray(df) # if only 1 columndataX, dataY = create_interval_dataset(dataset, lookback=3) # look back if the training set sequence length

  • 這里的輸入數據來源是csv文件,如果輸入數據是來自資料庫的話可以參考這里

  • LSTM網路結構搭建

  • import pandas as pdimport numpy as npimport randomfrom keras.models import Sequential, model_from_jsonfrom keras.layers import Dense, LSTM, Dropoutclass NeuralNetwork():

  • def __init__(self, **kwargs):

  • """ :param **kwargs: output_dim=4: output dimension of LSTM layer; activation_lstm='tanh': activation function for LSTM layers; activation_dense='relu': activation function for Dense layer; activation_last='sigmoid': activation function for last layer; drop_out=0.2: fraction of input units to drop; np_epoch=10, the number of epoches to train the model. epoch is one forward pass and one backward pass of all the training examples; batch_size=32: number of samples per gradient update. The higher the batch size, the more memory space you'll need; loss='mean_square_error': loss function; optimizer='rmsprop' """

  • self.output_dim = kwargs.get('output_dim', 8) self.activation_lstm = kwargs.get('activation_lstm', 'relu') self.activation_dense = kwargs.get('activation_dense', 'relu') self.activation_last = kwargs.get('activation_last', 'softmax') # softmax for multiple output

  • self.dense_layer = kwargs.get('dense_layer', 2) # at least 2 layers

  • self.lstm_layer = kwargs.get('lstm_layer', 2) self.drop_out = kwargs.get('drop_out', 0.2) self.nb_epoch = kwargs.get('nb_epoch', 10) self.batch_size = kwargs.get('batch_size', 100) self.loss = kwargs.get('loss', 'categorical_crossentropy') self.optimizer = kwargs.get('optimizer', 'rmsprop') def NN_model(self, trainX, trainY, testX, testY):

  • """ :param trainX: training data set :param trainY: expect value of training data :param testX: test data set :param testY: epect value of test data :return: model after training """

  • print "Training model is LSTM network!"

  • input_dim = trainX[1].shape[1]

  • output_dim = trainY.shape[1] # one-hot label

  • # print predefined parameters of current model:

  • model = Sequential() # applying a LSTM layer with x dim output and y dim input. Use dropout parameter to avoid overfitting

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=input_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out,

  • return_sequences=True)) for i in range(self.lstm_layer-2):

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out,

  • return_sequences=True)) # argument return_sequences should be false in last lstm layer to avoid input dimension incompatibility with dense layer

  • model.add(LSTM(output_dim=self.output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_lstm,

  • dropout_U=self.drop_out)) for i in range(self.dense_layer-1):

  • model.add(Dense(output_dim=self.output_dim,

  • activation=self.activation_last))

  • model.add(Dense(output_dim=output_dim,

  • input_dim=self.output_dim,

  • activation=self.activation_last)) # configure the learning process

  • model.compile(loss=self.loss, optimizer=self.optimizer, metrics=['accuracy']) # train the model with fixed number of epoches

  • model.fit(x=trainX, y=trainY, nb_epoch=self.nb_epoch, batch_size=self.batch_size, validation_data=(testX, testY)) # store model to json file

  • model_json = model.to_json() with open(model_path, "w") as json_file:

  • json_file.write(model_json) # store model weights to hdf5 file

  • if model_weight_path: if os.path.exists(model_weight_path):

  • os.remove(model_weight_path)

  • model.save_weights(model_weight_path) # eg: model_weight.h5

  • return model

  • 這里寫的只涉及LSTM網路的結構搭建,至於如何把數據處理規范化成網路所需的結構以及把模型預測結果與實際值比較統計的可視化,就需要根據實際情況做調整了。

    ❷ python時間序列模型預測為什麼時一條直線

    python時間序列模型預測時一條直線是因為是線性模型的原因。線性模型也稱作趨勢模型,它表示一個時間序列可以用一條直線來表示。它的基本等式:以一個公司的銷售總額為例,一開始的初始是5000,每隔一個時間步長增加2500。指數平滑法是時間序列分析方法中的一種。它是一種用於預測未來發展趨勢的建模演算法。它有三種不同形式:一次指數平滑法、二次指數平滑法、及三次指數平滑法。三種指數平滑法都要更新上一時間步長的計算結果,並使用當前時間步長的數據中包含的新信息。通過混合新信息和舊信息來實現。

    ❸ Python如何生成一百個間隔三十秒的時間序列。

    importdatetime
    time_list=[(datetime.datetime.now()+datetime.timedelta(seconds=i*30)).strftime("%Y-%m-%d%H:%M:%S")foriinrange(1,101)]
    print(time_list)

    ❹ 用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。

    ❺ 如何用Python做輿情時間序列可視化

    如何批量處理評論信息情感分析,並且在時間軸上可視化呈現?輿情分析並不難,讓我們用Python來實現它吧。
    痛點
    你是一家連鎖火鍋店的區域經理,很注重顧客對餐廳的評價。從前,你苦惱的是顧客不愛寫評價。最近因為餐廳火了,分店越來越多,寫評論的顧客也多了起來,於是你新的痛苦來了——評論太多了,讀不過來。
    從我這兒,你了解到了情感分析這個好用的自動化工具,一下子覺得見到了曙光。
    你從某知名點評網站上,找到了自己一家分店的頁面,讓助手把上面的評論和發布時間數據弄下來。因為助手不會用爬蟲,所以只能把評論從網頁上一條條復制粘貼到Excel里。下班的時候,才弄下來27條。(注意這里我們使用的是真實評論數據。為了避免對被評論商家造成困擾,統一將該餐廳的名稱替換為「A餐廳」。特此說明。)

    好在你只是想做個試驗而已,將就了吧。你用我之前介紹的中文信息情感分析工具,依次得出了每一條評論的情感數值。剛開始做出結果的時候,你很興奮,覺得自己找到了輿情分析的終極利器。
    可是美好的時光總是短暫的。很快你就發現,如果每一條評論都分別運行一次程序,用機器來做分析,還真是不如自己挨條去讀省事兒。
    怎麼辦呢?
    序列
    辦法自然是有的。我們可以利用《貸還是不貸:如何用Python和機器學習幫你決策?》一文介紹過的數據框,一次性處理多個數據,提升效率。
    但是這還不夠,我們還可以把情感分析的結果在時間序列上可視化出來。這樣你一眼就可以看見趨勢——近一段時間里,大家是對餐廳究竟是更滿意了,還是越來越不滿意呢?
    我們人類最擅長處理的,就是圖像。因為漫長的進化史逼迫我們不斷提升對圖像快速准確的處理能力,否則就會被環境淘汰掉。因此才會有「一幅圖勝過千言萬語」的說法。

    准備
    首先,你需要安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python做詞雲 》一文。
    助手好不容易做好的Excel文件restaurant-comments.xlsx,請從這里下載。
    用Excel打開,如果一切正常,請將該文件移動到咱們的工作目錄demo下。

    因為本例中我們需要對中文評論作分析,因此使用的軟體包為SnowNLP。情感分析的基本應用方法,請參考《如何用Python做情感分析?》。
    到你的系統「終端」(macOS, Linux)或者「命令提示符」(Windows)下,進入我們的工作目錄demo,執行以下命令。
    pip install snownlp
    pip install ggplot

    運行環境配置完畢。
    在終端或者命令提示符下鍵入:
    jupyter notebook

    如果Jupyter Notebook正確運行,下面我們就可以開始編寫代碼了。
    代碼
    我們在Jupyter Notebook中新建一個Python 2筆記本,起名為time-series。

    首先我們引入數據框分析工具Pandas,簡寫成pd以方便調用。
    import pandas as pd

    接著,讀入Excel數據文件:
    df = pd.read_excel("restaurant-comments.xlsx")

    我們看看讀入內容是否完整:
    df.head()

    結果如下:

    注意這里的時間列。如果你的Excel文件里的時間格式跟此處一樣,包含了日期和時間,那麼Pandas會非常智能地幫你把它識別為時間格式,接著往下做就可以了。
    反之,如果你獲取到的時間只精確到日期,例如"2017-04-20"這樣,那麼Pandas只會把它當做字元串,後面的時間序列分析無法使用字元串數據。解決辦法是在這里加入以下兩行代碼:
    from dateutil import parser
    df["date"] = df.date.apply(parser.parse)

    這樣,你就獲得了正確的時間數據了。
    確認數據完整無誤後,我們要進行情感分析了。先用第一行的評論內容做個小實驗。
    text = df.comments.iloc[0]

    然後我們調用SnowNLP情感分析工具。
    from snownlp import SnowNLP
    s = SnowNLP(text)

    顯示一下SnowNLP的分析結果:
    s.sentiments

    結果為:
    0.6331975099099649

    情感分析數值可以正確計算。在此基礎上,我們需要定義函數,以便批量處理所有的評論信息。
    def get_sentiment_cn(text):
    s = SnowNLP(text) return s.sentiments

    然後,我們利用Python裡面強大的apply語句,來一次性處理所有評論,並且將生成的情感數值在數據框裡面單獨存為一列,稱為sentiment。
    df["sentiment"] = df.comments.apply(get_sentiment_cn)

    我們看看情感分析結果:
    df.head()

    新的列sentiment已經生成。我們之前介紹過,SnowNLP的結果取值范圍在0到1之間,代表了情感分析結果為正面的可能性。通過觀察前幾條數據,我們發現點評網站上,顧客對這家分店評價總體上還是正面的,而且有的評論是非常積極的。
    但是少量數據的觀察,可能造成我們結論的偏頗。我們來把所有的情感分析結果數值做一下平均。使用mean()函數即可。
    df.sentiment.mean()

    結果為:
    0.7114015318571119

    結果數值超過0.7,整體上顧客對這家店的態度是正面的。
    我們再來看看中位數值,使用的函數為median()。
    df.sentiment.median()

    結果為:
    0.9563139038622388

    我們發現了有趣的現象——中位數值不僅比平均值高,而且幾乎接近1(完全正面)。
    這就意味著,大部分的評價一邊倒表示非常滿意。但是存在著少部分異常點,顯著拉低了平均值。
    下面我們用情感的時間序列可視化功能,直觀查看這些異常點出現在什麼時間,以及它們的數值究竟有多低。
    我們需要使用ggplot繪圖工具包。這個工具包原本只在R語言中提供,讓其他數據分析工具的用戶羨慕得流口水。幸好,後來它很快被移植到了Python平台。
    我們從ggplot中引入繪圖函數,並且讓Jupyter Notebook可以直接顯示圖像。
    %pylab inlinefrom ggplot import *

    這里可能會報一些警告信息。沒有關系,不理會就是了。
    下面我們繪制圖形。這里你可以輸入下面這一行語句。
    ggplot(aes(x="date", y="sentiment"), data=df) + geom_point() + geom_line(color = 'blue') + scale_x_date(labels = date_format("%Y-%m-%d"))

    你可以看到ggplot的繪圖語法是多麼簡潔和人性化。只需要告訴Python自己打算用哪個數據框,從中選擇哪列作為橫軸,哪列作為縱軸,先畫點,後連線,並且可以指定連線的顏色。然後,你需要讓X軸上的日期以何種格式顯示出來。所有的參數設定跟自然語言很相似,直觀而且易於理解。
    執行後,就可以看到結果圖形了。

    在圖中,我們發現許多正面評價情感分析數值極端的高。同時,我們也清晰地發現了那幾個數值極低的點。對應評論的情感分析數值接近於0。這幾條評論,被Python判定為基本上沒有正面情感了。
    從時間上看,最近一段時間,幾乎每隔幾天就會出現一次比較嚴重的負面評價。
    作為經理,你可能如坐針氈。希望盡快了解發生了什麼事兒。你不用在數據框或者Excel文件裡面一條條翻找情感數值最低的評論。Python數據框Pandas為你提供了非常好的排序功能。假設你希望找到所有評論里情感分析數值最低的那條,可以這樣執行:
    df.sort(['sentiment'])[:1]

    結果為:

    情感分析結果數值幾乎就是0啊!不過這里數據框顯示評論信息不完全。我們需要將評論整體列印出來。
    print(df.sort(['sentiment']).iloc[0].comments)

    評論完整信息如下:
    這次是在情人節當天過去的,以前從來沒在情人節正日子出來過,不是因為沒有男朋友,而是感覺哪哪人都多,所以特意錯開,這次實在是饞A餐廳了,所以趕在正日子也出來了,從下午四點多的時候我看排號就排到一百多了,我從家開車過去得堵的話一個小時,我一看提前兩個小時就在網上先排著號了,差不多我們是六點半到的,到那的時候我看號碼前面還有才三十多號,我想著肯定沒問題了,等一會就能吃上的,沒想到悲劇了,就從我們到那坐到等位區開始,大約是十分二十分一叫號,中途多次我都想走了,哈哈,哎,等到最後早上九點才吃上的,服務員感覺也沒以前清閑時周到了,不過這肯定的,一人負責好幾桌,今天節日這么多人,肯定是很累的,所以大多也都是我自己跑腿,沒讓服務員給弄太多,就蝦滑讓服務員下的,然後環境來說感覺衛生方面是不錯,就是有些太吵了,味道還是一如既往的那個味道,不過A餐廳最人性化的就是看我們等了兩個多小時,上來送了我們一張打折卡,而且當次就可以使用,這點感覺還是挺好的,不愧是A餐廳,就是比一般的要人性化,不過這次就是選錯日子了,以後還是得提前預約,要不就別趕節日去,太火爆了!
    通過閱讀,你可以發現這位顧客確實有了一次比較糟糕的體驗——等候的時間太長了,以至於使用了「悲劇」一詞;另外還提及服務不夠周到,以及環境吵鬧等因素。正是這些詞彙的出現,使得分析結果數值非常低。
    好在顧客很通情達理,而且對該分店的人性化做法給予了正面的評價。
    從這個例子,你可以看出,雖然情感分析可以幫你自動化處理很多內容,然而你不能完全依賴它。
    自然語言的分析,不僅要看錶達強烈情感的關鍵詞,也需要考慮到表述方式和上下文等諸多因素。這些內容,是現在自然語言處理領域的研究前沿。我們期待著早日應用到科學家們的研究成果,提升情感分析的准確度。
    不過,即便目前的情感分析自動化處理不能達到非常准確,卻依然可以幫助你快速定位到那些可能有問題的異常點(anomalies)。從效率上,比人工處理要高出許多。
    你讀完這條評論,長出了一口氣。總結了經驗教訓後,你決定將人性化的服務貫徹到底。你又想到,可以收集用戶等候時長數據,用數據分析為等待就餐的顧客提供更為合理的等待時長預期。這樣就可以避免顧客一直等到很晚了。
    祝賀你,經理!在數據智能時代,你已經走在了正確的方向上。
    下面,你該認真閱讀下一條負面評論了……

    ❻ 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也可做外推值的預測,設定好具體終止周期即可。

    ❼ 時間序列分析方法

    時間序列是指一組在連續時間上測得的數據,其在數學上的定義是一組向量x(t), t=0,1,2,3,...,其中t表示數據所在的時間點,x(t)是一組按時間順序(測得)排列的隨機變數。包含單個變數的時間序列稱為單變數時間序列,而包含多個變數的時間序列則稱為多變數。

    時間序列在很多方面多有涉及到,如天氣預報,每天每個小時的氣溫,股票走勢等等,在商業方面有諸多應用,如:

    下面我們將通過一個航班數據來說明如何使用已有的工具來進行時間序列數據預測。常用來處理時間序列的包有三個:

    對於基於AR、MA的方法一般需要數據預處理,因此本文分為三部分:

    通過簡單的初步處理以及可視化可以幫助我們有效快速的了解數據的分布(以及時間序列的趨勢)。

    觀察數據的頻率直方圖以及密度分布圖以洞察數據結構,從下圖可以看出:

    使用 statsmodels 對該時間序列進行分解,以了解該時間序列數據的各個部分,每個部分都代表著一種模式類別。借用 statsmodels 序列分解我們可以看到數據的主要趨勢成分、季節成分和殘差成分,這與我們上面的推測相符合。

    如果一個時間序列的均值和方差隨著時間變化保持穩定,則可以說這個時間序列是穩定的。

    大多數時間序列模型都是在平穩序列的前提下進行建模的。造成這種情況的主要原因是序列可以有許多種(復雜的)非平穩的方式,而平穩性只有一種,更加的易於分析,易於建模。

    在直覺上,如果一段時間序列在某一段時間序列內具有特定的行為,那麼將來很可能具有相同的行為。譬如已連續觀察一個星期都是六點出太陽,那麼可以推測明天也是六點出太陽,誤差非常小。

    而且,與非平穩序列相比,平穩序列相關的理論更加成熟且易於實現。

    一般可以通過以下幾種方式來檢驗序列的平穩性:

    如果時間序列是平穩性的,那麼在ACF/PACF中觀測點數據與之前數據點的相關性會急劇下降。

    下圖中的圓錐形陰影是置信區間,區間外的數據點說明其與觀測數據本身具有強烈的相關性,這種相關性並非來自於統計波動。

    PACF在計算X(t)和X(t-h)的相關性的時候,挖空在(t-h,t)上所有數據點對X(t)的影響,反應的是X(t)和X(t-h)之間真實的相關性(直接相關性)。

    從下圖可以看出,數據點的相關性並沒有急劇下降,因此該序列是非平穩的。

    如果序列是平穩的,那麼其滑動均值/方差會隨著時間的變化保持穩定。

    但是從下圖我們可以看到,隨著時間的推移,均值呈現明顯的上升趨勢,而方差也呈現出波動式上升的趨勢,因此該序列是非平穩的。

    一般來講p值小於0.05我們便認為其是顯著性的,可以拒絕零假設。但是這里的p值為0.99明顯是非顯著性的,因此接受零假設,該序列是非平穩的。

    從上面的平穩性檢驗我們可以知道該時間序列為非平穩序列。此外,通過上面1.3部分的序列分解我們也可以看到,該序列可分解為3部分:

    我們可以使用數據轉換來對那些較大的數據施加更大的懲罰,如取對數、開平方根、立方根、差分等,以達到序列平穩的目的。

    滑動平均後數據失去了其原來的特點(波動式上升),這樣損失的信息過多,肯定是無法作為後續模型的輸入的。

    差分是常用的將非平穩序列轉換平穩序列的方法。ARIMA中的 'I' 便是指的差分,因此ARIMA是可以對非平穩序列進行處理的,其相當於先將非平穩序列通過差分轉換為平穩序列再來使用ARMA進行建模。

    一般差分是用某時刻數值減去上一時刻數值來得到新序列。但這里有一點區別,我們是使用當前時刻數值來減去其對應時刻的滑動均值。

    我們來看看剛剛差分的結果怎麼樣。

    讓我們稍微總結下我們剛剛的步驟:

    通過上面的3步我們成功的將一個非平穩序列轉換成了一個平穩序列。上面使用的是最簡單的滑動均值,下面我們試試指數滑動平均怎麼樣。

    上面是最常用的指數滑動平均的定義,但是pandas實現的指數滑動平均好像與這個有一點區別,詳細區別還得去查pandas文檔。

    指數滑動均值的效果看起來也很差。我們使用差分+指數滑動平均再來試試吧。

    在上面我們通過 取log+(指數)滑動平均+差分 已經成功將非平穩序列轉換為了平穩序列。

    下面我們看看,轉換後的平穩序列的各個成分是什麼樣的。不過這里我們使用的是最簡單的差分,當前時刻的值等於原始序列當前時刻的值減去原始序列中上一時刻的值,即: x'(t) = x(t) - x(t-1)。

    看起來挺不錯,是個平穩序列的樣子。不過,還是檢驗一下吧。

    可以看到,趨勢(Trend)部分已基本被去除,但是季節性(seasonal)部分還是很明顯,而ARIMA是無法對含有seasonal的序列進行建模分析的。

    在一開始我們提到了3個包均可以對時間序列進行建模。

    為了簡便,這里 pmdarima 和 statsmodels.tsa 直接使用最好的建模方法即SARIMA,該方法在ARIMA的基礎上添加了額外功能,可以擬合seasonal部分以及額外添加的數據。

    在使用ARIMA(Autoregressive Integrated Moving Average)模型前,我們先簡單了解下這個模型。這個模型其實可以包括三部分,分別對應著三個參數(p, d, q):

    因此ARIMA模型就是將AR和MA模型結合起來然後加上差分,克服了不能處理非平穩序列的問題。但是,需要注意的是,其仍然無法對seasonal進行擬合。

    下面開始使用ARIMA來擬合數據。

    (1) 先分訓練集和驗證集。需要注意的是這里使用的原始數據來進行建模而非轉換後的數據。

    (2)ARIMA一階差分建模並預測

    (3)對差分結果進行還原

    先手動選擇幾組參數,然後參數搜索找到最佳值。需要注意的是,為了避免過擬合,這里的階數一般不太建議取太大。

    可視化看看結果怎麼樣吧。

    (6)最後,我們還能對擬合好的模型進行診斷看看結果怎麼樣。

    我們主要關心的是確保模型的殘差(resial)部分互不相關,並且呈零均值正態分布。若季節性ARIMA(SARIMA)不滿足這些屬性,則表明它可以進一步改善。模型診斷根據下面的幾個方面來判斷殘差是否符合正態分布:

    同樣的,為了方便,我們這里使用 pmdarima 中一個可以自動搜索最佳參數的方法 auto_arima 來進行建模。

    一般來說,在實際生活和生產環節中,除了季節項,趨勢項,剩餘項之外,通常還有節假日的效應。所以,在prophet演算法裡面,作者同時考慮了以上四項,即:

    上式中,

    更多詳細Prophet演算法內容可以參考 Facebook 時間序列預測演算法 Prophet 的研究 。

    Prophet演算法就是通過擬合這幾項,然後把它們累加起來得到時間序列的預測值。

    Prophet提供了直觀且易於調整的參數:

    Prophet對輸入數據有要求:

    關於 Prophet 的使用例子可以參考 Prophet example notebooks

    下面使用 Prophet 來進行處理數據。

    參考:
    Facebook 時間序列預測演算法 Prophet 的研究
    Prophet example notebooks
    auto_arima documentation for selecting best model
    數據分析技術:時間序列分析的AR/MA/ARMA/ARIMA模型體系
    https://github.com/advaitsave/Introction-to-Time-Series-forecasting-Python
    時間序列分析
    My First Time Series Comp (Added Prophet)
    Prophet官方文檔: https://facebookincubator.github.io

    ❽ 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」頻率,並指明想要該時期的末尾:

    未完待續。。。

    ❾ Pandas-時間序列基礎

    Python標准庫中包含用於日期和時間的數據類型,而且還有日歷方面的功能,我們主要會用到datetime、time和calendar模塊,datetime.datetime是用的最多的數據類型。

    datetime以毫秒形式存儲日期和時間,datetime.timedelta表示兩個datetime對象之間的時間差.

    可以給datetime對象加上或者減去一個或多個timedelta,會產生一個新對象:

    利用str或者strftime方法,datetime對象和pandas的Timestamp對象可以被格式化為字元串:

    datetime.strptime也可以用這些格式化編碼將字元串轉化為日期:

    datetime.strptime是通過已知格式進行日期解析的最佳方式,但是每次都要編寫格式定義很麻煩,尤其是對於一些常見的日期格式,這種情況下,可以用dateutil這個第三方包中的parser.parse方法,dateutil可以解析幾乎所有人類能夠理解的日期表示形式:

    在國際通用格式中,日通常出現在月的前面,傳入dayfirst=True即可:

    pandas通常是用於處理成組日期的,不管這些日期是DataFrame的軸索引還是列,to_datetime方法可以解析多種不同的日期表示形式。

    to_datetime可以處理缺失值,NAT是pandas中時間戳數據的NA值:

    pandas最基本的時間序列類型就是以時間戳為索引的Series:

    這里的Series索引不是普通的索引,而是DatetimeIndex,而ts變為了一個TimeSeries,同時,可以看到,pandas用Numpy的datetime64數據類型以納秒形式存儲時間戳。

    跟其他Series一樣,不同索引的時間序列之間的算數運算會自動對齊:

    DateTimeIndex中的各個標量值是pandas的Timestamp對象.
    由於TimeSeries是Series的一個子類,所以在索引以及數據選曲方面他們的行為是一樣的,但是我們還可以傳入一個可以被解釋為日期的字元串來進行索引:

    對於較長的時間序列,只需傳入年或年月即可輕松選取數據的切片:

    通過日期進行切片的方式只對規則Series有效:

    還有一個等價的實例方法也可以截取兩個日期之間的TimeSeries:

    DataFrame也同樣適用上面的規則

    pandas中的時間序列一般被認為是不規則的,也就是說,沒有固定的頻率,對於大部分程序而言,這是無所謂的,但是,他常常需要以某種相對固定的頻率進行分析,比如每月,每日,每15min等。pandas有一套標准時間序列頻率以及用於重采樣,頻率推斷,生成固定頻率日期范圍的工具.
    例如,我們可以將之前的時間序列轉換為一個具有固定頻率(每日)的時間序列,只需調用resample即可.返回DatetimeIndexResampler,獲取值使用asfreq():

    生成日期范圍使用date_range函數

    默認情況下,date_range會產生按天計算的時間點,如果只傳入起始或結束日期,那就還得傳入一個表示一段時間的數字:

    如果你不想按天生成數據,想要按照一定的頻率生成,我們傳入freq參數即可.如想按5小時生成數據:

    如果你想生成一個由每月最後一個工作日組成的日期索引,可以使用BM頻率:

    date_range默認會保留起始和結束的時間戳的時間信息,但是如果我們想產生一組規范化到午夜的時間戳,normalize選項可以實現這個功能:

    WOM(week of Month)是一種非常實用的頻率類,它以WOM開頭,它使你能獲得諸如每月第三個星期五之類的日期:

    ❿ 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中的單個元素

    閱讀全文

    與時間序列python7種方法相關的資料

    熱點內容
    dvd光碟存儲漢子演算法 瀏覽:758
    蘋果郵件無法連接伺服器地址 瀏覽:963
    phpffmpeg轉碼 瀏覽:672
    長沙好玩的解壓項目 瀏覽:145
    專屬學情分析報告是什麼app 瀏覽:564
    php工程部署 瀏覽:833
    android全屏透明 瀏覽:737
    阿里雲伺服器已開通怎麼辦 瀏覽:803
    光遇為什麼登錄時伺服器已滿 瀏覽:302
    PDF分析 瀏覽:486
    h3c光纖全工半全工設置命令 瀏覽:143
    公司法pdf下載 瀏覽:383
    linuxmarkdown 瀏覽:350
    華為手機怎麼多選文件夾 瀏覽:683
    如何取消命令方塊指令 瀏覽:350
    風翼app為什麼進不去了 瀏覽:779
    im4java壓縮圖片 瀏覽:362
    數據查詢網站源碼 瀏覽:151
    伊克塞爾文檔怎麼進行加密 瀏覽:893
    app轉賬是什麼 瀏覽:163