pandas 时序统计的高级用法!

本文详细介绍了Pandas库中时间序列数据的高级重采样功能,包括规则定义、开闭区间设置、标签控制、上/下采样、填充方法以及agg、apply、transform和pipe等高级应用。通过实例演示了如何利用这些方法进行数据频率转换和聚合操作。
摘要由CSDN通过智能技术生成

本次介绍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全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

### 回答1: Pandas是一个强大的数据分析库,而iloc是其提供的一种用于按照位置选择数据的方法。iloc的高级用法可以分为以下几点: 1. 多轴选择:可以使用iloc同时选择行和列。例如,df.iloc[0:5, 1:3]表示选择第1到5行的第2到3列的数据。 2. 使用布尔数组选择数据:可以使用布尔数组来过滤数据。通过将布尔数组作为iloc的索引,选择满足条件的数据。例如,df.iloc[boolean_array, :]表示选择布尔数组为True的所有行。 3. 使用函数选择数据:可以使用函数来选择数据。通过将函数作为iloc的索引,选择满足函数条件的数据。例如,df.iloc[lambda x: x['column_name'] > 0, :]表示选择满足列`column_name`大于0的所有行。 4. 使用切片选择数据:可以使用切片来选择数据。通过在iloc中使用切片,选择位于切片范围内的数据。例如,df.iloc[:, ::2]表示选择所有列中索引为奇数的数据。 5. 使用负索引选择数据:可以使用负数来选择数据,表示从末尾开始的位置。通过在iloc中使用负索引,选择从末尾开始的位置的数据。例如,df.iloc[:, -2:]表示选择倒数第二列和最后一列的数据。 总结来说,pandas的iloc方法可以通过多种方式来选择数据,包括多轴选择、布尔数组选择、函数选择、切片选择和负索引选择。这些高级用法可以帮助我们更灵活地、更精确地选择需要的数据。 ### 回答2: Pandas的iloc是用于通过整数位置索引选择数据的高级用法。它的功能类似于传统的Python列表索引,但在Pandas中,iloc可以用于选择DataFrame或Series对象中特定位置的数据。 iloc的语法为:df.iloc[row_index, column_index]。 在使用iloc时,可以通过标签或整数索引来选择数据。如果只给出一个参数,则该参数表示行索引,返回指定行的所有数据。如果给出两个参数,则第一个参数表示行索引,第二个参数表示列索引,返回指定行和列的数据。 iloc使用整数位置索引,索引值从0开始。如果需要选择多行或多列,可以使用切片和列表等方式来指定范围。例如,df.iloc[1:3, :]表示选择第二行到第三行的所有列。 使用iloc可以进行一些高级操作,例如筛选和重组数据。可以根据行索引或列索引对数据进行选择,并将它们组合成新的DataFrame或Series对象。例如,df.iloc[:, [0, 2]]表示选择所有行的第一列和第三列,然后将它们组合成一个新的DataFrame。 另一个高级用法是使用iloc进行条件筛选。可以结合逻辑运算符和布尔条件来选择满足条件的数据。例如,df.iloc[df['column1']>50]表示选择列column1中数值大于50的行。 总之,Pandas的iloc提供了一种强大而灵活的方法来选择DataFrame和Series对象中的数据。通过配合使用标签和整数索引,可以实现对数据的高级操作,包括选择、筛选和重组等操作,提高数据处理的效率和准确性。 ### 回答3: Pandas中的iloc是一种用于通过行和列的位置进行索引的方法,它可以用来有效地访问和操作DataFrame中的数据。以下是pandas iloc的一些高级用法: 1. 单个元素访问:可以使用`iloc[row_index, col_index]`的方式访问单个元素。索引从0开始,可以使用负数表示从末尾开始索引。例如,`df.iloc[0, 0]`可以访问DataFrame的第一个元素。 2. 切片操作:可以使用切片操作来选择一部分数据。例如,`df.iloc[1:3, 0:2]`表示选择从第1行到第2行,从第0列到第1列的数据。 3. 特殊索引方式:iloc还支持使用布尔索引、列表索引和函数索引等特殊的索引方式。例如,`df.iloc[[0,2,4], :]`表示选择第1、3和5行的所有列。 4. 访问行或列:如果只想选择一整行或一整列,可以使用`:`作为索引。例如,`df.iloc[:, 1]`表示选择所有行的第2列。 5. 使用函数:除了直接使用索引,还可以使用函数来对数据进行筛选和操作。例如,可以使用lambda函数来选择大于某个值的数据:`df.iloc[lambda x: x['column'] > threshold]`。 总之,pandas iloc提供了强大的方法来选择、访问和操作DataFrame中的数据。通过熟练使用它的语法,我们可以更加灵活地进行数据处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值