【Python】ime series:时间序列
生活随笔
收集整理的這篇文章主要介紹了
【Python】ime series:时间序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
time series:時間序列
目錄:
文章目錄
- @[toc]
- 一 時間序列總覽
- 二 日期和時間數據類型及工具
- 1 日期和時間數據類型
- 2 字符串和datetime的相互轉換
- 三 時間序列基礎
- 1 索引、選取、子集構造
- 2 帶有重復索引的時間序列
- 四 日期的范圍、頻率及移動
- 1 生成日期范圍
- 2 頻率和日期偏移量
- 3 移動(超前和滯后)數據
- 五 時區處理
- 1 本地化和轉換
- 2 操作時區意識型Timestamp對象
- 3 不同時區之間的運算
- 六 時期及其算術運算
- 1 時期的頻率轉換
- 2 按季度計算的時期頻率
- 3 將Timestamp轉換為Period(及其反向過程)
- 4 通過數組創建PeriodIndex
- 七 重采樣及頻率轉換
- 1 降采樣
- 2 升采樣和插值
- 3 通過時期進行重采樣
- 八 時間序列繪圖
- 九 移動窗口函數
- 1 指數加權函數
- 2 二元移動函數
- 3 用戶自定義的移動窗口函數
- @[toc]
- 一 時間序列總覽
- 二 日期和時間數據類型及工具
- 1 日期和時間數據類型
- 2 字符串和datetime的相互轉換
- 三 時間序列基礎
- 1 索引、選取、子集構造
- 2 帶有重復索引的時間序列
- 四 日期的范圍、頻率及移動
- 1 生成日期范圍
- 2 頻率和日期偏移量
- 3 移動(超前和滯后)數據
- 五 時區處理
- 1 本地化和轉換
- 2 操作時區意識型Timestamp對象
- 3 不同時區之間的運算
- 六 時期及其算術運算
- 1 時期的頻率轉換
- 2 按季度計算的時期頻率
- 3 將Timestamp轉換為Period(及其反向過程)
- 4 通過數組創建PeriodIndex
- 七 重采樣及頻率轉換
- 1 降采樣
- 2 升采樣和插值
- 3 通過時期進行重采樣
- 八 時間序列繪圖
- 九 移動窗口函數
- 1 指數加權函數
- 2 二元移動函數
- 3 用戶自定義的移動窗口函數
一 時間序列總覽
- 不管在哪個領域(金融學、經濟學、生態學、神經科學、物理學等),時間序列(time series)數據都是一種重要的結構化數據形式。在多個時間點觀察或測量到的任何事物都可以形成一段時間序列。很多時間序列都是固定頻率的,基本數據點都是根據某種規律出現的;時間序列也可以是不定期的額。時間序列數據的意義取決于具體的應用場景,主要有以下幾種:
- ① 時間戳(timestamp):特定的時刻
- ② 固定時期(period):如2007年1月或2014年全年
- ③ 時間間隔(interval):由起始和結束時間戳表示。時期可以被看做間隔的特例。
- ④ 實驗過程時間,每個時間點都是相對于特定起始時間的一個度量。
- 許多技術都可以用來處理實驗型時間序列,其索引可能是一個整數或浮點數(表示從實驗開始算起已經過去的時間)。最簡單也最常見的時間序列都是用時間 戳進行索引的。
- pandas提供了一組標準的時間序列處理工具和數據算法。可以高效處理非常大的時間序列,輕松進行切片/切塊、聚合、對定期、不定期的時間序列進行重采樣等。這些工具大部分都對金融和經濟數據尤為重要,也可以用來分析服務器日志數據。
二 日期和時間數據類型及工具
1 日期和時間數據類型
- python標準庫包含用于日期(date)和時間(time)數據的數據類型,而且還有日歷方面的功能。主要用到datetime、time以及calendar模塊。datetime.datetime是用得最多的數據類型。
- datetime以毫秒形式存儲日期和時間,datetime.timedelta表示連個datetime對象之間的時間差
- 可以給datetime對象加上或減去一個或多個timedelta,這樣會產生一個新對象。
- datetime時間模塊數據類型:
- date #以公歷形式存儲的日歷日期
- time # 將時間存儲為時、分、秒、毫秒
- datetime # 存儲日期和時間
- timedelta # 表示兩個datetime值之間的差
2 字符串和datetime的相互轉換
- 利用str或strtfime方法(傳入一個格式化字符串),datetime對象和pandas的Timestamp對象可以被格式化為字符串。
- datetime格式定義:
- %Y 4位數的年
- %y 2位數的年
- %m 2位數的月
- %d 2位數的日
- %H 24小時制的時
- %I 12小時制的時
- %M 2位數的分
- %S 秒
- %w 用整數表示的星期幾[0(星期天),6]
- %U 每年的第幾周(00,53)。星期天被認為是每周的第一天,每年第一個星期天之前得那幾天被認為是第“0周”
- %W 每年的第幾周(00,53)。星期一被認為是每周的第一天,每年第一個星期一之前得那幾天被認為是第“0周”
- %z 時區偏移量
- %F %Y-%m-%d簡寫形式,例如2012-4-18
- %D %m-%d-%y簡寫形式,例如04/18/12
- strptime也可以用這些格式化編碼將字符串轉換為日期。datetime.strptime是通過已知格式進行日期解析的最佳方式。但是每次都要編寫格式定義是很麻煩的事情,尤其是對于一些常見的日期格式。這種情況下,可以用dateutil這個第三方包中的parser.parse方法,dateutil可以解析幾乎所有人類能夠理解的日期表示形式。
- 在國際通用的格式中,日通常出現在月的前面,傳入dayfirst = True即可
- pandas通常用來處理成組日期,還可以處理缺失值。
- datetime對象還有一些特定于當前環境的格式化選項。
三 時間序列基礎
- pandas最基本的時間序列類型就是以時間戳(通常以python字符串或datetime對象表示)為索引的Series。這些datetime對象實際上被放在一個datetimieIndex中
- 跟其他Series一樣,不同索引的時間序列之間的算術運算會自動按日期對齊
- pandas用Numpy的datetime64數據類型以納秒形式存儲時間戳。
1 索引、選取、子集構造
- 由于TimeStamp是Series的一個子類,所以在索引以及數據選取方面它們的行為是一樣的。
- 有一種更為簡便的用法:直接傳入一個可以被解釋為日期的字符串。
- 對于較長的時間序列,只需傳入“年”或“年月”即可輕松選取數據的切片。
- 通過日期進行切片的方式只對規則Series有效。
- 由于大部分時間序列數據都是按照時間先后排序的,因此也可以用不存在于該時間序列中的時間戳對齊進行切片(即范圍查詢)。此外,還有兩個等價的實例方法可以截取兩個日期之間的TimeSeries,after = ‘1/9/2011’,before。
- 這些操作對DataFrame也有效。
2 帶有重復索引的時間序列
- 在某些應用場景中,可能會存在多個觀測數據落在同一個時間點上的情況,通過檢查索引的is_unique屬性,可以知道是否唯一。
- 想要對具有唯一時間戳的數據進行聚合,一個辦法是使用groupby,并傳入level = 0(索引的唯一一層)。
四 日期的范圍、頻率及移動
- pandas中的時間序列一般被認為是不規則的,也就是說,沒有固定的頻率。對于大部分應用程序而言,這是無所謂的。但是,它常常需要以某種相對固定的頻率進行分析,比如每日、每月、每15分鐘(這樣自然會在時間序列中引入缺失值)、幸運的是pandas有一整套標準時間序列頻率以及用于重采樣、頻率推斷、生成固定頻率日期范圍的工具。例如:將一個時間序列轉換為一個具有固定頻率的時間序列,只需調用resample即可。
1 生成日期范圍
- pandas.date_range可用于生成指定長度的DatetimeIndex
- 默認情況下,date_range會產生按天計算的時間點。如果只傳入起始或者結束日期,就還得傳入一個表示一段時間的數字。
- 起始和結束日期定義了日期索引的嚴格邊界。例如:如果想要生成一個由每月最后一個工作日組成的日期索引,可以傳入“BM”頻率,這樣就只會包含時間間隔內(或剛好在邊界上)符合頻率要求的日期。
- date_range默認會保留起始和結束時間戳的時間信息(如果有的話)。
- 有時,雖然起始和結束日期帶有時間信息,但希望產生一組被規范化到午夜的時間戳。normalize可以實現該功能。
2 頻率和日期偏移量
- pandas中的頻率是由一個基礎頻率(base frequency)和一個乘數組成。基礎頻率通常以一個字符串別名組成,比如‘M’表示每月,“H”表示每時。對于每一個基礎頻率,都有一個唄成為日期偏移量(date offset)的對象與之對應。
- 一般來說,無需顯示創建這樣的對象,只需使用諸如“H”或“4H”這樣的字符串別名即可。在基礎頻率前面放一個整數即可創建倍數。
- 大部分偏移量都可以通過加法連接。
- 同理,也可以傳入頻率字符串(如:2h30min),這種頻率可以被高效地解析為等效表達式。
- 有些頻率所描述的時間點并不是均勻分隔的。錨點偏移量。
- 時間序列的基礎頻率:
- D # day 每日歷日
- B # businessday 每工作日
- H # hour 每小時
- T或min # minute 每分鐘
- S # second 每秒
- L或ms # milli 每毫秒
- U # 每微妙
- M # 每月最后一個日歷日
- BM # 每月最后一個工作日
- MS # 每月第一個日歷日
- BMS # 每月第一個工作日
- W-MON/W-TUE… # 從指定的星期幾開始算起、每周
- WOM-1MON… # 產生每月第一個、二、三個星期幾
- Q-JAN/Q-FEB… # 對于以指定月份結束的年度,每季度最后一月的最后一個 日歷日
- BQ-JAN # 對于以指定月份結束的年度,每季度最后一月的最后一個 工作日
- QS-JAN# 對于以指定月份結束的年度,每季度最后一月的第一個 日歷日
- BQS-JAN# 對于以指定月份結束的年度,每季度最后一月的第一個 日歷日
- A-JAN # 每年指定月份的最后一個日歷日
- BA-JAN # 每年指定月份的最后一個工作日
- AS-JAN # 每年指定月份的第一個日歷日
- BAS-JAN # 每年指定月份的第一個工作日
3 移動(超前和滯后)數據
- 移動(shifting)指的是沿著時間軸將數據前移或后移。
- shift同行用于計算一個時間序列或多個時間序列中的百分比變化
- 通過偏移量對日期進行位移。
五 時區處理
1 本地化和轉換
2 操作時區意識型Timestamp對象
3 不同時區之間的運算
六 時期及其算術運算
1 時期的頻率轉換
2 按季度計算的時期頻率
3 將Timestamp轉換為Period(及其反向過程)
4 通過數組創建PeriodIndex
七 重采樣及頻率轉換
- 重采樣指的是將時間序列從一個頻率轉換到另一個頻率的處理過程。將高頻率數據聚合到低頻率成為降采樣,而將低頻率數據轉換到高頻率則成為升采樣。
- pandas對象都帶有一個resample方法,它是各種頻率轉換工作的主力函數。
- resample方法的參數:
- freq # 表示重采樣頻率的字符串或DateOffset
- how = ‘mean’ # 用于產生聚合值的函數名或數組函數
- axis = 0 # 重采樣的軸
- fill_method = None # 升采樣時如何插值
- closed = ‘right’ # 在降采樣中,各時間段的哪一段是閉合的
- label = ‘right’# 在降采樣中,如何設置聚合值的標簽
- loffset = None # 面元標簽的時間校正值
- limit = None # 在前向或后向填充時,允許填充的最大時期數
- kind = None # 聚合到時期或時間戳,默認聚合到時間序列的索引類型
- convention = None # 當重采樣時期時,將低頻率轉換到高頻率所采用的約定
1 降采樣
- 將數據聚合到規整的低頻率是一件非常普通的額時間序列處理任務。待聚合的數據不必擁有固定的頻率,期望的頻率會自動定義聚合的面元邊界,這些面元用于將時間序列拆分為多個片段。
- 用resample對數據進行降采樣時,需要考慮兩樣東西:
- 各區間哪邊是閉合的
- 如何標記各個聚合面元,用區間的開頭還是結尾
- 另一種降采樣的方法是pandas的groupby功能。
2 升采樣和插值
- 將數據從低頻率轉換到高頻率時,就不需要聚合了,會引入缺失值,需要用到fillna和reindex
3 通過時期進行重采樣
- 對采用時期索引的數據進行重采樣是件非常簡單的事情。升采樣要稍微麻煩點,必須決定在新頻率中各區間的哪段用于放置原來的值。
- 由于時期指的是時間區間,所以升采樣和降采樣的規則比較嚴格:
- ① 在降采樣中,目標頻率必須是源頻率的子時期
- ② 在升采樣中,目標頻率必須是源頻率的超時期
- 如果不滿足這些條件,就會引發異常。
八 時間序列繪圖
- 當對DataFrame調用plot時,所有時間序列都被繪制在一個subplot上,并有一個圖例說明哪個是哪個。
- pandas時間序列在繪圖方面還有一個特點,當右鍵點擊并拖拉(放大、縮小)時,日期會動態展開或收縮,且繪圖窗口中的時間區間會被重新格式化。當然,只有在交互模式下使用matplotlib才會有此效果。
九 移動窗口函數
- 在移動窗口(可以帶有指數衰減權數)上計算的各種統計函數也是一類常見于時間序列的數組變換。成為移動窗口函數,其中還包括那些窗口不定長的函數(如指數加權移動平均)。跟其他函數一樣,移動窗口函數也會自動排除缺失值。
- 諸如rolling_meaning 這樣的函數需要指定數量的非NA觀測值。可以修改該行為以解決缺失數據的問題。
- 要計算擴展窗口平均,可以將擴展窗口看做一個特殊的窗口,其長度與時間序列一樣,但只需一期即可計算一個值。
- 對DataFrame調用rolling_mean會將轉換應用到所有的列上。
- 移動窗口和指數加權函數
- rolling _count
- rolling_sum
- rolling_mean
- rolling_median
- rolling_var/rolling_std
- rolling_skew/rolling_kurt
- rolling_min/rolling_max
- rolling_quantile
- rolling_corr/rolling_cov
- rolling_apply
- ewma
- ewmvar/ewmstd
- ewmcorr/ewmcov
1 指數加權函數
- 另一種使用固定大小窗口及相等數觀測值的辦法是,定義一個衰減因子常量,以便使近期的觀測值擁有更大的權數。
- 由于指數加權統計會賦予近期的觀測值更大的權數,因此相對于等權統計,它能適應更快的變化。
2 二元移動函數
- 有些統計運算(如相關系數與協方差)需要在兩個以上的時間序列上執行。
- 假設需要一次性計算多只股票的標準普爾500指數的相關系數。只需要傳入一個TimeSeries和一個DataFrame,rolling_corr就會自動計算TimeSeries與DataFrame各列的額相關系數。
3 用戶自定義的移動窗口函數
- rolling_apply函數使用戶能夠在移動窗口上應用自己設計的數組函數。唯一要求就是:該函數要能從數組的各個片段中產生單個值(即簡約)。
總結
以上是生活随笔為你收集整理的【Python】ime series:时间序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】merge:数据规整化:
- 下一篇: 【风险管理】网贷平台风险类型及管控能力