如何用Pandas计算带重置的多主机流量计数器滚动求和?
处理带重置的计数器流量统计(Pandas实现)
针对带主机名的流量计数器数据(计数器达到阈值会重置),可以通过以下步骤在Pandas中计算总流量或滚动累计流量:
示例数据准备
假设你的数据已经存储在Pandas DataFrame中,构造示例数据如下:
import pandas as pd data = [ ("host1", 5), ("host2", 19), ("host1", 7), ("host2", 29), ("host1", 9), ("host2", 3), ] df = pd.DataFrame(data, columns=["hostname", "counter"])
核心逻辑实现
定义增量计算函数:按主机分组,针对每个组的计数器序列,计算每个数据点的流量增量:
- 非重置场景:增量为当前值与前一个值的差值
- 重置场景(当前值 < 前一个值):增量直接取当前值(因为重置后计数器从0开始,当前值即为该段已累计的流量)
- 第一个数据点增量设为0(无法追溯之前的重置状态,仅计算采集起始后的流量)
生成增量列与累计流量:
def calculate_increments(group): # 计算当前值与前一个值的差值 diffs = group["counter"].diff() # 重置时用当前值替换负差值,非重置时保留差值 increments = diffs.where(diffs > 0, group["counter"]) # 第一个数据点无前置值,增量设为0 increments.iloc[0] = 0 return increments # 按主机分组计算增量 df["increment"] = df.groupby("hostname").apply(calculate_increments).reset_index(drop=True) # 计算滚动累计流量(每个时间点的累计总流量) df["cumulative_traffic"] = df.groupby("hostname")["increment"].cumsum() # 计算每个主机的总流量 total_traffic = df.groupby("hostname")["increment"].sum()
结果验证
运行上述代码后,total_traffic输出为:
host1 4.0 host2 13.0 dtype: float64
- host1的流量序列为
5→7→9,无重置,总增量为(7-5)+(9-7)=4 - host2的流量序列为
19→29→3,发生重置,总增量为(29-19)+3=13,符合预期
查看完整DataFrame的滚动累计流量:
hostname counter increment cumulative_traffic 0 host1 5 0.0 0.0 1 host2 19 0.0 0.0 2 host1 7 2.0 2.0 3 host2 29 10.0 10.0 4 host1 9 2.0 4.0 5 host2 3 3.0 13.0
内容的提问来源于stack exchange,提问作者John Oxley
相关产品推荐
相关产品推荐

