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