python resample函数_python时序分析之重采集(resample)
接著上一回說到的時(shí)序分析,上一回主要是學(xué)習(xí)了datetime庫(kù)和pandas.to_datetime模塊。
今天我們要學(xué)習(xí)的是resample,這一講的內(nèi)容很多,也有很多有意思的東西。
老規(guī)矩,用到的資料來源于pandas.DataFrame.resample - pandas 0.24.2 documentation?pandas.pydata.org
參考書Wes McKinney著的Python for Data Analysis,中文名叫《利用python進(jìn)行數(shù)據(jù)分析》
在開始resample之前,我覺得有必要介紹一個(gè)模塊data_range,在介紹data_range之前,我想補(bǔ)充一下datetime的格式說明哇,這個(gè)被壓縮的好厲害
這個(gè)格式也是format最常用的。當(dāng)然需要牢記。
好的,我們開始data_range的學(xué)習(xí)
老規(guī)矩,先看一下data_range的參數(shù)使用
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False,
name=None, closed=None, **kwargs)date_range常用的幾個(gè)參數(shù)
這里我就主要介紹一下常用的參數(shù)
1:start 這個(gè)參數(shù)是時(shí)間索引的起始時(shí)間
2:end 自然這個(gè)參數(shù)是結(jié)束的時(shí)間
3:period ,如果你只使用了起始或結(jié)束的時(shí)間戳,那么就需要使用period來告知一個(gè)范圍
4:freq 這個(gè)是frequency的縮寫,也就是頻率,這個(gè)是一個(gè)非常重要的參數(shù),可以通過設(shè)置這個(gè)參數(shù)得到自定義的時(shí)間頻率
官方文檔為這些頻率做了一個(gè)說明,我就直接復(fù)制下來了官方文檔給出的解釋,這里是常用的基礎(chǔ)單詞,我就不翻譯了
還有兩張圖片我相信各位看官都能看懂,我就不班門弄斧了多不多,我覺得我已經(jīng)go die了
光看上面的圖片,我覺得很容易就暈掉了,我們來看一看具體的例子,我敬重的考研名師宇哥說過“數(shù)無形時(shí)少直覺”那么我們用實(shí)際的例子去解決上面的問題。
因?yàn)樽蛱鞂W(xué)了datetime模塊,所以我這里就自己結(jié)合了datetime
首先先導(dǎo)入需要以及可能用到的庫(kù)
import pandas as pd
import numpy as np
from datetime import datetime
下一步使用不同的采集方式
pd.date_range(start=datetime.now(), periods=5, freq='B')輸出結(jié)果
讓我們分析分析這個(gè)語(yǔ)句,首先start=datetime.now(),這個(gè)語(yǔ)句的意思是獲取當(dāng)前的時(shí)間,
而period=5的意思是獲得5個(gè)時(shí)間點(diǎn),如果沒有后面的freq,則默認(rèn)的是獲得天數(shù)。我們可以在執(zhí)行一條語(yǔ)句
pd.date_range(start=datetime.now(), periods=5)注意看這里的freq='D'這是模塊默認(rèn)的
那么這兩個(gè)語(yǔ)句的區(qū)別在于freq,第一個(gè)設(shè)置freq='B' 根據(jù)上面表格里面的內(nèi)容,B = Business day 也就是工作日,可以看到第一個(gè)的輸出結(jié)果就是顯示的就是從明天開始的5個(gè)工作日。
再來看一個(gè)例子
pd.date_range(start='20130809',periods=8,freq='SM')這里我使用了freq='SM'
SM=semi-month end frequency(15th and end of month)也即是取每月的15號(hào)和當(dāng)月的最后一天,比如29,28,30,31
當(dāng)然還可以舉很多的例子,但是后面就是重復(fù)的過程了,所以我就不繼續(xù)下去了,我下面將會(huì)做兩個(gè)時(shí)間頻率疊加的操作
請(qǐng)看
pd.date_range(start=datetime.now(),periods=5,freq='2h20min')請(qǐng)注意這里的freq
這里的freq我使用的2h20min,也就是2小時(shí)20分鐘,也即140分鐘,所以輸出結(jié)果里面寫明了freq=140T,其中T就是minutes頻率的表示,我們同樣可以直接在此處使用freq=140T
pd.date_range(start=datetime.now(),periods=5,freq='140T')可以看到效果是一樣的
我們?cè)诳匆粋€(gè)例子
pd.date_range(start='20190623', periods=10, freq='1D10U')可以看到這里的輸出結(jié)果是多了1天10微秒
這一點(diǎn)在實(shí)際中用到的情況還算是比較多的。
總結(jié)一下,其實(shí)這一部分非常的常用,所以還是需要熟知的,至于其他的時(shí)間,實(shí)際工作或者學(xué)習(xí)的時(shí)候遇到了,可以直接去查找官方的文檔,Time Series / Date functionality?pandas.pydata.org
可以直接查閱上面的這個(gè)鏈接然后查詢
下面我們將會(huì)對(duì)重新采樣和頻率轉(zhuǎn)換(resample)做一個(gè)基本的了解
同樣的老規(guī)矩先上鏈接pandas.Series.resample - pandas 0.24.2 documentation?pandas.pydata.org
resample這個(gè)模塊有兩類--1:pandas.Series.resample, 2:pandas.DataFrame.resample
常規(guī)操作先看一下resample這個(gè)模塊的參數(shù)
Series.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',
kind=None, loffset=None, limit=None, base=0, on=None, level=None)
在介紹參數(shù)之前,我想先說明一下什么是重新采樣:重新采樣是值將時(shí)間序列從一個(gè)頻率轉(zhuǎn)換為另一個(gè)頻率的過程,將更高頻率的數(shù)據(jù)聚合到低頻率被稱為向下采樣,而從低頻率轉(zhuǎn)換為高頻率被稱為向上采樣,但是好有一種是同頻之間的切換,比如W-WED(weekly on Wednesday 每周三)轉(zhuǎn)換到W-FRI(每周五)
好的講清楚了,下面看一下參數(shù)參數(shù)如圖
話說知乎壓縮圖片也太夸張了吧。。。。
好吧,湊合著看吧,下面我們把上面幾個(gè)參數(shù)按照導(dǎo)圖的形式表示出來
下面我將圍繞上面的幾個(gè)參數(shù)舉幾個(gè)例子
先生成幾個(gè)時(shí)間
index = pd.date_range('1/1/2000',periods=9,freq='T')
series = pd.Series(range(9),index=index)
series執(zhí)行結(jié)果
這個(gè)時(shí)間是按照1分鐘為頻率生成的,下面我要向下采集以3分鐘為頻率,并把時(shí)間戳的合計(jì)值放在一個(gè)bin(可以翻譯為箱子)里面
series.resample('3T').sum()執(zhí)行結(jié)果
下面的幾個(gè)例子都是處理closed和label這幾個(gè)參數(shù)的,為了更好地對(duì)比,我先把上面這個(gè)例子的參數(shù)的默認(rèn)值表示出來
series.resample('3T')執(zhí)行結(jié)果
各位看官可以注意這里面的默認(rèn)值,closed和label都是left,那么我改變一下closed和label的值會(huì)發(fā)生什么呢?
series.resample('3T',label='right').sum()執(zhí)行結(jié)果
可以發(fā)現(xiàn)和第一個(gè)相比較第二個(gè)的第一個(gè)重采集執(zhí)行數(shù)據(jù)是03而不是00,所以這個(gè)就是兩者的區(qū)別
我們?cè)诳匆幌?#xff0c;加入closed的情況
series.resample('3T',label='right',closed='right').sum()執(zhí)行結(jié)果
可能上面幾個(gè)例子不是很直觀,那么這里可以引入loffset,來講索引移動(dòng)一定的數(shù)量,如從右邊緣減去一秒,
series.resample('3T',label='right',
closed='right',loffset='-1s').sum()執(zhí)行結(jié)果
series.resample('3T',loffset='-1s').sum()執(zhí)行結(jié)果
series.resample('3T',label='right',loffset='-1s').sum()執(zhí)行結(jié)果
到這里向下采集也有很多朋友稱為降頻率就結(jié)束了,下一步就是升頻率
向上采集的時(shí)候可能會(huì)出現(xiàn)很多空值,
series.resample('30S').asfreq()[0:5]執(zhí)行結(jié)果
我們可以使用asfreq方法,在不聚合的情況下轉(zhuǎn)換到高頻率。
而對(duì)于出現(xiàn)的空值,我們可以使用fillna,和reindex的方法填充和插值方法
插值的時(shí)候可以使用ffill,bfill,pad等方式
series.resample('30S').pad()[0:5]執(zhí)行結(jié)果
series.resample('30S').ffill()[0:5]執(zhí)行結(jié)果
series.resample('30S').bfill()[0:5]執(zhí)行結(jié)果
可以看到ffill是插入相鄰的上一個(gè)數(shù)據(jù),bfill是插入相鄰的下一個(gè)數(shù)據(jù),而pad好像執(zhí)行結(jié)果和ffill是一樣的,我找了很久也沒收到這個(gè)是什么操作,由于周末時(shí)間不早了,這個(gè)就先留一個(gè)坑,下一次在補(bǔ)上吧。
好的到這里今天的時(shí)序就算結(jié)束了,雖然還有金融常用的OHLC以及移動(dòng)窗口函數(shù),但是這個(gè)對(duì)于我來講暫時(shí)還用不到,等真的用到的時(shí)候再回來看吧。
好的,總結(jié)一下:今天主要是學(xué)了如何生成一個(gè)想要的時(shí)間頻率的數(shù)據(jù),以及如何重新采集時(shí)間。
希望這篇文章能夠給予同為菜鳥的看官以幫助。
好的,我今天就不求贊了,拖得太久了。。。。
總結(jié)
以上是生活随笔為你收集整理的python resample函数_python时序分析之重采集(resample)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国庆假期也不能打断我坚持早起的目标,人气
- 下一篇: 合并k个有序链表 python_leet