Python时间序列优化之道滑动与累积窗口的应用技巧

大家好,在时间序列数据处理中,通常会进行滑动窗口计算(rolling)和累积窗口计算(expanding)等操作,以便分析时间序列的变化趋势或累积特征。Pandas提供的rollingexpanding函数提供了简单、高效的实现方式,特别适用于金融、气象、市场营销等领域的数据分析。这些函数能够对时间序列数据进行窗口操作,从而灵活地进行均值、标准差、最大值、最小值等计算。

1.滑动窗口与累积窗口概述

在Pandas中,滑动窗口和累积窗口是处理数据流时常用的两种窗口模型,它们在时间序列分析、事件处理、流处理等领域中非常重要。

滑动窗口是一种动态窗口模型,它在时间轴上滑动以覆盖连续的数据段。窗口的大小是固定的,但随着时间的推移,窗口会沿着数据流向前移动。这种窗口模型允许数据的连续处理,窗口内的数据可以是重叠的。

累积窗口是一种非重叠的窗口模型,每个窗口包含不重叠的数据段。当窗口内的数据被处理完毕后,窗口会向前移动到下一个数据段,开始处理新的数据。

2.rolling函数的用法与应用

rolling函数可以在指定的窗口长度内对数据进行滑动计算。常见应用包括计算移动平均、滑动标准差、滑动最大值和最小值等。rolling函数的基本语法如下:

Series/DataFrame.rolling(window, min_periods=None, center=False).agg(func)
  • window:窗口大小,通常为整数,表示滑动窗口包含的数据点数。

  • min_periods:窗口内计算所需的最小非缺失值数量。默认为窗口大小。

  • center:窗口是否居中对齐,默认为False

2.1 示例数据集

首先,创建一个包含日销售额的示例数据集:

import pandas as pd
import numpy as np

# 创建示例数据
date_range = pd.date_range(start="2023-01-01", periods=10)
sales = [100, 150, 120, 130, 170, 160, 180, 200, 210, 220]
df = pd.DataFrame({'日期': date_range, '销售额': sales})
df.set_index('日期', inplace=True)
print("原始数据:\n", df)
<
### 实现滑动时间窗口算法 对于非连续的时间序列数据,在Python中实现滑动时间窗口的方法可以通过Pandas库来简化操作。该方法能够计算指定时间范围内的滚动和或其他聚合函数。 #### 使用 Pandas 库创建滑动时间窗口 为了处理非连续时间戳的数据流并应用滑动时间窗口逻辑,可以利用`pandas.DataFrame.resample()` 或者 `pd.Grouper(freq='T')` 来定义固定大小的时间间隔,并通过`.rolling(window=w)` 方法设置窗口宽度w: ```python import pandas as pd from datetime import timedelta # 创建带有随机生成数值日期索引的DataFrame模拟输入数据流 data = {'value': [i * 0.5 for i in range(10)]} index = pd.to_datetime(['2023-08-%d' % (day + 1) for day in range(len(data['value']))]) df = pd.DataFrame(data=data, index=index) def apply_rolling_sum(df, window_size_days=7): """ 对给定 DataFrame 的 'value' 列执行基于天数的滑动求和 参数: df : 输入包含时间序列数据的 DataFrame window_size_days : 时间窗宽(单位:日) 返回值: 含有新列 'rolling_sum' 表示对应位置处过去 N 天内所有观测值得总和的新 DataFrame """ # 将window转换成timedelta对象以便于后续运算 window_timedelta = timedelta(days=window_size_days) # 计算每个时刻对应的滑动区间起始时间和结束时间 start_time = df.index - window_timedelta end_time = df.index # 初始化用于存储结果的列表 rolling_sums = [] # 迭代遍历每一行记录 for idx, row in enumerate(zip(start_time, end_time)): mask = (df.index >= row[0]) & (df.index <= row[1]) # 如果当前时间段存在有效数据,则累加;否则填充NaN if any(mask): sum_within_window = df.loc[mask]['value'].sum() rolling_sums.append(sum_within_window) else: rolling_sums.append(float('nan')) result_df = df.copy() result_df['rolling_sum'] = rolling_sums return result_df resulting_dataframe = apply_rolling_sum(df=df, window_size_days=3)[^1] print(resulting_dataframe[['value', 'rolling_sum']]) ``` 此代码片段展示了如何针对具有离散采样率的时间序列构建一个简单的滑动求和器。它接受一个由日期作为索引构成的DataFrame以及想要使用的窗口长度(以天计),之后返回一个新的DataFrame,其中包含了原始值及其相应的滑动累积量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值