成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Pandas必備技能之“時間序列數據處理”

大數據
時間序列數據作為時間序列分析的基礎,學會如何對它進行巧妙地處理是非常必要的,Python中的Pandas庫為我們提供了強大的時間序列數據處理的方法,本文會介紹其中常用的幾個。

時間序列數據Time Series Data是在不同時間上收集到的數據,這類數據是按時間順序收集到的,用于所描述現象隨時間變化的情況。

時間序列分析廣泛應用于計量經濟學模型中,通過尋找歷史數據中某一現象的發展規律,對未來進行預測。

時間序列數據作為時間序列分析的基礎,學會如何對它進行巧妙地處理是非常必要的,Python中的Pandas庫為我們提供了強大的時間序列數據處理的方法,本文會介紹其中常用的幾個。

【工具】

  • Python 3
  • Tushare

01、時間格式轉換

有時候,我們獲得的原始數據并不是按照時間類型索引進行排列的,需要先進行時間格式的轉換,為后續的操作和分析做準備。

這里介紹兩種方法。第一種方法是用pandas.read_csv導入文件的時候,通過設置參數parse_dates和index_col,直接對日期列進行轉換,并將其設置為索引。關于參數的詳細解釋,請查看文檔【1】。

如下示例中,在沒有設置參數之前,可以觀察到數據集中的索引是數字0-208,'date'列的數據類型也不是日期。

  1. In [8]: data = pd.read_csv('unemployment.csv'
  2. In [9]: data.info() 
  3. <class 'pandas.core.frame.DataFrame'
  4. RangeIndex: 209 entries, 0 to 208 
  5. Data columns (total 2 columns): 
  6. date      209 non-null object 
  7. UNRATE    209 non-null float64 
  8. dtypes: float64(1), object(1) 
  9. memory usage: 3.3+ KB 

設置參數parse_dates = ['date'] ,將數據類型轉換成日期,再設置 index_col = 'date',將這一列用作索引,結果如下。

  1. In [11]: data = pd.read_csv('unemployment.csv', parse_dates=['date'], index_col='date'
  2.  
  3. In [12]: data.info() 
  4. <class 'pandas.core.frame.DataFrame'
  5. DatetimeIndex: 209 entries, 2000-01-01 to 2017-05-01 
  6. Data columns (total 1 columns): 
  7. UNRATE    209 non-null float64 
  8. dtypes: float64(1) 
  9. memory usage: 13.3 KB 

這時,索引變成了日期'20000101'-'2017-05-01',數據類型是datetime。

第二種方法是在已經導入數據的情況下,用pd.to_datetime()【2】將列轉換成日期類型,再用 df.set_index()【3】將其設置為索引,完成轉換。

以tushare.pro上面的日線行情數據為例,我們把'trade_date'列轉換成日期類型,并設置成索引。

  1. import tushare as ts 
  2. import pandas as pd 
  3.  
  4. pd.set_option('expand_frame_repr'False)  # 列太多時不換行 
  5. pro = ts.pro_api() 
  6.  
  7. df = pro.daily(ts_code='000001.SZ', start_date='20180701', end_date='20180718'
  8.  
  9. df.info() 
  10.  
  11. <class 'pandas.core.frame.DataFrame'
  12. RangeIndex: 13 entries, 0 to 12 
  13. Data columns (total 11 columns): 
  14. ts_code       13 non-null object 
  15. trade_date    13 non-null object 
  16. open          13 non-null float64 
  17. high          13 non-null float64 
  18. low           13 non-null float64 
  19. close         13 non-null float64 
  20. pre_close     13 non-null float64 
  21. change        13 non-null float64 
  22. pct_chg       13 non-null float64 
  23. vol           13 non-null float64 
  24. amount        13 non-null float64 
  25. dtypes: float64(9), object(2) 
  26. memory usage: 1.2+ KB 
  27. None 
  28.  
  29.  
  30. df['trade_date'] = pd.to_datetime(df['trade_date']) 
  31. df.set_index('trade_date', inplace=True
  32. df.sort_values('trade_date', ascending=True, inplace=True)  # 升序排列 
  33.  
  34. df.info() 
  35.  
  36. <class 'pandas.core.frame.DataFrame'
  37. DatetimeIndex: 13 entries, 2018-07-02 to 2018-07-18 
  38. Data columns (total 10 columns): 
  39. ts_code      13 non-null object 
  40. open         13 non-null float64 
  41. high         13 non-null float64 
  42. low          13 non-null float64 
  43. close        13 non-null float64 
  44. pre_close    13 non-null float64 
  45. change       13 non-null float64 
  46. pct_chg      13 non-null float64 
  47. vol          13 non-null float64 
  48. amount       13 non-null float64 
  49. dtypes: float64(9), object(1) 
  50. memory usage: 1.1+ KB 

打印出前5行,效果如下。

  1. df.head() 
  2. Out[15]:  
  3.               ts_code  open  high   low  close  pre_close  change  pct_chg         vol       amount 
  4. trade_date                                                                                          
  5. 2018-07-02  000001.SZ  9.05  9.05  8.55   8.61       9.09   -0.48    -5.28  1315520.13  1158545.868 
  6. 2018-07-03  000001.SZ  8.69  8.70  8.45   8.67       8.61    0.06     0.70  1274838.57  1096657.033 
  7. 2018-07-04  000001.SZ  8.63  8.75  8.61   8.61       8.67   -0.06    -0.69   711153.37   617278.559 
  8. 2018-07-05  000001.SZ  8.62  8.73  8.55   8.60       8.61   -0.01    -0.12   835768.77   722169.579 
  9. 2018-07-06  000001.SZ  8.61  8.78  8.45   8.66       8.60    0.06     0.70   988282.69   852071.526 

02、時間周期轉換

在完成時間格式轉換之后,我們就可以進行后續的日期操作了。下面介紹一下如何對時間序列數據進行重采樣resampling。

重采樣指的是將時間序列從⼀個頻率轉換到另⼀個頻率的處理過程。將⾼頻率數據聚合到低頻率稱為降采樣downsampling,如將股票的日線數據轉換成周線數據,⽽將低頻率數據轉換到⾼頻率則稱為升采樣upsampling,如將股票的周線數據轉換成日線數據。

降采樣:以日線數據轉換周線數據為例。繼續使用上面的tushare.pro日線行情數據,選出特定的幾列。

  1. df = df[['ts_code''open''high''low''close''vol']]  # 單位:成交量 (手) 
  2.  
  3.  
  4.               ts_code  open  high   low  close         vol 
  5. trade_date                                                 
  6. 2018-07-02  000001.SZ  9.05  9.05  8.55   8.61  1315520.13 
  7. 2018-07-03  000001.SZ  8.69  8.70  8.45   8.67  1274838.57 
  8. 2018-07-04  000001.SZ  8.63  8.75  8.61   8.61   711153.37 
  9. 2018-07-05  000001.SZ  8.62  8.73  8.55   8.60   835768.77 
  10. 2018-07-06  000001.SZ  8.61  8.78  8.45   8.66   988282.69 
  11. 2018-07-09  000001.SZ  8.69  9.03  8.68   9.03  1409954.60 
  12. 2018-07-10  000001.SZ  9.02  9.02  8.89   8.98   896862.02 
  13. 2018-07-11  000001.SZ  8.76  8.83  8.68   8.78   851296.70 
  14. 2018-07-12  000001.SZ  8.60  8.97  8.58   8.88  1140492.31 
  15. 2018-07-13  000001.SZ  8.92  8.94  8.82   8.88   603378.21 
  16. 2018-07-16  000001.SZ  8.85  8.90  8.69   8.73   689845.58 
  17. 2018-07-17  000001.SZ  8.74  8.75  8.66   8.72   375356.33 
  18. 2018-07-18  000001.SZ  8.75  8.85  8.69   8.70   525152.77 

為了方便大家觀察,把這段時間的日歷附在下面,'2018-07-02'正好是星期一。

Pandas必備技能之“時間序列數據處理”

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

Pandas必備技能之“時間序列數據處理”

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

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

  1. freq = '1W' 
  2. df_weekly = df[['open']].resample(rule=freq).first() 
  3. df_weekly['high'] = df['high'].resample(rule=freq).max() 
  4. df_weekly['low'] = df['low'].resample(rule=freq).min() 
  5. df_weekly['close'] = df['close'].resample(rule=freq).last() 
  6. df_weekly['vol'] = df['vol'].resample(rule=freq).sum() 
  7.  
  8. df_weekly 
  9.  
  10. Out[33]:  
  11.             open  high   low  close         vol 
  12. trade_date                                      
  13. 2018-07-08  9.05  9.05  8.45   8.66  5125563.53 
  14. 2018-07-15  8.69  9.03  8.58   8.88  4901983.84 
  15. 2018-07-22  8.85  8.90  8.66   8.70  1590354.68 

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

  1. df_daily = df_weekly.resample('D').asfreq() 
  2. print(df_daily) 
  3.  
  4. Out[52]:  
  5.             open  high   low  close         vol 
  6. trade_date                                      
  7. 2018-07-08  9.05  9.05  8.45   8.66  5125563.53 
  8. 2018-07-09   NaN   NaN   NaN    NaN         NaN 
  9. 2018-07-10   NaN   NaN   NaN    NaN         NaN 
  10. 2018-07-11   NaN   NaN   NaN    NaN         NaN 
  11. 2018-07-12   NaN   NaN   NaN    NaN         NaN 
  12. 2018-07-13   NaN   NaN   NaN    NaN         NaN 
  13. 2018-07-14   NaN   NaN   NaN    NaN         NaN 
  14. 2018-07-15  8.69  9.03  8.58   8.88  4901983.84 
  15. 2018-07-16   NaN   NaN   NaN    NaN         NaN 
  16. 2018-07-17   NaN   NaN   NaN    NaN         NaN 
  17. 2018-07-18   NaN   NaN   NaN    NaN         NaN 
  18. 2018-07-19   NaN   NaN   NaN    NaN         NaN 
  19. 2018-07-20   NaN   NaN   NaN    NaN         NaN 
  20. 2018-07-21   NaN   NaN   NaN    NaN         NaN 
  21. 2018-07-22  8.85  8.90  8.66   8.70  1590354.68 

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

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

  1. df_daily = df_weekly.resample('D').ffill() 
  2. df_daily 
  3.  
  4. Out[54]:  
  5.             open  high   low  close         vol 
  6. trade_date                                      
  7. 2018-07-08  9.05  9.05  8.45   8.66  5125563.53 
  8. 2018-07-09  9.05  9.05  8.45   8.66  5125563.53 
  9. 2018-07-10  9.05  9.05  8.45   8.66  5125563.53 
  10. 2018-07-11  9.05  9.05  8.45   8.66  5125563.53 
  11. 2018-07-12  9.05  9.05  8.45   8.66  5125563.53 
  12. 2018-07-13  9.05  9.05  8.45   8.66  5125563.53 
  13. 2018-07-14  9.05  9.05  8.45   8.66  5125563.53 
  14. 2018-07-15  8.69  9.03  8.58   8.88  4901983.84 
  15. 2018-07-16  8.69  9.03  8.58   8.88  4901983.84 
  16. 2018-07-17  8.69  9.03  8.58   8.88  4901983.84 
  17. 2018-07-18  8.69  9.03  8.58   8.88  4901983.84 
  18. 2018-07-19  8.69  9.03  8.58   8.88  4901983.84 
  19. 2018-07-20  8.69  9.03  8.58   8.88  4901983.84 
  20. 2018-07-21  8.69  9.03  8.58   8.88  4901983.84 
  21. 2018-07-22  8.85  8.90  8.66   8.70  1590354.68 

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

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

03、時間窗口函數

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

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

  1. df = df[['ts_code''close']] 
  2. df 
  3. Out[58]:  
  4.               ts_code  close 
  5. trade_date                   
  6. 2018-07-02  000001.SZ   8.61 
  7. 2018-07-03  000001.SZ   8.67 
  8. 2018-07-04  000001.SZ   8.61 
  9. 2018-07-05  000001.SZ   8.60 
  10. 2018-07-06  000001.SZ   8.66 
  11. 2018-07-09  000001.SZ   9.03 
  12. 2018-07-10  000001.SZ   8.98 
  13. 2018-07-11  000001.SZ   8.78 
  14. 2018-07-12  000001.SZ   8.88 
  15. 2018-07-13  000001.SZ   8.88 
  16. 2018-07-16  000001.SZ   8.73 
  17. 2018-07-17  000001.SZ   8.72 
  18. 2018-07-18  000001.SZ   8.70 

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

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

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

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

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

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

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

04、總結

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

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

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

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

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

譯者簡介:

Little monster,北京第二外國語學院國際商務專業研一在讀,目前在學習Python編程和量化投資相關知識。

 

責任編輯:未麗燕 來源: 挖地兔
相關推薦

2024-05-08 14:05:03

時間序列數據

2013-08-26 09:36:27

大數據NoSQLMongoDB

2022-11-17 11:52:35

pandasPySpark大數據

2025-02-08 10:58:07

2023-12-12 11:06:37

PythonPandas數據

2023-09-25 13:19:41

pandasPython

2023-03-24 16:41:36

Pandas技巧數據處理

2023-12-18 10:36:46

數據處理PandasPython

2021-07-08 09:51:18

MaxCompute SQL數據處理

2015-03-02 16:48:40

數據處理大數據原則

2023-12-05 08:47:30

Pandas數據處理

2020-12-14 14:16:34

Pandas數據預處理

2012-06-26 10:03:06

海量數據處理

2025-03-11 14:09:04

2023-12-13 13:23:21

GPUPandas

2022-07-07 10:46:51

數據處理

2017-11-02 13:20:08

數據處理PythonNumpy

2011-08-18 09:43:45

Bloom Filte海量數據

2023-03-30 10:22:42

數據處理前端

2019-08-27 17:32:10

數據處理PandasPython
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕av亚洲精品一部二部 | 91精品国产综合久久精品图片 | 国产精品久久久亚洲 | 亚洲瑟瑟 | 国产精品二区三区 | 最新国产视频 | 中文字幕第二区 | 天天在线操 | 精品1区 | 日韩久久精品视频 | 亚洲小视频在线播放 | 91秦先生艺校小琴 | 天天射网站 | 久久国产成人午夜av影院武则天 | 在线一区二区国产 | 久久久69 | 免费黄色的视频 | 午夜寂寞福利视频 | 91久久精品一区二区二区 | 亚洲一区视频在线 | 夜夜夜夜夜夜曰天天天 | 羞羞色视频 | 久草色播| 91麻豆精品一区二区三区 | 欧美一区二区三区四区视频 | 国产亚洲精品美女久久久久久久久久 | 久久久久久久久久毛片 | 成年人黄色免费视频 | 精品国产欧美一区二区 | 国产一区成人 | 天天色天天色 | 日本一本在线 | xxx视频| 欧美一区不卡 | 波多野结衣中文字幕一区二区三区 | 亚洲精品一区二区冲田杏梨 | 国产三区四区 | 色综合天天天天做夜夜夜夜做 | 欧美一区在线看 | 成人在线免费电影 | 91在线观看 |