時(shí)間序列預(yù)測中的數(shù)據(jù)滑窗操作實(shí)例(python實(shí)現(xiàn))
撰寫背景
面向數(shù)據(jù)分析的小白,水平有限,錯(cuò)誤難免,歡迎指正。
什么是數(shù)據(jù)滑窗
進(jìn)行機(jī)器學(xué)習(xí)時(shí),一般都要涉及到劃分訓(xùn)練集和測試集的步驟。特別地,在做數(shù)據(jù)預(yù)測時(shí),一般把預(yù)測的依據(jù)(也就是歷史數(shù)據(jù))稱作X,把需要預(yù)測的數(shù)據(jù)稱為y。即首先把原始數(shù)據(jù)劃分為train_X, train_y這兩個(gè)訓(xùn)練數(shù)據(jù)集和test_X, test_y這兩個(gè)測試數(shù)據(jù)集。

對于時(shí)間序列數(shù)據(jù)的預(yù)測,往往是建立由好幾個(gè)歷史數(shù)據(jù)預(yù)測下一時(shí)刻的未來數(shù)據(jù),這時(shí)候?yàn)榱顺浞掷萌繑?shù)據(jù),應(yīng)該對原始數(shù)據(jù)集進(jìn)行滑窗操作,如下圖所示。

這里展示的是多個(gè)特征的時(shí)間序列,其中每一行數(shù)據(jù)均屬于同一時(shí)刻。假設(shè),我們要以H( humidity)、PT(pressure)、PE(power)三個(gè)特征為預(yù)測依據(jù),取當(dāng)前和上三個(gè)時(shí)刻共四個(gè)時(shí)刻的已知數(shù)據(jù)對下一時(shí)刻的PE(功率)進(jìn)行預(yù)測,那么對于X數(shù)據(jù)集的滑窗就應(yīng)該如上圖所示,而對y數(shù)據(jù)集的滑窗應(yīng)該如下圖所示。

下面給出滑窗實(shí)例。
代碼實(shí)現(xiàn)
滑窗函數(shù)
def sliding_window(DataSet, X_width, y_width, gap = 1, multi_vector = None, X_data = True):
'''
DataSet has to be as a DataFrame
'''
if X_data:
if multi_vector:
a,b = DataSet.shape
else:
a = DataSet.shape[0]
b = 1
c = (a-X_width-y_width-a%gap)/gap
X = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap
tmp = DataSet.iloc[j:j + X_width,:].values
tmp = np.reshape(tmp,(1,X_width,b))
X = np.concatenate([X,tmp],0)
return X
else:
if multi_vector:
print('y_data-error:expect 1D ,given %dD'%DataSet.shape[1])
return;
else:
a = DataSet.shape[0]
c = (a-X_width-y_width-a%gap)/gap
y = np.reshape(DataSet.iloc[X_width:X_width + y_width,0].values,(1,y_width))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap + X_width
tmp = DataSet.iloc[j:j + y_width,:].values
tmp = np.reshape(tmp,(1,y_width))
y = np.concatenate([y,tmp])
return y
單特征時(shí)間序列
單特征時(shí)間序列是指僅有一個(gè)特征的一維時(shí)間序列,如股票收盤價(jià)、風(fēng)電場風(fēng)速數(shù)據(jù)、日營業(yè)額等。對單特征時(shí)間序列滑窗操作如下:
#DataSet訓(xùn)練數(shù)據(jù)集 #X_width使用的歷史數(shù)據(jù)長度 #y_width要預(yù)測的數(shù)據(jù)長度 #X_data是否是X數(shù)據(jù)集 train_X = sliding_window(DataSet, X_width, y_width) train_y = sliding_window(DataSet, X_width, y_width, X_data = None)
假設(shè)訓(xùn)練數(shù)據(jù)集是一個(gè)100*1的序列,使用24個(gè)數(shù)據(jù)預(yù)測未來的1個(gè)數(shù)據(jù),那么滑窗操作就將原數(shù)據(jù)做了這樣的變換:

多特征時(shí)間序列
多特征時(shí)間序列指時(shí)間序列的特征不止一個(gè),如上文所舉的H、PT、PE三特征序列。這種數(shù)據(jù)一般使用在待預(yù)測的數(shù)據(jù)跟多個(gè)特征相關(guān)性較高的場合中,如氣象數(shù)據(jù)嵌入的風(fēng)速預(yù)測、股市數(shù)據(jù)嵌入的收盤價(jià)格預(yù)測等。進(jìn)行多特征時(shí)間序列滑窗操作如下:
#DataSet訓(xùn)練數(shù)據(jù)集 #X_width使用的歷史數(shù)據(jù)長度 #y_width要預(yù)測的數(shù)據(jù)長度 #multi_vector是否為多特征 #X_data是否是X數(shù)據(jù)集 train_X = sliding_window(DataSet, X_width, y_width, multi_vector = True) test_y = sliding_window(DataSet, X_width, y_width, multi_vector = True, X_data = None)
假設(shè)訓(xùn)練數(shù)據(jù)集是一個(gè)100*3的序列,使用24個(gè)數(shù)據(jù)預(yù)測未來的1個(gè)數(shù)據(jù),那么滑窗操作就將原數(shù)據(jù)做了這樣的變換:

注意事項(xiàng)
DataSet必須是DataFrame格式。
y數(shù)據(jù)集只能是一維。
總結(jié)
到此這篇關(guān)于時(shí)間序列預(yù)測中的數(shù)據(jù)滑窗操作(python實(shí)現(xiàn))的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)滑窗操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python與AI分析時(shí)間序列數(shù)據(jù)
- python編程開發(fā)時(shí)間序列calendar模塊示例詳解
- Python中LSTM回歸神經(jīng)網(wǎng)絡(luò)時(shí)間序列預(yù)測詳情
- Python?sklearn預(yù)測評估指標(biāo)混淆矩陣計(jì)算示例詳解
- 一文詳解Python灰色預(yù)測模型實(shí)現(xiàn)示例
- python合并RepeatMasker預(yù)測結(jié)果中染色體的overlap區(qū)域
- python目標(biāo)檢測yolo3詳解預(yù)測及代碼復(fù)現(xiàn)
- python?Prophet時(shí)間序列預(yù)測工具庫使用功能探索
相關(guān)文章
Python圖像處理實(shí)現(xiàn)兩幅圖像合成一幅圖像的方法【測試可用】
這篇文章主要介紹了Python圖像處理實(shí)現(xiàn)兩幅圖像合成一幅圖像的方法,結(jié)合實(shí)例形式分析了Python使用Image.blend()接口與Image.composite()接口進(jìn)行圖像合成的相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
python enumerate內(nèi)置函數(shù)用法總結(jié)
這篇文章主要介紹了python enumerate內(nèi)置函數(shù)用法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python實(shí)現(xiàn)簡單的用戶交互方法詳解
這篇文章給大家分享了關(guān)于Python實(shí)現(xiàn)簡單的用戶交互的相關(guān)知識點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2018-09-09
python 動(dòng)態(tài)加載的實(shí)現(xiàn)方法
腳本語言都有一個(gè)優(yōu)點(diǎn),就是動(dòng)態(tài)加載,python也有這個(gè)特性。這篇文章主要介紹了python 動(dòng)態(tài)加載的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-12-12
Python時(shí)間處理模塊Time和DateTime
這篇文章主要為大家介紹了Python時(shí)間處理模塊Time和DateTime使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Python實(shí)現(xiàn)將MySQL中所有表的數(shù)據(jù)都導(dǎo)出為CSV文件并壓縮
這篇文章主要為大家詳細(xì)介紹了如何使用Python將MySQL數(shù)據(jù)庫中所有表的數(shù)據(jù)都導(dǎo)出為CSV文件到一個(gè)目錄,并壓縮為zip文件到另一個(gè)目錄下,需要的可以了解下2025-03-03
Python 字符串與二進(jìn)制串的相互轉(zhuǎn)換示例
今天小編就為大家分享一篇Python 字符串與二進(jìn)制串的相互轉(zhuǎn)換示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python利用雪花算法實(shí)現(xiàn)生成唯一ID
雪花算法是在一個(gè)項(xiàng)目體系中生成全局唯一ID標(biāo)識的一種方式,偶然間看到了Python使用雪花算法不盡感嘆真的是太便捷了。本文就來聊聊這具體的實(shí)現(xiàn)方法,感興趣的可以了解一下2022-11-11

