pandas 时序统计的高级用法!

Pandas中df.resample()函数详解||量化交易K线转换、数据聚合、重采样 pandas.DataFrame.resample 官方文档 DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0, on=None, level=N... 阅读详情

本次介绍pandas时间统计分析的一个高级用法–重采样。

重采样指的是时间重采样,就是将时间序列从一个频率转换到另一个频率上,对应数据也跟着频率进行变化。比如时间序列数据是以天为周期的,通过重采样我们可以将其转换为按分钟、小时、周、月、季度等等的其他周期上。根据转换的频率精度可分为向上采样和向下采样。

  • 向上采样:转换到更细颗粒度的频率,比如将天转为小时、分钟、秒等

  • 向下采样:转换到更粗颗粒度的频率,比如将天转为周、月、季度、年等

resample用法

pandas中时间重采样的方法是resample(),可以对series和dataframe对象操作。由于重采样默认对索引执行变换,因此索引必须是时间类型,或者通过on指定要重采样的时间类型的column列。

用法:  
pandas.DataFrame.resample()  
pandas.Series.resample()  
------  
返回:Resampler对象  

参数:

  • rule:定义重采样的规则,DateOffset,Timedelta或str类型,当为str类型时,其参数及含义如下表所示

  • axis:指定轴方向,str类型,默认为0

  • 0:代表索引

  • 1:代表列

  • closed:指定时间频率分组的左右闭合状态,默认M,A,Q,BM,BA,BQ,W右闭合,其余均是左闭合

  • left:指定左闭合

  • right:指定右闭合

  • label:指定左或右边界作为分组标签,默认M,A,Q,BM,BA,BQ,W以右边界为分组标签,其余均是以左边界为分组标签

  • left:以左边界为分组标签

  • right:以右边界为分组标签

  • kind:将结果索引转化为指定的时间类型

  • timestamp:将结果索引转换为DateTimeIndex

  • period:将结果索引转换为PeriodIndex

  • on:对于dataframe,指定被重采样的列,且列必须是时间类型

  • level:对于多级索引,指定要被重采样的索引层级,int或str类型。

  • int:索引层级

  • str:索引层级名称

  • origin:调整时间分组的起点。Timestamp或str类型,当为str时:

  • epoch:1970-01-01

  • start:时间序列的第一个值

  • start_day:时间序列第一天的午夜

  • end:时间序列的最后一个值

  • end_day:最后一天的午夜

  • offset:对origin添加的偏移量,Timedelta或str类型

  • group_keys:指定是否在结果索引包含分组keys,当采样对象使用了.apply()方法,默认False不包含

举例:

1)指定列名

resample默认只对索引对象操作,换句话说,默认情况下索引必须是时间类型的数据,否则执行会报错。

对于dataframe而言,如不想对索引重采样,可以通过on参数选择一个column列代替索引进行重采样操作。

# 将时间类型索引重置,变为column列  
df.reset_index(drop=False,inplace=True)  
# 通过参数on指定时间类型的列名,也可以实现重采样  
df.resample('W', on='index')['C_0'].sum().head()  

由于W是默认为右闭且取右边界作为分组标签的,重采样后结果如下。从1/3至1/9(绿色)是完整一周,因此之前非完整部分(黄色)自动归为一周,后面依次按周统计。

2)开闭区间指定

通过closed参数可以控制左右闭合的状态。

默认情况下,M,A,Q,BM,BA,BQ,W是右闭合,其余频率均是左闭合。

下面将天频率转为W周频率(默认是右闭)。我们手动设置左、右闭合进行对比,可以看出二者区别,对于求和结果的影响。

df=generate_sample_data_datetime()  
pd.concat([df.resample('W', closed='left')['C_0'].sum().to_frame(name='left_clsd'),  
           df.resample('W', closed='right')['C_0'].sum().to_frame(name='right_clsd')],  
          axis=1).head(5)  

3)输出结果控制

通过label参数可以控制输出结果的标签。

默认情况下,M,A,Q,BM,BA,BQ,W以分组内右侧边界为输出的标签,其余均是以分组内左边界为标签。

下面将天频率转为W周频率(label默认右边界)。我们手动设置label为左、右进行对比,可以看出第二个采样分组下输出标签的区别。

df=generate_sample_data_datetime()  
df.resample('W', label='left')['C_0'].sum().to_frame(name='left_bnd').head(5)  
df.resample('W', label='right')['C_0'].sum().to_frame(name='right_bnd').head(5)  

4)聚合统计

类似于groupby和窗口的聚合方法, 重采样也适用相关方法,参考pandas分组8个常用技巧!

以下是resample采样后可以支持的描述性统计和计算的内置函数。

内置方法下面例子中会举例说明。

上采样

分为上采样和下采样。通过以下数据举例说明。

# 生成时间索引的数据  
def generate_sample_data_datetime():  
    np.random.seed(123)  
    number_or_rows = 365*2  
    num_cols = 5  
    start_date = '2022-01-01'  
    cols = ["C_0", "C_1", "C_2", "C_3", "C_4"]  
    df = pd.DataFrame(np.random.randint(1, 100, size = (number_or_rows, num_cols)), columns=cols)  
    df.index = pd.date_range(start=start_date, periods=number_or_rows)  
    return df  
df=generate_sample_data_datetime()  

以上生成数据时间索引是以天为频率的。

根据rule参数含义码表,H代表小时的意思,12H也就是12小时。这是resample非常强大的地方,可以把采样定位的非常精确。

下面将天的时间频率转换为12小时的频率,并对新的频率分组后求和。

df.resample('12H')['C_0'].sum().head(10)  

比天颗粒度更小的还可以有分钟、秒、毫秒、微秒、纳秒,可根据实际情况自行设定频率大小。

以上可以看到,上采样的过程中由于频率更高导致采样后数据部分缺失。这时候可以使用上采样的填充方法,方法如下:

1)ffill

只有一个参数limit控制向前填充的数量。

下面将天为频率的数据上采样到8H频率,向前填充1行和2行的结果。

df.resample('8H')['C_0'].ffill(limit=1)  

2)bfill

与向前填充用法一样,下面向后填充1行和2行的结果。

df.resample('8H')['C_0'].bfill(limit=1)  

3)nearest

该方法为就近填充,无确定方向,可能向前或者向后。参数也是limit对填充数量进行控制。以下对缺失部分按最近数据填充1行,结果如下。

df.resample('8H')['C_0'].nearest(limit=1)  

4)fillna

该方法是前三种方法的集合,参数method可设置{'pad'/'ffill','bfill','nearest'}三种,分别代表向前,向后、取最近,同时也可以设置limit进行数量控制,因此该方法可以取代前面三种。

df.resample('8H')['C_0'].fillna(method='pad', limit=1)  

5)asfreq

该方法可以指定固定值对所有缺失部分一次性填充,比如对缺失部分统一填充-999。

df.resample('8H')['C_0'].asfreq(-999)  

6)interpolate

该方法可以使用更高级的算法进行填充。具体方法可通过参数method设置,不详细介绍,这里以linear线性插值方法举例。

df.resample('8H').interpolate(method='linear').applymap(lambda x:round(x,2))  

应用函数

1)agg

如果想同时对多列的聚合,或者对单列赋予多个聚合函数,可以使用agg()聚合方法。

下面进行下采样,将天频率降为周,并对多个变量进行多种聚合操作。

df.resample('W').agg(  
    {  
        'C_0': ['sum', 'mean'],  
        'C_1': lambda x: np.std(x, ddof=1)  
    }  
).head()  

以上结果列名显示了两个层级,如果想去掉层级并自定义结果中的变量名,可通过以下代码实现。

df=generate_sample_data_datetime()  
df.resample('W').agg(  
        C_0_sum=('C_0','sum'),  
        C_0_avg=('C_0','mean'),  
        C_1_delta=('C_1', lambda x:x.max()-x.min())  
).head()  

2)apply

使用apply函数也可以达到agg的聚合效果,以下对多个变量进行不同的聚合函数,其中也可以自定义函数。

def agg_func(x):  
    names = {  
        'C_0_mean': round(x['C_0'].mean(),2),  
        'C_1_sum':  x['C_1'].sum(),  
        'C_2_max':  x['C_2'].max(),  
        'C_3_mean_plus1': round(x['C_3'].mean()+1,2),  
    }  
    return pd.Series(names, index=[ key for key in names.keys()])  
  
df.resample('W').apply(agg_func).head()  

3)transform

transform在分组系列中介绍过,会对原数据进行分组内转换但不改变原索引结构,在重采样中用法一样。transform()函数的使用方法可参考pandas transform 数据转换的 4 个常用技巧!

以下对C_0变量进行采样分组内的累加和排序操作。

df['C_0_cumsum'] = df.resample('W')['C_0'].transform('cumsum')  
df['C_0_rank'] = df.resample('W')['C_0'].transform('rank')  
df.head(10)  

4)pipe

pipe()被称为管道函数,可以对重采样后的resampler对象应用带参数的自定义函数。pipe()函数的使用方法可参考pandas一个优雅的高级应用函数!

它最大的优势在于可以链式使用,每次函数执行后的输出结果可以作为下一个函数的参数,形式如:pipe(func1).pipe(func2),参数可以是series、dataFrames、groupBy对象、或者resampler对象。

通过pipe的链式可以像管道一样按顺序依次执行操作,并且只需要一行代码即可,极大地提高了可读性。

以下对下采样后的C_0和C_1变量进行累加求和操作,然后再对两个求和作差。

df['cumsum_delta'] = df.resample('W')['C_0','C_1'] \  
    .pipe(lambda x:x.cumsum()) \  
    .pipe(lambda x:x['C_1']-x['C_0'])  
df.head(10)  

这里当pipe应用了cumsum()函数后,与transform一样可以返回不改变原索引的结果。

以上就是“pandas 时序统计的高级用法!”的全部内容,希望对你有所帮助。
​
​关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至优快云官方,朋友如果需要可以直接微信扫描下方优快云官方认证二维码免费领取【保证100%免费】。

Pandas进阶拾 时序数据 Pandas进阶拾 时序数据 pandas进阶系列根据datawhale远昊大佬的joyful pandas教程写一些自己的心得和补充,本文部分引用了原教程,并参考了pandas官网 另注:本文是对joyful pandas教程的延伸,完整理解需先阅读joyful pandas教程第拾章 注:前面教程部分没做更改,主要做完了习题,习题部分有很多原创内容,这会来不及更改格式删东西了,明早改一下格式 import numpy as np import pandas as pd 一、时序中的基本对象 时间序列的 阅读详情

相关推荐

pandas中的时序数据分组运算

我们在使用pandas分析处理时间序列数据时,经常需要对原始时间粒度下的数据,按照不同的时间粒度进行分组聚合运算,譬如基于每个交易日的股票收盘价,计算每个月的最低和最高收盘价。而在pandas中,针对不同的应用场景,我们可以使用resample()groupby()以及Grouper()来非常高效快捷地完成此类任务。图1。

2301_78095909的博客 932

Pandas中resample方法详解

Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。重新取样时间序列数据。 方便的时间序列的频率转换和重采样方法。对象必须具有类似datetime的索引(DatetimeIndex、PeriodIndex或TimedeltaIndex),或将类似datetime的值传递给on或level关键字。 DataFrame.resample(rule, axis=0, closed=None, la

weixin_40426830的博客 3万+

pandas多维聚合实战:维度叠加、操作异构与时序对齐

多维聚合是数据分析中连接原始数据与业务决策的关键技术,其核心在于同时处理多个分组维度、混合聚合函数及严格对齐的时序窗口。不同于基础groupby,真实场景要求region×product×time_period三维切片、同一列上并行计算mean/median/range、以及rolling窗口在客户粒度内独立稳定滑动。这类能力直接支撑风控模型特征工程、财务多维报表生成和实时客户价值分层等高价值应用。本文聚焦pandas链式聚合的生产级实践,深入解析分组键哈希优化、unstack列名扁平化、reset_ind

xjwolaile的博客 439

pandas中resample() 函数的应用

函数用于对时间序列数据进行重采样。重采样是指将时间序列数据从一个频率转换为另一个频率的过程,可以实现数据的聚合、降采样或升采样。在这个示例中,我们首先创建了一个包含日期索引的时间序列数据。函数对时间序列数据按周进行重采样,并计算每周的均值。函数还可以和其他聚合函数一起使用,如。下面是一个简单的示例,说明如何使用。表示计算每个时间段的均值。等,以实现不同的聚合需求。

2301_81245389的博客 1537

Pandas中的重采样方法—resample()

       Pandas中的resample()是一个对常规时间序列数据重新采样和频率转换的便捷的方法,可以对原样本重新处理,其语法格式如下: resample(rule,how=None,axis=0,fill_method=None,closed=None,label=None,convention=“start”,kind=None,loffset=None,limit=None,base=0,on=None,level=None

KJ.JK 6735

pandas之resample踩坑

之前强烈安利的pandas函数resample最近坑我不浅,记录下来 一言以蔽之:它娘的会自动补全中间缺的日期 背景是这样:我想按下雨工作日和周末,不下雨工作日和周末,统计按15min集计订单时变量,然后绘制这种图 于是筛选好四部分数据后,依次放入下面代码所示函数中进行集计 resample_data=order_data.resample('15T',on='start_time').agg...

fff2zrx的博客 3413

【Python】pandas 时序统计的高级用法!

本次介绍pandas时间统计分析的一个高级用法--重采样。重采样指的是时间重采样,就是将时间序列从一个频率转换到另一个频率上,对应数据也跟着频率进行变化。比如时间序列数据是以天为周期的,通过重采样我们可以将其转换为按分钟、小时、周、月、季度等等的其他周期上。根据转换的频率精度可分为向上采样和向下采样。向上采样:转换到更细颗粒度的频率,比如将天转为小时、分钟、秒等向下采样:转换到更粗颗粒度的频率,比...

fengdu78的博客 445

pandas基于时序数据计算模型预测推理需要的统计数据(累计时间、长度变化、变化率、方差、均值、最大、最小等):范围内的统计量、变化率、获得数据集最后的几条数据的统计量、变化率、获得范围内的统计量

pandas计算基于某一规则获得范围内的统计量、变化率、获得数据集最后的几条数据的统计量、变化率、获得范围内的统计量 目录 pandas计算基于某一规则获得范围内的统计量、变化率、获得数据集最后的几条数据的统计量、变化率、获得范围内的统计量 #基于某一规则获得范围内的统计量、变化率 #获得数据集最后的几条数据的统计量、变化率 #获得范围内的统计量 #整合代码 #基于某一规则获得范围内的统计量、变化率 # last2 = data_in['plant_length']...

data+scenario+science+insight 485

Python pandas 时序统计的高级用法

本文详细介绍了Python pandas在时序统计中的高级用法,包括数据加载与预处理、时间索引与切片、重采样与窗口函数、缺失值处理以及时序数据的可视化和高级分析技术。通过具体的示例代码,展示了如何有效地处理和分析时序数据,深入挖掘数据中的趋势和模式。掌握这些技巧和方法,可以在实际工作中更高效地进行时序数据分析,提高数据处理的能力和效率。

涛哥聊Python 670

pandas基于时序数据计算模型预测推理需要的统计数据(累计时间、长度变化、变化率、方差、均值、最大、最小等):数据持续的时间(分钟)、获得某一节点之后的数据总变化量、获得范围内的统计量

pandas计算数据持续的时间(分钟)、获得某一节点之后的数据总变化量、获得范围内的统计量 #获得数据持续的时间(分钟) process_sumtime = (parse(data_in['time'].iloc[-1]) - parse(data_in['time'].iloc[0])).seconds/60 #获得某一节点之后的数据总变化量 thickmore70powerdiff = data_in[data_in['plant_length']>= 70].rese..

data+scenario+science+insight 590

从软体机器人到鞋垫分析:Abaqus超弹性材料(Ogden模型)仿真配置全流程

本文详细介绍了Abaqus中Ogden模型在超弹性材料仿真中的应用全流程,涵盖从实验数据导入、参数拟合到模型构建与求解优化的关键步骤。特别针对鞋垫分析等生物力学场景,提供了单元选择、接触设置和并行计算等实用技巧,帮助工程师实现高精度仿真分析。

weixin_42525385的博客 400

滞后特征与滑动窗口统计实战:用 Pandas 构造高质量时序回归样本

在用机器学习(如 LightGBM、XGBoost、CatBoost)解决时序预测(销量预测、服务器流量预测、电网负荷预测)时,决定模型上限的往往不是算法的超参数调优,而是。与传统的表格数据不同,时间序列数据存在严格的。如果直接把原始日期和当前值丢进 GBDT 模型,树模型只能学习到静态的离散切分点,完全无法理解“过去 7 天的平均增长斜率”或者“上个月同期的波动幅度”。。今天我们系统拆解如何用 Pandas 优雅、高效且地构造全套时序特征矩阵。

2401_85575345的博客 2033

【MCU开发规范】:车载MCU开发规范

车载MCU开发规范

1052

Pandas时序数据分析实践—时序数据集

通过简洁明了且高效的案例,我们能够初步领略到Pandas的强大功能。在示例中,我们展示了如何读取数据、构建时序数据集、进行数据分析以及将分析结果进行可视化。整个过程代码量非常少,使得操作简便易行。

肖永威的专栏 2256

Palantir的Ontology:从静态知识图谱到动态业务引擎的跃迁

本文探讨了Palantir的Ontology技术如何将静态知识图谱升级为动态业务引擎。通过引入函数和行动作为核心元素,Ontology实现了业务逻辑的自动化响应与执行,显著提升物流、能源等领域的运营效率。文章详细解析了其混合存储引擎、状态监听网络等关键技术设计,并对比展示了传统架构与Ontology架构的业务价值差异。

weixin_42570296的博客 203

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1146

Pandas时序数据分析实践—概述

无论您是一位跑步爱好者,还是对时序数据分析感兴趣的数据科学家,本系列文章都将为您揭示时序数据分析的魅力。让我们一起踏上这段充满数据洞察力的跑步之旅,用数据为您的跑步训练增色添彩。让 Pandas 引领我们探索时序数据的无限可能!

肖永威的专栏 1020

手把手教你学Simulink--基于Simulink的风力发电系统用双馈电机控制仿真建模

特点高效节能:在广泛的风速范围内保持高效的能量转换。独立控制有功和无功功率:通过控制转子电流实现对有功和无功功率的独立调节。较低的成本:相比直接驱动或全功率变流器方案,成本较低。挑战控制复杂度较高:需要复杂的控制算法来实现有功和无功功率的解耦控制。对电网波动敏感:需要良好的稳定性控制策略以应对电网电压波动。利用Simscape Electrical中的模块构建DFIG的物理模型,配置参数如电阻、电感、极对数等。matlab深色版本% 添加DFIG电机模块。

MHD0815的博客 351

6.Pandas :DataFrame 的使用——索引,列,时序

df.reset_index().set_index("name") 这种形式的代码被称为链式方法调用。当你想将某列设置为新的索引,但同时希望保留原索引(即原索引不丢失,而是作为普通列存在于 DataFrame 中)时,需要先通过。df = df[~df.index.duplicated(keep='first')] # 保留第一个出现的索引。reindex 会接管所有能够匹配新索引的行,而无法匹配的索引会引入含有空值(NaN)的行。在数据合并、连接或追加过程中,可能暂时生成重复索引,后续再统一处理。

weixin_74727170的博客 1853

VS中的C#项目怎样引入另一个项目

场景 在C#项目A中需要引用项目B。 实现 将项目B手动复制到A所在的项目目录下的同一个解决方案中,即与项目A同级的目录下。 在VS中打开项目B,打开解决方案资源管理器--右击解决方案--添加--现有项目 然后找到项目B的.csproj文件打开。 然后看到资源管理器中已经将B添加进来了 点击项目A的引用-右键-添加 将项目下的解决方...

BADAO_LIUMANG_QIZHI的博客 9322

YOLOv9 损失函数解析

YOLOv9作为YOLO系列的最新成员,在损失函数设计上进行了多项创新,重点优化了动态任务对齐机制、多模态定位损失融合以及跨层级梯度协同,进一步提升了检测精度与训练效率。

浩瀚之水的专栏 1293

掌握pandas中的时序数据分组运算

↑↑↑关注后"星标"简说Python 人人都可以简单入门Python、爬虫、数据分析 简说Python推荐来源:Python大数据分析 作者:费弗里 Oneold...

简说Python的博客 1146

多算法数据预测——BP、ELM、LSTM、BiLSTM和SAELSTM,附Matlab源码

本文将为大家介绍基于BP、ELM、LSTM、BiLSTM和SAELSTM多种算法的数据预测,并提供相应的Matlab源码。SAELSTM算法是一种结合自动编码器和LSTM神经网络的深度学习方法,用于时间序列数据预测。ELM算法是一种单层前向神经网络,在单次训练过程中直接产生输出权重,从而具有快速学习和良好推广性能。多算法数据预测——BP、ELM、LSTM、BiLSTM和SAELSTM,附Matlab源码。总体来看,采用多种算法进行数据预测可以提高预测准确率,并可根据不同场景选择适合的算法。

qq_39605374的博客 864

Pandas处理时序数据(初学者必会)!

↑↑↑关注后"星标"Datawhale每日干货&每月组队学习,不错过 Datawhale干货 作者:耿远昊,Datawhale成员,华东师范大学 时序数据...

Datawhale 3365

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Pandas时序数据处理入门

作为一个几乎每天与时间序列数据打交道的人员,我发现pandaPython包在时间序列的操作和分析方面有强大优势。 这篇关于panda时间序列数据处理的基本介绍可以带你入门时间序列分析。本文将主要介绍以下操作: 创建一个日期范围 处理时间戳数据 将字符串数据转换为时间戳 在数据框中索引和切片时间序列数据 重新采样不同时间段的时间序列汇总/汇总统计数据 计算滚动统计数据,如滚动平均...

阿里云云栖号 1379

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 大更新,pandas终于有case_when方法了!
下一篇: pandas实战:用户消费行为画像
壹只小小码农
博客等级 码龄5年 8105粉丝 1333原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值