
在时间序列分析中,expanding()函数是pandas提供的一个强大工具,用于执行累积(或扩展)窗口计算。与固定大小的rolling()窗口不同,expanding()窗口会随着数据的增加而不断扩大,从序列的第一个元素开始,逐步包含后续所有元素。例如,data["somecolumn"].expanding().mean()会计算从序列开始到当前点的所有数据的累积平均值。
然而,在某些业务场景下,我们可能需要这种累积计算在特定时间点(例如每天开始时)“重置”。这意味着当新的一天到来时,expanding()计算应该从该天的第一条记录重新开始,而不是继续前一天的累积。
默认的expanding()方法会跨越整个序列进行累积计算,不会自动识别日期边界并重置。如果直接在一个包含多天数据的DataFrame上应用expanding().mean(),它将计算整个时间跨度内的累积平均值,这不符合每日重置的需求。例如,如果第二天的数据是第一条记录,它将与前一天的所有数据一起计算,而不是作为新一天的起点。
解决此问题的关键在于利用Pandas的groupby()方法。我们可以首先从时间序列索引中提取出“日期”部分,将其作为一个新的分组键。然后,对这个日期键进行分组,并在每个组(即每一天)内部独立地应用expanding()函数。这样,expanding()操作就会在每天的边界处自动“重置”。
以下是实现每日重置expanding()计算的具体步骤:
让我们通过一个具体的例子来演示这个过程。假设我们有一个包含多天数据的DataFrame,我们希望计算每日的累积平均值。
import pandas as pd
# 1. 准备示例数据
# 创建一个包含多天时间序列数据的DataFrame
df = pd.DataFrame(
{"B": [1, 2, 4, 0, 4]},
index=pd.to_datetime(
["2023-12-11 21:00:00", "2023-12-11 22:00:00", "2023-12-11 23:00:00",
"2023-12-12 00:00:00", "2023-12-12 01:00:00"]
)
)
# 确保索引已排序(虽然本例数据已排序,但这是一个好习惯)
# df = df.sort_index()
print("原始DataFrame:")
print(df)
print("-" * 30)
# 2. 提取日期信息并创建新的“day”列
# 使用 .dt 访问器和 strftime 方法将日期格式化为 YYYY-MM-DD 字符串
df["day"] = df.index.to_series().dt.strftime("%Y-%m-%d")
print("添加'day'列后的DataFrame:")
print(df)
print("-" * 30)
# 3. 应用 groupby() 和 expanding().mean()
# 首先按“day”列分组,然后在每个组内应用 expanding().mean()
daily_expanding_mean = df.groupby("day")["B"].expanding().mean()
print("每日重置的Expanding平均值结果:")
print(daily_expanding_mean)代码解释:
输出结果分析:
原始DataFrame:
B
2023-12-11 21:00:00 1
2023-12-11 22:00:00 2
2023-12-11 23:00:00 4
2023-12-12 00:00:00 0
2023-12-12 01:00:00 4
------------------------------
添加'day'列后的DataFrame:
B day
2023-12-11 21:00:00 1 2023-12-11
2023-12-11 22:00:00 2 2023-12-11
2023-12-11 23:00:00 4 2023-12-11
2023-12-12 00:00:00 0 2023-12-12
2023-12-12 01:00:00 4 2023-12-12
------------------------------
每日重置的Expanding平均值结果:
day
2023-12-11 2023-12-11 21:00:00 1.000000
2023-12-11 22:00:00 1.500000
2023-12-11 23:00:00 2.333333
2023-12-12 2023-12-12 00:00:00 0.000000
2023-12-12 01:00:00 2.000000从结果中可以看出,对于2023-12-11这一天:
当日期切换到2023-12-12时,expanding()计算被重置:
这正是我们期望的每日重置行为。
通过巧妙地结合Pandas的groupby()功能与日期时间索引的提取能力,我们可以轻松地实现expanding()函数在每日边界处重置的需求。这种方法提供了一种灵活且强大的方式,用于在时间序列数据中执行分段的累积统计分析,从而更好地满足特定的业务逻辑和数据分析要求。
以上就是Pandas时间序列:实现每日重置的滚动计算的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号