• 登录
Skip to content

一起大数据-技术文章心得

一起大数据网由数据爱好者发起并维护,专注数据分析、挖掘、大数据相关领域的技术分享、交流。不定期组织爱好者聚会,期待通过跨行业的交流和碰撞,更好的推进各领域数据的价值落地。

Menu
  • 首页
  • 大数据案例
  • 数据&电子书
  • 视频
    • Excel视频
    • VBA视频
    • Mysql视频
    • 统计学视频
    • SPSS视频
    • R视频
    • SAS视频
    • Python视频
    • 数据挖掘视频
    • 龙星计划-数据挖掘
    • 大数据视频
    • Machine Learning with Python
  • 理论
    • 统计学
    • 数据分析
    • 机器学习
    • 大数据
  • 软件
    • Excel
    • Modeler
    • Python
    • R
    • SAS
    • SPSS
    • SQL
    • PostgreSQL
    • KNIME
  • 技术教程
    • SQL教程
    • SPSS简明教程
    • SAS教程
    • The Little SAS Book
    • SAS EG教程
    • R语言教程
    • Python3教程
    • IT 技术速查手册
    • Data Mining With Python and R
    • SAS Enterprise Miner
  • 问答社区
  • 我要提问
Menu

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

Posted on 2022年5月27日

进行金融数据分析或量化研究时,总避免不了时间序列数据的处理,时间序列是指在一定时间内按时间顺序测量的某个变量的取值序列。常见的时间序列数据有一天内随着时间变化的温度序列,又或者交易时间内不断波动的股票价格序列。Pandas也因其强大的时序处理能力而被广泛应用于金融数据分析,这篇文章为大家介绍一下Pandas中的时间序列处理,所使用的数据是上证指数2019年的行情数据。

时间相关的数据类型

Pandas时序处理中最常见的两种数据类型为datetime和timedelta。一个datetime可以如下图所示:

datetime顾名思义就是既有日期date也有时间time,表示一个具体的时间点(时间戳)。timedelta则表示两个时间点之间的差,比如2020-01-01和2020-01-02之间的timedelta即为一天,相信并不难理解。

将时间列转换为时间格式

大多数时候,我们是从csv文件中导入数据,此时Dataframe中对应的时间列是字符串的形式,如下:

In [5]: data.trade_date.head()
Out[5]:
0    20190102
1    20190103
2    20190104
3    20190107
4    20190108
Name: trade_date, dtype: object

运用pd.to_datetime(),可以将对应的列转换为Pandas中的datetime64类型,便于后期的处理

In [11]: data["trade_date"] = pd.to_datetime(data.trade_date)

In [12]: data.trade_date.head()
Out[12]:
0   2019-01-02
1   2019-01-03
2   2019-01-04
3   2019-01-07
4   2019-01-08
Name: trade_date, dtype: datetime64[ns]

时间序列的索引

时间序列中索引和Pandas普通的索引类似,大多时候调用.loc[index,columns]进行相应的索引,直接上代码看看

In [20]: data1 = data.set_index("trade_date")

# 2019年6月的数据
In [21]: data1.loc["2019-06"].head()
Out[21]:
                close       open       high        low
trade_date
2019-06-03  2890.0809  2901.7424  2920.8292  2875.9019
2019-06-04  2862.2803  2887.6405  2888.3861  2851.9728
2019-06-05  2861.4181  2882.9369  2888.7676  2858.5719
2019-06-06  2827.7978  2862.3327  2862.3327  2822.1853
2019-06-10  2852.1302  2833.0145  2861.1310  2824.3554

# 2019年6月-2019年8月的数据
In [22]: data1.loc["2019-06":"2019-08"].tail()
Out[22]:
                close       open       high        low
trade_date
2019-08-26  2863.5673  2851.0158  2870.4939  2849.2381
2019-08-27  2902.1932  2879.5154  2919.6444  2879.4060
2019-08-28  2893.7564  2901.6267  2905.4354  2887.0115
2019-08-29  2890.9192  2895.9991  2898.6046  2878.5878
2019-08-30  2886.2365  2907.3825  2914.5767  2874.1028

提取出时间/日期的属性

在时序数据处理过程中,经常需要实现下述需求:

  • 求某个日期对应的星期数(2019-06-05是第几周)
  • 判断一个日期是周几(2020-01-01是周几)
  • 判断某一日期是第几季度(2019-07-08属于哪个季度)

……

当数据中的时间列(本数据中为trade_date列)已经转换为datetime64格式时,仅需调用.dt接口,即可快速求得想要的结果,下表中列出了.dt接口所提供的常见属性:

具体演示一下(下面仅显示2019-01-02的信息):

# 一年中的第几天
In [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'

resample

resample翻译过来是重采样的意思,官方文档中是这么描述resample的

resample() is a time-based groupby

翻译过来就是基于时间的groupby操作,我个人认为这是Pandas时间序列处理中最重要的功能,也是本文的重中之重。

根据采样是从低频到高频还是从高频到低频可以分为升采样和降采样两种方式,先来看看降采样是啥

  • 降采样

以一个实例来引入,我们使用的数据是上证指数2019年的日级别数据,如果现在想求每季度的平均收盘价,应该怎么操作呢?

从日级别数据求季度级别数据,是从高频到低频的聚合操作,其实就类似于groupby按季度进行操作,用resample来写是这样子

In [32]: data.resample('Q',on='trade_date')["close"].mean()
Out[32]:
trade_date
2019-03-31    2792.941622
2019-06-30    3010.354672
2019-09-30    2923.136748
2019-12-31    2946.752270
Freq: Q-DEC, Name: close, dtype: float64

其中'Q'是以季度为频率进行采样,on指定datetime列(如果索引为Datetimeindex,则on不需要指定,默认依据索引进行降采样)。整个过程图解如下:

整个过程其实就是一个groupby过程:

  • 对原有的数据按照指定的频率进行切分,分到不同的group中
  • 对不同的group执行操作
  • 整合操作结果

其中,切分的频率可以为任何时间频率,可以为季度Q、月度M、星期W、N天ND,也可以为时H、分T,当然,如果切分后的频率小于原有的时间频率,就是我们下面要讲的升采样。

  • 升采样

当采样的频率低于原有的频率时,即为升采样。升采样是对原有的时间粒度更为细粒度的划分,所以升采样时会产生缺失值。下面取2019-01-02至2019-01-03的数据按照6H的频率演示一下:

In [24]: example
Out[24]:
                close
trade_date
2019-01-02  2465.2910
2019-01-03  2464.3628

In [25]: example.resample('6H').asfreq()
Out[25]:
                         close
trade_date
2019-01-02 00:00:00  2465.2910
2019-01-02 06:00:00        NaN
2019-01-02 12:00:00        NaN
2019-01-02 18:00:00        NaN
2019-01-03 00:00:00  2464.3628

对resample后的结果应用.asfreq()会返回新频率下的结果。可以看到升采样后产生了缺失值。如果想要填充缺失值可以采用向后填充.bfill()或向前填充.ffill()的方式:

# 向前填充,缺失值取2465.2910进行填充
In [29]: example.resample('6H').ffill()
Out[29]:
                         close
trade_date
2019-01-02 00:00:00  2465.2910
2019-01-02 06:00:00  2465.2910
2019-01-02 12:00:00  2465.2910
2019-01-02 18:00:00  2465.2910
2019-01-03 00:00:00  2464.3628

# 向后填充,缺失值取2464.3628进行填充
In [30]: example.resample('6H').bfill()
Out[30]:
                         close
trade_date
2019-01-02 00:00:00  2465.2910
2019-01-02 06:00:00  2464.3628
2019-01-02 12:00:00  2464.3628
2019-01-02 18:00:00  2464.3628
2019-01-03 00:00:00  2464.3628

总结一下resample,resample可以对原有的时间序列进行任何频率freq的采样,如果从低频到高频为升采样,高频到低频为降采样。整个操作过程和groupby基本一致,所以也可以对resample后的对象进行apply和transform等操作,具体操作和原理这里就不多解释了,类比于groupby即可

恭喜你,又看完一篇文章,扫码领个红包吧!图片

推荐访问

欢迎加入我们的付费交流社群,增长见识,互帮互助! 自2023-05-01起正式运营。
图片

数据分析交流:数据分析交流
Excel学习: Excel学习交流
Python交流:一起学习Python(数据分
SQL交流:一起学习SQL(数据分析
微博:一起大数据

最新提问

  • 统计方面的3个Python包
  • 更新R及Rstudio
  • TFP CausalImpact:一个Python包,用于估计设计干预对时间序列的因果效应
  • 根据公式的结构,写出计算的表达式,并结算结果
  • excel中提取超级链接公式中的链接地址
  • 用python解析公式并进行可视化
  • Python设置镜像源默认为清华的方法
  • VAR、VMA、VARMA 和 ARIMA
  • Python 的表达式解析库来解析公式
  • PandasAI:一个Python库,将生成式AI能力集成到Pandas中,允许进行高级数据分析任务,例如数据合成和增强

文章标签

AMOS CBC Excel GBDT KNN Modeler Mysql pandas PostgreSQL python python数据可视化 R SAS sklearn SPSS SQL SVM Tableau TensorFlow VBA 主成分分析 关联规则 决策树 协同过滤 可视化 因子分析 大数据 大数据分析 推荐系统 数据分析 数据可视化 数据挖掘 数据透视表 文本挖掘 时间序列 机器学习 深度学习 神经网络 结构方程 统计学 联合分析 聚类 聚类分析 逻辑回归 随机森林
©2023 一起大数据-技术文章心得 | Design: Newspaperly WordPress Theme