pandas中时间窗函数rolling的使用

本文介绍了如何使用Pandas的rolling函数处理时间序列数据,通过实例展示了如何设置不同参数以实现如时间窗口大小、最少有效观测点数量等功能,并给出具体应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在建模过程中,我们常常需要需要对有时间关系的数据进行整理。比如我们想要得到某一时刻过去30分钟的销量(产量,速度,消耗量等),传统方法复杂消耗资源较多,pandas提供的rolling使用简单,速度较快。

函数原型和参数说明

DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
  • window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里

  • min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。

  • freq:从0.18版本中已经被舍弃。

  • center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。

    
    # 为方便观察,并列排列
    
    df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
    df.rolling(3, min_periods=1).sum()
    df.rolling(3, min_periods=1, center=True).sum()
        B    B1   B2
    0   0.0  0.0  1.0
    1   1.0  1.0  3.0
    2   2.0  3.0  3.0
    3   NaN  3.0  6.0
    4   4.0  6.0  4.0
  • win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里

  • on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。

  • closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。

  • axis:方向(轴),一般都是0。

举例

一个简单的场景,从A向B运送东西,我们想看一下以3秒作为一个时间窗运送的量。

# A地有两个仓库,都运往B。
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
                  '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
                  'num': [1,2,1,3,4,2,1]}, 
                 index = [pd.Timestamp('20130101 09:00:00'),
                          pd.Timestamp('20130101 09:00:01'),
                          pd.Timestamp('20130101 09:00:02'),
                          pd.Timestamp('20130101 09:00:03'),
                          pd.Timestamp('20130101 09:00:04'),
                          pd.Timestamp('20130101 09:00:05'),
                          pd.Timestamp('20130101 09:00:06')])
#   1   2   num
# 2013-01-01 09:00:00   A1  B1  1
# 2013-01-01 09:00:01   A2  B1  2
# 2013-01-01 09:00:02   A1  B1  1
# 2013-01-01 09:00:03   A2  B1  3
# 2013-01-01 09:00:04   A2  B1  4
# 2013-01-01 09:00:05   A1  B1  2
# 2013-01-01 09:00:06   A2  B1  1

使用rolling进行计算

# 首先我们先对groupby进行聚合(如果只有从A->B,那么不用聚合一个rolling就可以)
# 以9:00:04秒为例,由于时间窗是3s,默认的closed是right,所以我们相加04,03,02秒的num,共有4+3+0=7
df.groupby(['1', '2'])['num'].rolling('3s').sum()
# 1   2                      
# A1  B1  2013-01-01 09:00:00    1.0
#         2013-01-01 09:00:02    2.0
#         2013-01-01 09:00:05    2.0
# A2  B1  2013-01-01 09:00:01    2.0
#         2013-01-01 09:00:03    5.0
#         2013-01-01 09:00:04    7.0
#         2013-01-01 09:00:06    5.0
# Name: num, dtype: float64

由于使用groupby,所以最后的结果是MultiIndex,想使用正常格式在DataFrame上使用reset_index()即可。

### 回答1: 要使用 pandas 写分窗函数,可以使用 `pandas.DataFrame.rolling()` 方法。这个方法可以让你在数据框的每一列上滚动一个指定大小的窗口,并在窗口内计算各种统计信息。 例如,下面的代码会在 `df` 数据框的每一列上滚动一个大小为 3 的窗口,并计算窗口内的最小值: ```python import pandas as pd df = pd.DataFrame(...) # 假设 df 是一个已有的数据框 min_values = df.rolling(3).min() ``` 你也可以使用 `pandas.DataFrame.rolling().apply()` 方法,在窗口内使用自定义的函数进行计算。例如,下面的代码会在 `df` 数据框的每一列上滚动一个大小为 3 的窗口,并使用自定义函数 `custom_func` 在窗口内计算每列的统计信息: ```python def custom_func(x): # 在窗口内计算自定义的统计信息 return ... custom_stats = df.rolling(3).apply(custom_func) ``` 你还可以指定窗口的滑动步长,使用 `pandas.DataFrame.rolling().apply()` 方法的 `min_periods` 参数设置窗口内最少的数据点数,或使用 `pandas.DataFrame.rolling().apply()` 方法的 `center` 参数设置窗口是否居中。 有关使用 pandas 写分窗函数的更多信息,可以参考 ### 回答2: pandas是一个强大的数据分析工具,提供了丰富的函数和方法来处理数据。在pandas中,我们可以使用rolling函数来实现分窗操作。 rolling函数是一种滚动计算的方法,可以将指定大小的窗口应用于数据,并对每个窗口中的数据进行一些计算。对于分窗函数,我们可以使用rolling函数的apply方法来自定义计算操作。 以下是使用pandas编写分窗函数的示例代码: ```python import pandas as pd # 创建一个DataFrame data = {'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]} df = pd.DataFrame(data) # 定义自定义的分窗函数 def window_function(window): # 计算窗口中数值的平均值 return window.mean() # 使用rolling函数的apply方法应用分窗函数 window_size = 3 df['window_average'] = df['value'].rolling(window=window_size).apply(window_function) print(df) ``` 在上述代码中,我们首先创建了一个包含数值的DataFrame。然后定义了一个自定义的分窗函数`window_function`,用于计算窗口中数值的平均值。接下来,我们使用rolling函数的apply方法,传入分窗函数和窗口大小,将分窗函数应用于数据,并将计算结果存储在新的一列`window_average`中。 最后,我们打印DataFrame,可以看到每个窗口的平均值被计算出来并存储在新的一列中。 通过使用rolling函数和自定义的分窗函数,我们可以方便地实现各种不同的分窗操作,对数据进行灵活的处理和分析。 ### 回答3: Pandas是一个常用的Python数据分析库,提供了许多方便的函数和方法来处理和分析数据。在Pandas中,要写一个用于分窗的函数可以通过以下步骤实现: 1. 导入Pandas库:首先,我们需要导入Pandas库,以便使用其中的函数和方法。 2. 创建数据:接下来,我们可以创建一个数据表或从文件中导入数据。假设我们有一个包含时间序列数据的数据表,其中包含日期和数值列。 3. 定义分窗函数:我们可以定义一个函数来进行分窗操作。这个函数可以接收数据表、窗口大小和滑动步长作为参数,并返回分窗后的数据表。 4. 实现分窗逻辑:在分窗函数中,我们可以使用Pandasrolling函数来实现分窗逻辑。rolling函数可以以指定的窗口大小和滑动步长对数据进行分组并应用相应的计算操作。例如,我们可以使用rolling函数计算每个窗口的平均值,返回一个包含平均值的新列。 5. 调用分窗函数:最后,我们可以调用分窗函数,并将数据表、窗口大小和滑动步长作为参数传入。函数将返回一个包含分窗结果的新数据表。 总结起来,要在Pandas中写一个分窗函数,我们需要导入Pandas库、创建数据、定义分窗函数使用rolling函数实现分窗逻辑,最后调用分窗函数并传入相关参数。这样就可以完成对数据的分窗操作,并获得相应的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值