本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  我们在使用pandas分析处理时间序列数据时,经常需要对原始时间粒度下的数据,按照不同的时间粒度进行分组聚合运算,譬如基于每个交易日的股票收盘价,计算每个月的最低和最高收盘价。

  而在pandas中,针对不同的应用场景,我们可以使用resample()groupby()以及Grouper()来非常高效快捷地完成此类任务。

图1

2 在pandas中进行时间分组聚合

  在pandas中根据具体任务场景的不同,对时间序列进行分组聚合可通过以下两类方式实现:

2.1 利用resample()对时序数据进行分组聚合

  resample原始的意思是重采样,可分为上采样下采样,而我们通常情况下使用的都是下采样,也就是从高频的数据中按照一定规则计算出更低频的数据,就像我们一开始说的对每日数据按月汇总那样。

  如果你熟悉pandas中的groupby()分组运算,那么你就可以很快地理解resample()的使用方式,它本质上就是在对时间序列数据进行“分组”,最基础的参数为rule,用于设置按照何种方式进行重采样,就像下面的例子那样:

import pandas as pd

# 记录了2013-02-08到2018-02-07之间每个交易日苹果公司的股价
AAPL = pd.read_csv('AAPL.csv', parse_dates=['date']) # 以月为统计窗口计算每月股票最高收盘价
(
AAPL
.set_index('date') # 设置date为index
.resample('M') # 以月为单位
.agg({
'close': ['max', 'min']
})
)

图2

  可以看到,在上面的例子中,我们对index为日期时间类型的DataFrame应用resample()方法,传入的参数'M'resample第一个位置上的参数rule,用于确定时间窗口的规则,譬如这里的字符串'M'就代表月且聚合结果中显示对应月的最后一天,常用的固化的时间窗口规则如下表所示:

规则 说明
W 星期
M 月,显示为当月最后一天
MS 月,显示为当月第一天
Q 季度,显示为当季最后一天
QS 季度,显示为当季第一天
A 年,显示为当年最后一天
AS 年,显示为当年第一天
D
H 小时T
T或min 分钟
S
L或 ms 毫秒

  且这些规则都可以在前面添加数字实现倍数效果:

# 以6个月为统计窗口计算每月股票平均收盘价且显示为当月第一天
(
AAPL
.set_index('date') # 设置date为index
.resample('6MS') # 以6个月为单位
.agg({
'close': 'mean'
})
)

图3

  且resample()非常贴心之处在于它会自动帮你对齐到规整的时间单位上,譬如我们这里只有交易日才会有记录,如果我们设置的时间单位下无对应记录,也会为你保留带有缺失值记录的时间点:

(
AAPL
.set_index('date') # 设置date为index
.resample('1D') # 以1日为单位
.agg({
'close': 'mean'
})
)

图4

  而通过参数closed我们可以为细粒度的时间单位设置区间闭合方式,譬如我们以2日为单位,将closed设置为'right'时,从第一行记录开始计算所落入的时间窗口时,其对应为时间窗口的右边界,从而影响后续所有时间单元的划分方式:

(
AAPL
.set_index('date') # 设置date为index
.resample('2D', closed='right')
.agg({
'close': 'mean'
})
)

图5

  而即使你的数据框index不是日期时间类型,也可以使用参数on来传入日期时间列名实现同样的效果。

2.2 利用groupby()+Grouper()实现混合分组

  有些情况下,我们不仅仅需要利用时间类型列来分组,也可能需要包含时间类型在内的多个列共同进行分组,这种情况下我们就可以使用到Grouper()

  它通过参数freq传入等价于resample()rule的参数,并利用参数key指定对应的时间类型列名称,但是可以帮助我们创建分组规则后传入groupby()中:

# 分别对苹果与微软每月平均收盘价进行统计
(
pd
.read_csv('AAPL&MSFT.csv', parse_dates=['date'])
.groupby(['Name', pd.Grouper(freq='MS', key='date')])
.agg({
'close': 'mean'
})
)

图6

  且在此种混合分组模式下,我们可以非常方便的配合applytransform等操作,这里就不再赘述。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札99)掌握pandas中的时序数据分组运算的更多相关文章

  1. (数据科学学习手札131)pandas中的常用字符串处理方法总结

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...

  2. (数据科学学习手札52)pandas中的ExcelWriter和ExcelFile

    一.简介 pandas中的ExcelFile()和ExcelWriter(),是pandas中对excel表格文件进行读写相关操作非常方便快捷的类,尤其是在对含有多个sheet的excel文件进行操控 ...

  3. (数据科学学习手札68)pandas中的categorical类型及应用

    一.简介 categorical是pandas中对应分类变量的一种数据类型,与R中的因子型变量比较相似,例如性别.血型等等用于表征类别的变量都可以用其来表示,本文就将针对categorical的相关内 ...

  4. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  5. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  6. (数据科学学习手札19)R中基本统计分析技巧总结

    在获取数据,并且完成数据的清洗之后,首要的事就是对整个数据集进行探索性的研究,这个过程中会利用到各种描述性统计量和推断性统计量来初探变量间和变量内部的基本关系,本篇笔者便基于R,对一些常用的数据探索方 ...

  7. (数据科学学习手札124)pandas 1.3版本主要更新内容一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,pandas发布了其1.3版本 ...

  8. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  9. (数据科学学习手札81)conda+jupyter玩转数据科学环境搭建

    本文示例yaml文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python进行数据分析时,很 ...

随机推荐

  1. CSS兼容性总结一点点

    CSS3的兼容性,除了前缀.还有参数格式的区分,因为仍在变化中,不在这篇文章中讨论. 很想总结一下IE 6 7 8 9 10的兼容性问题,但是我实在不喜欢IE 6 7 8,在Web开发上也很少再调整到 ...

  2. debian修改crontab默认编辑器为vim

    debian终端下默认编辑器为nano,比如crontab -e就会打开nano,这个编辑器用起来很不习惯,想修改为vim,当然,你的debian系统必须先安装vim.如果已经安装vim,请输入如下命 ...

  3. git-关联远程git仓库详细步骤-2

    1.打开git bash,在控制台中输入以下命令:ssh-keygen -t rsa -C "邮箱地址" 结果: fanxi@AT8350 MINGW64 ~$ ssh-keyge ...

  4. Dubbo 初识SPI-Version2.7.5

    1简介 SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在 ...

  5. CSS3之flex布局

    若要使用flex布局,需在父元素上声明" display : flex ",这样它所有的直系子元素就成为flex元素 1.居中 1)垂直居中:align-items : cente ...

  6. tp5 日志的用途以及简单使用

    相信大家对日志这个词都很熟悉,那么日志通常是用来做什么的呢? 找错误和监控 正常来说,日志对维运的帮助是最大的,特别是服务器或者是程序出现错误的时候. 那么现在我们就来看看,tp框架的日志是怎么设置的 ...

  7. Springboot整合163邮箱部署项目时发送不了邮件的解决方案

    部署到腾讯云服务器时项目报错 Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: sm ...

  8. 阿里面试官:小伙子,给我说一下Spring 和 Spring Boot 的区别吧

    前言 对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,相信对 ...

  9. 巧妙使用MindManager图像功能,能够让你的思维导图更精彩

    MindManager是一款多功能思维导图工具软件,有其他软件无法媲美的项目管理和商业规划高级功能.用户们制作思维导图时一定要注意图文并茂,单纯的文字会过于单调.所以接下来,小编就为大家详细介绍Min ...

  10. 苹果电脑下载器Folx迷你窗口有什么用途

    苹果电脑下载器Folx的迷你窗口功能,及时地了解不同任务的下载进度.另外,也可以通过带宽活动窗口了解任务的占用带宽情况,以便及时限制过多的带宽占用.接下来,一起来看看如何操作吧. 图1:软件界面 一. ...