搜博主文章 利用Python進行資料分析——時間序列
最常見的時間序列具有如下特徵:
- 時間戳,時間的例項
- 有固定的時間間隔,一天,一小時或一分鐘
- 有起止點
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime,timedelta
Python標準庫
Python標準庫中內建了對時間型別的支援
now=datetime.now()
print(now.year,now.month,now.day)
2018 4 17
datetime型別可以做運算,預設單位為’天’:
time_delta =datetime(2011,1,7)-datetime(2011,1,5)
time_delta.days
2
datetime(2000,1,1)+2*timedelta(5)
datetime.datetime(2000, 1, 11, 0, 0)
datetime與字串的轉換
#datatime2string
stamp=datetime(2011,1,1,13,14,15)
time_str=stamp.strftime('%Y-%m-%d %H:%M:%S')
time_str
‘2011-01-01 13:14:15’
#string2datetime
time_str='2011-01-03 23:30:10'
time=datetime.strptime(time_str,'%Y-%m-%d %H:%M:%S')
time
datetime.datetime(2011, 1, 3, 23, 30, 10)
time_strs=['7/6/2011','8/6/2011']
for time_str in time_strs:
print(datetime.strptime(time_str,'%m/%d/%Y'))
2011-07-06 00:00:00
2011-08-06 00:00:00
時間序列基本
pandas中最基本的時間序列物件就是以時間戳為行索引的Series:
dates=[datetime(2011,1,2),
datetime(2011 ,1,5),
datetime(2011,1,7)]
ts=pd.Series(np.random.randn(3),index=dates)
ts
2011-01-02 -0.062302
2011-01-05 0.020653
2011-01-07 -0.296481
dtype: float64
pandas可以很方便地生成一串時間物件:
time_index=pd.date_range('1/1/2011',periods=1000)
time_index
索引、選擇、子集
時間序列在索引與選擇上與pandas物件基本一致,不過因為時間戳的特殊性,在按時間戳索引時可以有多種不同的格式:
ts.loc['2011-01-05']
0.020653080558353583
ts.loc['20110105']
0.020653080558353583
longer_ts=pd.Series(np.random.randn(1000),pd.date_range('2000-01-01',periods=1000))
#索引出某一月的資料,某年某日類似
longer_ts.loc['2001-02']
#切片索引
longer_ts.loc['20020924':]
2002-09-24 0.556197
2002-09-25 0.895196
2002-09-26 -0.190502
Freq: D, dtype: float64
此處還需要注意的是,同numpy切片索引,連續索引返回的是一個指標引用,只有非連續索引返回的才是一個副本。
日期範圍、頻率與變換
生成指定範圍的日期
pd.date_range('20120401','20120405',freq='D') #以天為間隔
pd.date_range(start='20120401',periods=5,freq='W-MON') #以每週一為間隔
pd.date_range(end='20120405',periods=5,freq='W-SAT') #以每週六為間隔
pd.date_range('20180101',periods=12,freq='BM') #以每月的最後一個工作日為間隔
pd.date_range('20000101',periods=10,freq='90T') #以90分鐘為間隔
平移資料
ts=pd.Series(np.abs(np.random.randn(4)),index=pd.date_range('20000101',periods=4,freq='M'))
ts.shift(2) #將資料沿時間軸往後移動兩個單位
平移的一個常用用法為計算資料沿時間軸的變化率,如計算以上資料每月的變化率:
(ts.shift(-1)-ts)/ts
shift()方法還可用來更改時間軸:
new_ts=ts.shift(1,freq='D')
new_ts
根據偏移來平移資料
(待補充)
時區處理
時間序列中的時區可能是最令人頭疼的工作了。
rng=pd.date_range('20120309 9:30',periods=6,freq='D')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
ts_utc=ts.tz_localize('UTC') #為無時區的時間戳加上時區
ts_utc
rng_utc=pd.date_range('20120309 9:30',periods=6,freq='D',tz='UTC') #在生成時間索引時宣告時區
ts_utc=pd.Series(np.random.randn(len(rng_utc)),index=rng_utc)
ts_utc
ts_utc.tz_convert('Asia/Shanghai') #轉換時區
在不同時區下操作
如果兩個Series擁有不同時區,合併後的結果會是UTC:
rng=pd.date_range('20120307 9:30',periods=5,freq='B')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
ts1=ts.iloc[:3].tz_localize('Europe/London')
ts2=ts.iloc[3:].tz_localize('Europe/Moscow')
(ts1+ts2).index
時期與時期數學
時期代表著一段時間,Period類就代表這種資料結構。
p=pd.Period(2007,freq='A-DEC') #十二月的最後一天為時期的結束日
print(p+5,p-2)
2012 2005
如果兩個Period擁有相同的頻率,則其唯一的差異就在於單位的數字:
pd.Period(2014,freq='A-DEC')-p
7
類似於date_range(),可以使用period_range()方法生成時期區間:
rng=pd.period_range('20000101','20000630',freq='M')
pd.Series(np.random.randn(6),index=rng)
時期頻率轉換
如果我們需要將一個年度時期轉換成月度時期,使用asfreq()方法進行時期的頻率轉換:
p=pd.Period('2007',freq='A-JUN') #2007年六月的最後一天為時期的結束日
p
Period(‘2007’, ‘A-JUN’)
p.asfreq('M',how='start') #上述時期的起始月份
Period(‘2006-07’, ‘M’)
p.asfreq('M',how='end') #上述時期的結束月份
Period(‘2007-06’, ‘M’)
季度時期頻率
季度性資料是財政領域的標準時期,季度性資料跟財年結束日相關,財年結束日通常為一年中某月(不一定設在十二月)的最後一個工作日。因此,2012Q4時期會根據不同的財年結束日而指向不同的時期,具體看下圖:
p=pd.Period('2012Q4',freq='Q-FEB') #財年結束日為FEB
print(p.asfreq('D',how='start'),p.asfreq('D',how='end')) #顯示時期的起止日期
2011-12-01 2012-02-29
時間戳與時期的轉換
(待補充)
由陣列建立時期索引
有時資料集中在一列或多列中包含了時期資訊的資料,可以通過這些已有資料來生成時期索引:
data=pd.read_csv('examples/macrodata.csv')
data.sample(5)
year_index=data.loc[:,'year']
year_index.unique()
quarter_index=data.loc[:,'quarter']
quarter_index.unique()
array([1., 2., 3., 4.])
period_index=pd.PeriodIndex(year=year_index,quarter=quarter_index,freq='Q-DEC')
data.index=period_index
data.sample(5)
重取樣與頻率轉換
重取樣指的是將一個時間序列的頻率進行轉換,高頻轉低頻稱為下采樣,低頻轉高頻稱為上取樣。resample()方法實際是對時間序列提供了一個類似於groupby()的方法用來按時間戳來聚合資料。
rng=pd.period_range('20000101',periods=100,freq='D')
ts=pd.Series(np.random.randn(100),index=rng)
ts.sample(5)
ts.resample('M',kind='period').mean() #相當於groupby().mean()
下采樣
對時間序列進行下采樣是最普遍的任務
rng=pd.date_range('20000101',periods=6,freq='T')
ts=pd.Series(np.arange(len(rng)),index=rng)
ts
重取樣返回結果的時間戳為劃分區間的左值,而區間是左開右閉還是左閉右開由closd=
引數決定。試比較下面兩種不同分割方法的區別:
ts.resample('5min',closed='left',label='left').count()
ts.resample('5min',closed='right',label='left').count()
在closed='left'
的條件下,時間序列被分為[00:00:00,00:05:00)與[00:05:00,00:10:00)兩個區間,而在closed='right
條件下,被分為(23:55:00,00:00:00]與(00:00:00,00:05:00]兩個區間。
區間時間戳的顯示值預設為左值,不過可以使用引數label=
來更改為右值:
ts.resample('5min',closed='left',label='right').count()
2000-01-01 00:05:00 5
2000-01-01 00:10:00 1
Freq: 5T, dtype: int64
open-high-low-close(OHLC) 重取樣
在金融領域,一種聚合時間序列的常用方法是計算每個分組的四個值:第一個值(open),最後一個值(close),最大值(high),最小值(low):
ts.resample('5min').ohlc()
上取樣與插值
當頻率由低轉高時,沒有資料的聚合,而是需要插值。
rng=pd.date_range('20000101',periods=2,freq='W-WED')
frame=pd.DataFrame(np.random.randn(2,4),
index=rng,
columns=['Colorado','Texas','New York','Ohio'])
frame.resample('D').asfreq() #上取樣時不插值的話會有缺失值
frame.resample('D').ffill() #前插法插值
可以利用resample()方法+ffill()來改變時間抽:
frame.resample('W-THU').ffill()
時期的重取樣
rng=pd.period_range('20000101',periods=14,freq='M')
frame=pd.DataFrame(np.random.randn(len(rng),4),
index=rng,
columns=['Colorado','Texas','New York','Ohio'])
annual_frame=frame.resample('A-DEC').mean()
#上取樣
annual_frame.resample('Q-DEC').ffill()
移動視窗函式
應用於時間序列的重要操作,很多都是基於一個滑動視窗或者權重指數衰減之上的,這有助於平滑噪聲或帶間隔的資料。
close_px_all=pd.read_csv('examples/stock_px_2.csv',parse_dates=True,index_col=0)
close_px=close_px_all.loc[:,['AAPL','MSFT','XOM']]
close_px=close_px.resample('B').ffill()
close_px.loc[:,'AAPL'].rolling(250).mean().plot() #以250天為滑動視窗的APPLE股票均價
plt.show()
因為滑動視窗尺寸為250天,所以在前249天是沒有資料的,可以在rolling()方法中使用引數min_periods=
來指定前期允許的最小視窗數:
close_px.loc[:,'AAPL'].rolling(250,min_periods=10).mean().plot() #最小允許一個10天的滑動視窗
plt.show()
當對一個DataFrame直接應用rolling()方法時,會單獨對DF中的每一列進行操作:
close_px.rolling(100).mean().plot(logy=True) #開啟指數縱座標
plt.show()
指數加權函式
在很多關於時間序列的應用場景下,我們會更看重最近的值,即最近的值得權重越大,而越久遠的值權重越小。我們可以應用ewm()方法來實現與rolling()方法類似的功能,並且是帶權重的:
close_px.loc[:,'AAPL'].rolling(30).mean().plot(style='k--',label='Simple MA')
close_px.loc[:,'AAPL'].ewm(30).mean().plot(style='k-',label='EW MA')
plt.show()
二進位制移動視窗函式
有些統計學操作,如相關係數或協方差,需要在兩個時間序列上操作。舉個例子,金融分析師經常會對一隻股票與S&P500的關係感興趣。
spx_px=close_px_all.loc[:,'SPX']
spx_returns=spx_px.pct_change()
returns=close_px.pct_change()
returns.rolling(100,min_periods=50).corr(spx_returns).plot()
plt.show()
使用者定義的移動視窗函式
(待補充)
相關推薦
搜博主文章 利用Python進行資料分析——時間序列
最常見的時間序列具有如下特徵: - 時間戳,時間的例項 - 有固定的時間間隔,一天,一小時或一分鐘 - 有起止點 import numpy as np import pandas as pd import matplotlib.pyplot as plt
利用python進行資料分析-時間序列3
AAPL MSFT XOM 2003-01-02 7.40 21.11 29.22 2003-01-03 7.45 21.14 29.24 2003-01-06 7.45 21.52 29.96 2003-01-07 7.43 21.
資料基礎---《利用Python進行資料分析·第2版》第12章 pandas高階應用
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 前面的章節關注於不同型別的資料規整流程和NumPy、pandas與其它庫的特點。隨著時間的發展,pandas發展出了更多適
資料基礎---《利用Python進行資料分析·第2版》第6章 資料載入、儲存與檔案格式
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 訪問資料是使用本書所介紹的這些工具的第一步。我會著重介紹pandas的資料輸入與輸出,雖然別的庫中也有不少以此為目的的工具
資料基礎---《利用Python進行資料分析·第2版》第4章 NumPy基礎:陣列和向量計算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 NumPy(Numerical Python的簡稱)是Python數值計算最重要的基礎包。大多數提供科學計算的包都是用Nu
資料基礎---《利用Python進行資料分析·第2版》第11章 時間序列
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 時間序列(time series)資料是一種重要的結構化資料形式,應用於多個領域,包括金融學、經濟學、生態學、神經科學、物
資料基礎---《利用Python進行資料分析·第2版》第10章 資料聚合與分組運算
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 對資料集進行分組並對各組應用一個函式(無論是聚合還是轉換),通常是資料分析工作中的重要環節。在將資料集載入、融合、準備好之
資料基礎---《利用Python進行資料分析·第2版》第8章 資料規整:聚合、合併和重塑
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在許多應用中,資料可能分散在許多檔案或資料庫中,儲存的形式也不利於分析。本章關注可以聚合、合併、重塑資料的方法。 首先
資料基礎---《利用Python進行資料分析·第2版》第7章 資料清洗和準備
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的80%或更多。
資料基礎---《利用Python進行資料分析·第2版》第5章 pandas入門
之前自己對於numpy和pandas是要用的時候東學一點西一點,直到看到《利用Python進行資料分析·第2版》,覺得只看這一篇就夠了。非常感謝原博主的翻譯和分享。 pandas是本書後續內容的首選庫。它含有使資料清洗和分析工作變得更快更簡單的資料結構和操作工具。pandas經常和其它工
利用Python進行資料分析之第七章 記錄2 資料規整化:清理、轉換、合併、重塑
索引上的合併 DataFrame中傳入引數left_index=True或者right_index=True(或者兩個都傳入),表示DataFrame的index(索引)被用作兩個DataFrame連線的連線鍵,如下: dataframe1 = DataFrame({'key':
利用Python進行資料分析之第七章記錄 資料規整化:清理、轉換、合併、重塑
合併資料集: pandas物件中的資料可以通過一些內建的方式進行合併: pandas.merge可根據一個或多個鍵將不同DataFrame中的行連線起來。SQL或其它關係型資料庫的使用者對此應該會比較熟悉,因為它實現的就是資料庫的連線操作。 pandas.concat可以沿著一條軸將多個
資料集合與分組運算 《利用python進行資料分析》筆記,第9章
pandas的groupby功能,可以計算 分組統計和生成透視表,可對資料集進行靈活的切片、切塊、摘要等操作 GroupBy技術 “split-apply-comebine”(拆分-應用-合併) import numpy as np from pand
《利用python進行資料分析》 第10章 時間序列
第十章、時間序列 時間戳timestamp:特定的時刻 固定時期period:2017年1月或2017年全年 時間間隔interval:時期是間隔的特例 實驗或過程時間:每一個時間點都是對特定起始實踐的一個獨立那個。例如,從放入烤箱起,每秒鐘餅乾的直徑。 1
《利用python進行資料分析.第三版》 第七章 資料清洗和準備
7.1 處理缺失資料 缺失資料在pandas中呈現的方式有些不完美,但對於大多數使用者可以保證功能正常。對於數值資料,pandas使用浮點值NaN(Not a Number)表示缺失資料。我們稱其為哨兵值,可以方便的檢測出來。 處理缺失資料有以下幾個方
《利用Python進行資料分析》第二版,第二章精選筆記
因為這本書是專注於Python資料處理的,對於一些Python的資料結構和庫的特性難免不足。因此,本章和第3章的內容只夠你能學習本書後面的內容。 在我來看,沒有必要為了資料分析而去精通Python。我鼓勵你使用IPython shell和Jupyter試驗示例
《利用Python進行資料分析》第7章 合併資料集
合併資料集 資料分析和建模方面的大量程式設計工作都是用在資料準備上的:載入、清理、轉換以及重塑。有時候,存放在檔案或資料庫中的資料並不能滿足你的資料處理應用的要求。pandas物件中的資料可以通過一些內建的方式進行合併: pandas.merge可根據一個或
《利用Python進行資料分析·第2版》第7章 資料清洗和準備
在資料分析和建模的過程中,相當多的時間要用在資料準備上:載入、清理、轉換以及重塑。這些工作會佔到分析師時間的 80% 或更多。有時,儲存在檔案和資料庫中的資料的格式不適合某個特定的任務。許多研究者都選擇使用通用程式語言(如 Python、Perl、R 或 Java)或 UNI
《利用Python進行資料分析》第一章讀書筆記
一、重要的Python庫 1. NumPy(Python科學計算的基礎包) 2. pandas(本書用得最多pandas物件是DataFrame) 3. matplotlib(繪製資料圖表得Python庫) 4. IPython(目的是提
《利用Python進行資料分析》第五章 pandas的基本功能
介紹操作Series和DataFrame中的資料的基本功能 重新索引 pandas物件的一個重要方法是reindex,其作用是建立一個適應新索引的新物件。以之前的一個簡單示例來說 In [1]: from pandas import Series,Da