Pandas必備技能之「時間序列數據處理」

2021-12-29 Python數據之道

轉換的思路是這樣的,以日曆中的周進行聚合,如 '20180702'-'20180708',取該周期內,日線開盤價的第一個值作為周開盤價,日線最高價的最大值作為周最高價,日線最低價的最小值作為周最低價,日線收盤價的最後一個值作為周最收盤價,日線最高價的最大值作為周最高價,日線成交量的求和作為周成交量(手),如下圖黃色方框所示。

我們可以通過 .resample()【4】方法實現上述操作,對 DataFrame 和 Series 都適用。其中,參數 rule 設置需要轉換成的頻率,'1W' 是一周。

具體轉換的代碼如下,日期默認為本周的星期日,如果周期內數據不全,如 '20180722' 這周只有 3 行數據,也會按照上述方法進行轉換。

freq = '1W'
df_weekly = df[['open']].resample(rule=freq).first()
df_weekly['high'] = df['high'].resample(rule=freq).max()
df_weekly['low'] = df['low'].resample(rule=freq).min()
df_weekly['close'] = df['close'].resample(rule=freq).last()
df_weekly['vol'] = df['vol'].resample(rule=freq).sum()

df_weekly

Out[33]: 
            open  high   low  close         vol
trade_date                                     
2018-07-08  9.05  9.05  8.45   8.66  5125563.53
2018-07-15  8.69  9.03  8.58   8.88  4901983.84
2018-07-22  8.85  8.90  8.66   8.70  1590354.68

升採樣:以周線數據轉換日線數據為例。繼續使用上面剛剛轉換好的周線數據,我們再試著把它轉換成日線數據。先通過 .resample('D').asfreq()【5】方法,將周線數據的頻率轉換成日線,效果如下。

df_daily = df_weekly.resample('D').asfreq()
print(df_daily)

Out[52]: 
            open  high   low  close         vol
trade_date                                     
2018-07-08  9.05  9.05  8.45   8.66  5125563.53
2018-07-09   NaN   NaN   NaN    NaN         NaN
2018-07-10   NaN   NaN   NaN    NaN         NaN
2018-07-11   NaN   NaN   NaN    NaN         NaN
2018-07-12   NaN   NaN   NaN    NaN         NaN
2018-07-13   NaN   NaN   NaN    NaN         NaN
2018-07-14   NaN   NaN   NaN    NaN         NaN
2018-07-15  8.69  9.03  8.58   8.88  4901983.84
2018-07-16   NaN   NaN   NaN    NaN         NaN
2018-07-17   NaN   NaN   NaN    NaN         NaN
2018-07-18   NaN   NaN   NaN    NaN         NaN
2018-07-19   NaN   NaN   NaN    NaN         NaN
2018-07-20   NaN   NaN   NaN    NaN         NaN
2018-07-21   NaN   NaN   NaN    NaN         NaN
2018-07-22  8.85  8.90  8.66   8.70  1590354.68

結果中出現了很多空值,需要我們按照一定的方法進行填充,可以通過添加 .ffill() 或者 .bfill() 實現。

其中,.ffill() 代表用前值進行填充,也就是用前面的非空值對後面的 NaN 值進行填充,如 '20180709'-20180714'  的 NaN 值都等於 '20180708' 這一行的非空值,效果如下。

df_daily = df_weekly.resample('D').ffill()
df_daily

Out[54]: 
            open  high   low  close         vol
trade_date                                     
2018-07-08  9.05  9.05  8.45   8.66  5125563.53
2018-07-09  9.05  9.05  8.45   8.66  5125563.53
2018-07-10  9.05  9.05  8.45   8.66  5125563.53
2018-07-11  9.05  9.05  8.45   8.66  5125563.53
2018-07-12  9.05  9.05  8.45   8.66  5125563.53
2018-07-13  9.05  9.05  8.45   8.66  5125563.53
2018-07-14  9.05  9.05  8.45   8.66  5125563.53
2018-07-15  8.69  9.03  8.58   8.88  4901983.84
2018-07-16  8.69  9.03  8.58   8.88  4901983.84
2018-07-17  8.69  9.03  8.58   8.88  4901983.84
2018-07-18  8.69  9.03  8.58   8.88  4901983.84
2018-07-19  8.69  9.03  8.58   8.88  4901983.84
2018-07-20  8.69  9.03  8.58   8.88  4901983.84
2018-07-21  8.69  9.03  8.58   8.88  4901983.84
2018-07-22  8.85  8.90  8.66   8.70  1590354.68

同理,.bfill() 代表用後值對空值進行填充,效果如下。

df_daily = df_weekly.resample('D').bfill()
df_daily
Out[55]: 
            open  high   low  close         vol
trade_date                                     
2018-07-08  9.05  9.05  8.45   8.66  5125563.53
2018-07-09  8.69  9.03  8.58   8.88  4901983.84
2018-07-10  8.69  9.03  8.58   8.88  4901983.84
2018-07-11  8.69  9.03  8.58   8.88  4901983.84
2018-07-12  8.69  9.03  8.58   8.88  4901983.84
2018-07-13  8.69  9.03  8.58   8.88  4901983.84
2018-07-14  8.69  9.03  8.58   8.88  4901983.84
2018-07-15  8.69  9.03  8.58   8.88  4901983.84
2018-07-16  8.85  8.90  8.66   8.70  1590354.68
2018-07-17  8.85  8.90  8.66   8.70  1590354.68
2018-07-18  8.85  8.90  8.66   8.70  1590354.68
2018-07-19  8.85  8.90  8.66   8.70  1590354.68
2018-07-20  8.85  8.90  8.66   8.70  1590354.68
2018-07-21  8.85  8.90  8.66   8.70  1590354.68
2018-07-22  8.85  8.90  8.66   8.70  1590354.68

03

時間窗口函數

當我們想要比較數據在相同時間窗口的不同特徵和變化時,可以藉助窗口函數 rolling【6】進行計算。

看一個實例:計算股票收盤價的移動平均值。

df = df[['ts_code', 'close']]
df
Out[58]: 
              ts_code  close
trade_date                  
2018-07-02  000001.SZ   8.61
2018-07-03  000001.SZ   8.67
2018-07-04  000001.SZ   8.61
2018-07-05  000001.SZ   8.60
2018-07-06  000001.SZ   8.66
2018-07-09  000001.SZ   9.03
2018-07-10  000001.SZ   8.98
2018-07-11  000001.SZ   8.78
2018-07-12  000001.SZ   8.88
2018-07-13  000001.SZ   8.88
2018-07-16  000001.SZ   8.73
2018-07-17  000001.SZ   8.72
2018-07-18  000001.SZ   8.70

調用 rolling 函數,通過設置參數 window 的值規定窗口大小,這裡設置為 3,並且調用 .mean() 方法計算窗口期為 3 天的均值,結果如下。

其中,'20180704' 當天的平均值等於 '20180702'-'20180704' 三天的收盤價取平均的結果,'20180705' 當天的平均值等於 '20180703'-'20180705' 三天的收盤價取平均的結果,以此類推。

df['MA3'] = df['close'].rolling(3).mean()
df
Out[76]: 
              ts_code  close       MA3
trade_date                            
2018-07-02  000001.SZ   8.61       NaN
2018-07-03  000001.SZ   8.67       NaN
2018-07-04  000001.SZ   8.61  8.630000
2018-07-05  000001.SZ   8.60  8.626667
2018-07-06  000001.SZ   8.66  8.623333
2018-07-09  000001.SZ   9.03  8.763333
2018-07-10  000001.SZ   8.98  8.890000
2018-07-11  000001.SZ   8.78  8.930000
2018-07-12  000001.SZ   8.88  8.880000
2018-07-13  000001.SZ   8.88  8.846667
2018-07-16  000001.SZ   8.73  8.830000
2018-07-17  000001.SZ   8.72  8.776667
2018-07-18  000001.SZ   8.70  8.716667

還有一個常用的窗口函數是 expanding,每增加一行數據,窗口會相應的增大。比如,我們想計算某隻股票每天的累計漲跌幅,就可以調用此函數。

df = df[['ts_code', 'pct_chg']] # 列pct_chg單位是(%)
Out[71]: 
              ts_code  pct_chg
trade_date                    
2018-07-02  000001.SZ    -5.28
2018-07-03  000001.SZ     0.70
2018-07-04  000001.SZ    -0.69
2018-07-05  000001.SZ    -0.12
2018-07-06  000001.SZ     0.70
2018-07-09  000001.SZ     4.27
2018-07-10  000001.SZ    -0.55
2018-07-11  000001.SZ    -2.23
2018-07-12  000001.SZ     2.78
2018-07-13  000001.SZ     0.00
2018-07-16  000001.SZ    -1.69
2018-07-17  000001.SZ    -0.11
2018-07-18  000001.SZ    -0.23

對列 'pct_chg' 調用窗口函數 expanding,再調用 .sum() 方法求累計值。

df['cum_pct_chg'] = df['pct_chg'].expanding().sum()
df
Out[78]: 
              ts_code  pct_chg  cum_pct_chg
trade_date                                 
2018-07-02  000001.SZ    -5.28        -5.28
2018-07-03  000001.SZ     0.70        -4.58
2018-07-04  000001.SZ    -0.69        -5.27
2018-07-05  000001.SZ    -0.12        -5.39
2018-07-06  000001.SZ     0.70        -4.69
2018-07-09  000001.SZ     4.27        -0.42
2018-07-10  000001.SZ    -0.55        -0.97
2018-07-11  000001.SZ    -2.23        -3.20
2018-07-12  000001.SZ     2.78        -0.42
2018-07-13  000001.SZ     0.00        -0.42
2018-07-16  000001.SZ    -1.69        -2.11
2018-07-17  000001.SZ    -0.11        -2.22
2018-07-18  000001.SZ    -0.23        -2.45

04

總結

本文介紹了 Pandas 庫中處理時間序列數據的幾種常用方法。

在時間格式轉換部分,介紹了兩種將時間轉化成日期類型的方法,分別是通過設置參數 parse_dates 和調用方法 pd.to_datetime() 

接著,介紹了時間周期的轉換,通過調用 .resample() 方法實現,包括降採樣和升採樣。

最後,介紹兩個常用的窗口函數 rolling 和 expanding 

希望大家能靈活掌握本文中提到的方法,並應用到實際工作和學習中去!

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html【1】

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html【2】

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html【3】

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.resample.html【4】

http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.asfreq.html【5】

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rolling.html【6】

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.expanding.html【7】

https://www.datacamp.com/courses/manipulating-time-series-data-in-python【Datacamp】

----End----

 Python數據之道 


據說學Python的只有10%的人關注了這個號,

還有很大潛力

今日主題:時序數據處理,聊聊遇到的坑~

留言格式:暱稱 + day xx + 留言內容(字數不少於15字)

歡迎各位同學加入公眾號讀者分享交流群,在公眾號後臺回復 「微信群」 即可。

同學們,支持就請右下角點!

相關焦點

  • Pandas時間序列詳解 | 輕鬆玩轉Pandas(6)
    前文回顧:Pandas分類數據詳解 | 輕鬆玩轉Pandas(5)Pandas文本數據處理 | 輕鬆玩轉Pandas(4)Pandas缺失值處理 | 輕鬆玩轉Pandas(3)Pandas 內部自帶了很多關於時間序列相關的工具,所以它非常適合處理時間序列。在處理時間序列的的過程中,我們經常會去做以下一些任務:使用 Pandas 可以輕鬆完成以上任務。基礎概述下面列出了 Pandas中 和時間日期相關常用的類以及創建方法。
  • 怎麼用Pandas聚合時間序列數據?
    處理時間序列數據本身就是一個挑戰。時間序列是一種特殊的數據,其數據點在時間上存在相關性。在分析時間序列數據時,你得到結論的效率很大程度上取決於處理時間維度的能力。通常,時間序列數據是需要長期收集的,尤其是當這些數據是來自硬體設備、或表示金融交易的時候。
  • 玩轉Pandas,讓數據處理更easy系列5
    easy系列1玩轉Pandas,讓數據處理更easy系列2玩轉Pandas,讓數據處理更easy系列3玩轉Pandas,讓數據處理更easy系列4以上4篇總結了Pandas主要的兩個數據結構:Series(一維)和DataFrame(二維),系統地介紹了創建,索引,增刪改查Series
  • 如何通過一頓飯來說明NumPy與pandas的功用
    談到數據分析,則離不開談及R語言及R語言與Python在數據分析領域孰優孰劣之爭。首先R語言作為正統統計學軟體,數據分析則是其應有之義,因而相比於Python這個在數據分析領域的新起之秀,R語言算是與Matlab、SAS在同一起跑線上。後發優勢畢竟是可觀的,當Python開始涉足數據分析領域時,其便漸漸形成了與R語言分庭抗禮的趨勢。
  • 數據可視化(二)丨使用pandas和seaborn繪圖
    pandas自身有內建的可視化工具。另一個庫seaborn則是用來做一些統計圖形。導入seaborn會改變matlotlib默認的顏色和繪圖樣式,提高可讀性和美感。即使不適用seaborn的API,也可以利用seaborn來提高可視化的效果。
  • Pandas的介紹與基本使用
    2、Pandas能幹什麼Pandas的主要功能:具備對應其功能的數據結構DataFrame,Series集成時間序列功能提供豐富的數學運算和操作靈活處理缺失數據.....Series是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標籤(索引)組成。
  • Pandas文本數據處理 | 輕鬆玩轉Pandas(4)
    前文回顧:Pandas缺失值處理 | 輕鬆玩轉Pandas(3)Pandas基本功能詳解 | 輕鬆玩轉Pandas(2)Pandas數據結構詳解 | 輕鬆玩轉Pandas(1)內容目錄1. 為什麼要用str屬性2.
  • 十分鐘學習pandas!pandas常用操作總結!
    學習Python, 當然少不了pandas,pandas是python數據科學中的必備工具,熟練使用pandas是從sql boy/girl 跨越到一名優秀的數據分析師傅的必備技能。這篇pandas常用操作總結幫大家回顧下pandas的常用語法,尤其是我們分析數據時常用的方法。
  • pandas數據可視化原來也這麼厲害
    作者:小伍哥 來源:AI入門學習(公眾號)在python中,常見的數據可視化庫有3個:matplotlib:最常用的庫,可以算作可視化的必備技能庫,比較底層,api多,學起來不太容易。比如這個圖,就非常厲害:畫圖神器pyecharts-旭日圖Pandas:而今天要講的是Pandas的可視化,Pandas主要作為數據分析的庫,雖然沒有上述三個庫那個強大,但是勝在方便,在數據分析的過程中,只要一行代碼就能實現。並且圖形也非常漂亮。
  • pandas數據處理:常用卻不甚了解的函數,pd.read_excel()
    人們經常用pandas處理表格型數據,時常需要讀入excel表格數據,很多人一般都是直接這麼用:pd.read_excel(「文件路徑文件名」),再多一點的設置可能是轉義一下路徑中的斜槓,一旦原始的excel表不是很規整,這樣簡單讀入勢必報錯!
  • Pandas GUI:如何輕鬆獲取Pandas數據幀?
    可以通過以下幾種方式安裝PandasGUI:# from PyPipip install pandasguior# from Githubpip install git+https://github.com/adamerose/pandasgui.git接下來
  • 別再用Pandas處理大數據了!現在你擁有更好的選擇
    圖源:unsplash眾所周知,Pandas是最好的探索性數據分析工具之一。但它並非對於每個工作來說都是最佳選擇,大數據處理就與它「氣場不合」。Pandas並不具備多處理器,並且處理較大的數據集速度很慢。筆者消耗在等待Pandas讀取一堆文件或對其進行匯總計算上的時間太多太多了。最近,筆者發現了一個更好的工具可以更新數據處理管道,使這些CPU內核正常工作!筆者使用該工具進行繁重的數據處理,例如讀取包含10 G數據的多個文件,對其進行過濾並匯總。
  • Python中的時間序列數據可視化的完整指南
    時間序列數據在許多不同的行業中都非常重要。它在研究、金融行業、製藥、社交媒體、網絡服務等領域尤為重要。對時間序列數據的分析也變得越來越重要。在分析中有什麼比一些好的可視化效果更好呢?沒有一些視覺效果,任何類型的數據分析都是不完整的。因為一個好的情節比20頁的報告更能讓你理解。因此,本文是關於時間序列數據可視化的。
  • 圖解Pandas數據合併:concat、join、append
    concat+join+append 在上一篇文章中介紹過pandas中最為常用的一個合併函數merge的使用,本文中介紹的是另外3個與合併操作相關的函數:Pandas連載 本文是Pandas數據分析庫的第15篇,歡迎閱讀:
  • Python基礎 | 為什麼需要Pandas的DataFrame類型
    ,經常會使用到的一個庫,提供了非常豐富的數據類型和方法,以簡化對數據的處理和分析。前面幾篇文章已經介紹了Python自帶的list()以及強大的numpy提供的ndarray類型,這些數據類型還不夠強大嗎?為什麼還需要新的數據類型呢?在學習新的知識的時候,一方面需要了解這個新的概念是什麼,另外還需要了解為什麼需要學習這個新的知識,以往的知識不能解決問題嗎?不能滿足需要嗎?只有搞明白了為什麼的問題,才能靈活的應用新的知識和技能解決問題。
  • Pandas數據清洗系列:DataFrame.sample方法方法詳解
    從今天開始,我們開始更新pandas數據清洗系列。今天我們來學習pandas中的DataFrame.sample方法。pandas數據清洗系列開篇先介紹這個方法並沒有什麼特殊含義,主要是因為今天工作中剛好用到了這個方法。現在只不過是趁熱打鐵,將其整理成文而已。
  • 加速數據分析,這12種高效Numpy和Pandas函數為你保駕護航
    接下來看一看 Pandas 數據分析庫的 6 種函數。Pandas 數據統計包的 6 種高效函數Pandas 也是一個 Python 包,它提供了快速、靈活以及具有顯著表達能力的數據結構,旨在使處理結構化 (表格化、多維、異構) 和時間序列數據變得既簡單又直觀。
  • Pandas知識點-DataFrame數據結構介紹
    開發Pandas的初衷是為了方便進行金融數據分析,現在Pandas的功能越來越豐富,應用範圍也越來越廣,幾乎所有需要做數據處理的地方都可以派上用場。Pandas基於numpy和matplotlib開發,既具有numpy的高性能數據處理能力,也具有matplotlib的繪圖能力。
  • 從何開始學習數據科學?小哥用親身經歷告訴你如何少走彎路
    價格:免費連結: https://www.kaggle.com/learn/pythonPandasPandas將為我們提供開始使用Python處理數據的技能。價格:免費連結:https://www.kaggle.com/learn/pandas數據可視化數據可視化也許是最被低估的技能之一,但它也是最重要的技能之一。它將使你完全了解要使用的數據。
  • 聚類的Python實現(一):數據導入和處理
    庫導入在這裡用到了os用來處理路徑,numpy、pandas都是數據分析處理的常用庫,matplotlib作簡單的圖形看指標分布,重頭戲就是sklearn啦,用來完成我們的聚類建模。首先載入原數據,pandas為我們提供了多種方案,不論是csv、excel或是使用sql從資料庫中提取,都並不困難,本例中從csv讀入。