当前位置: 首页 > 后端技术 > Python

Pandas数据处理——玩转时间序列数据

时间:2023-03-26 15:52:40 Python

微信公众号:《Python读金融》有任何问题或建议欢迎留言公众号在进行金融数据分析或量化研究时,时间序列数据不能避免处理,时间序列是指在一定时间内按时间顺序测量的变量的值序列。常见的时间序列数据是一天内随时间变化的温度序列,或者交易时段波动的股票价格序列。Pandas也因其强大的时间序列处理能力而被广泛应用于金融数据分析。本文介绍了Pandas中的时间序列处理。所用数据为2019年上证指数行情数据。时间相关数据类型Pandas时序处理中最常见的两种数据类型是datetime和timedelta。一个datetime可以如下图所示:顾名思义,datetime既有日期又有时间,代表一个特定的时间点(时间戳)。timedelta表示两个时间点之间的差异。比如2020-01-01和2020-01-02之间的timedelta是一天,这个不难理解。将时间列转换为时间格式大多数时候,我们从csv文件中导入数据。此时Dataframe中对应的时间列为字符串形式,如下:In[5]:data.trade_date.head()Out[5]:020190102120190103220190104320190107420190108Name:trade_date,dtype:object在pandas中使用pd.to_datetime()将对应的列转换为datetime64类型,方便后面的处理在[11]中:data["trade_date"]=pd.to_datetime(data.trade_date)在[12]中:data.trade_date.head()Out[12]:02019-01-0212019-01-0322019-01-0432019-01-0742019-01-08Name:trade_date,dtype:datetime64[ns]时间序列索引时间序列索引类似于Pandas普通索引,大部分时间调用.:data1=data.set_index("trade_date")#2019年6月数据In[21]:data1.loc["2019-06"].head()Out[21]:closeopenhighlowtrade_date2019-06-032890.08092901.74242920.82922875.90192019-06-042862.28032887.64052888.38612851.97282019-06-052861.41812882.93692888.76762858.57192019-06-062827.79782862.33272862.33272822.18532019-06-102852.13022833.01452861.13102824.3554#2019年6月至2019年8月数据In[22]:data1.loc["2019-06":"2019-08"].tail()Out[22]:closeopenhighlowtrade_date2019-08-262863.56732851.01582870.49392849.23812019-08-272902.19322879.51542919.64442879.40602019-08-282893.75642901.62672905.43542887.01152019-08-292890.91922895.99912898.60462878.58782019-08-302886.23652907.38252914.57672874.1028提取出时间/日期的属性在时序数据处理过程中,Itisoften需要实现如下需求:找到某个日期对应的周数(2019-06-05为周数)判断一个日期在周中的日期(2020-01-01为周数)判断日期是Quarter的数字(2019-07-08属于哪个季度)??...当你数据中的时间列(这个数据中的trade_date列)已经转换为datetime64格式,你只需要调用.dt接口为快速获取所需结果,.dt接口提供的常用属性如下表able:一个具体的演示(下面只显示2019-01-02的信息):#ThedayoftheyearIn[13]:data.trade_date.dt.dayofweek[0]Out[13]:2#返回对应的日期In[14]:data.trade_date.dt.date[0]Out[14]:datetime.date(2019,1,2)#返回周数In[15]:data.trade_date.dt.weekofyear[0]Out[15]:1#返回星期几In[16]:data.trade_date.dt.weekday_name[0]Out[16]:'Wednesday'resampleresampleTranslation来这里就是重采样的意思。官方文档描述了resample的resample()isatime-basedgroupby翻译为基于时间的groupby操作。我个人认为这是Pandas时序处理中最重要的功能,也是本文的重中之重。根据采样是从低频到高频还是从高频Lowfrequency可以分为上采样和下采样两种方式。让我们来看看什么是下采样。通过示例介绍下采样。我们使用的数据是2019年上证指数的日线级别数据,如果要问季度收盘均价如何操作?从日级别的数据中找出季度级别的数据,是一个从高频到低频的聚合操作。其实和groupby按季度操作类似。它是这样写在resample中的。在[32]中:data.resample('Q',on='trade_date')["close"].mean()Out[32]:trade_date2019-03-312792.9416222019-06-303010.3546722019-09-302923.1367482019-12-312946.752270Freq,Name:Q-DECdtype:float64其中'Q'以季度的频率采样,on指定datetime列(如果索引是Datetimeindex,on不需要指定,并且默认是根据索引进行下采样)。整个过程如下图所示:整个过程其实就是一个groupby过程:将原始数据按照指定的频率进行划分,分成不同的组,对不同的组进行运算,对运算结果进行整合。其中,分割的频率可以是任意时间频率,可以是Q季度、M月、W周、N日ND,也可以是小时H、分钟T。当然,如果分割后的频率小于原来的时间频率,就是我们下面要讲的上采样。上采样当采样频率低于原始频率时,就是上采样。上采样是对原来的时间粒度进行更细粒度的划分,所以上采样时会产生缺失值。我们拿2019-01-02到2019-01-03的数据,按照6H出现的频率来演示:In[24]:exampleOut[24]:closetrade_date2019-01-022465.29102019-01-032464.3628In[25]]:例子。resample('6H').asfreq()Out[25]:closetrade_date2019-01-0200:00:002465.29102019-01-0206:00:00NaN2019-01-0212:00:00NaN2019-01-0218:00:00NaN2019-01-0300:00:002464.3628在重新采样后对结果应用.asfreq()将以新频率返回结果。可以看出缺失值是在上采样之后产生的。