基于软件更新周期的变量(x、y)聚合需求
按软件更新周期聚合数据的解决方案
我来帮你搞定这个按软件更新周期聚合数据的需求!首先咱们先把你给的示例数据整理成更清晰的结构化形式,方便理解:
Date x y id update-size 01.01 1 1 1 (空,无更新) 01.02 2 3 1 2345(有更新) 01.03 4 2 1 (空,无更新) 01.01 5 7 2 3654(有更新) 01.02 2 6 2 (空,无更新) 01.03 3 2 2 4789(有更新)
你的核心需求是:针对每个id(独立软件),每当出现update-size非空的更新事件时,聚合从「上一次更新(或该id的首个数据点)」到「本次更新」之间的所有x、y数据。下面我用Python的pandas工具来实现这个逻辑,这是处理这类数据聚合最常用的方案:
步骤1:数据准备与清洗
首先把数据加载成结构化的DataFrame,并确保时间顺序正确:
import pandas as pd # 把你的示例数据转换成列表格式 data = [ ["01.01", 1, 1, 1, None], ["01.02", 2, 3, 1, 2345], ["01.03", 4, 2, 1, None], ["01.01", 5, 7, 2, 3654], ["01.02", 2, 6, 2, None], ["01.03", 3, 2, 2, 4789] ] # 创建DataFrame并设置列名 df = pd.DataFrame(data, columns=["Date", "x", "y", "id", "update-size"]) # 把日期转换成datetime格式,确保排序正确 df["Date"] = pd.to_datetime(df["Date"], format="%d.%m") # 按id和日期排序,保证每个软件的数据是按时间顺序排列的 df = df.sort_values(by=["id", "Date"]).reset_index(drop=True)
步骤2:标记更新周期分组
接下来,我们需要为每个id的数据划分更新周期分组:从首个数据点到第一次更新为一组,第一次更新到第二次更新为下一组,以此类推。
def create_update_groups(group): # 找出当前id下所有有更新的行的索引 update_rows = group[group["update-size"].notna()].index if len(update_rows) == 0: # 如果该id没有任何更新记录,把所有数据归为一组 group["update_group"] = 0 return group # 初始化分组标签 group["update_group"] = 0 current_group = 0 # 遍历每个更新行,把从上次分组结束到当前更新行的所有数据标记为当前组 for update_idx in update_rows: group.loc[:update_idx, "update_group"] = current_group current_group += 1 return group # 按id分组应用上面的函数,生成更新周期标签 df = df.groupby("id", group_keys=False).apply(create_update_groups)
步骤3:按分组聚合数据
最后,我们可以根据需求对每个更新周期的x、y进行聚合(这里以求和为例,你可以换成均值mean、最大值max等):
aggregated_result = df.groupby(["id", "update_group"]).agg( 周期起始日期=("Date", "min"), 周期结束日期=("Date", "max"), x总和=("x", "sum"), y总和=("y", "sum"), 更新大小=("update-size", "last") # 取该周期对应的更新大小 ).reset_index() # 打印结果 print(aggregated_result)
输出结果示例
运行后你会得到这样的聚合结果:
id update_group 周期起始日期 周期结束日期 x总和 y总和 更新大小 0 1 0 2023-01-01 2023-01-02 3 4 2345.0 1 1 1 2023-01-03 2023-01-03 4 2 NaN 2 2 0 2023-01-01 2023-01-01 5 7 3654.0 3 2 1 2023-01-02 2023-01-03 5 8 4789.0
额外说明
- 如果不需要最后一个没有更新的分组(比如id=1的group1),可以在聚合前过滤掉
update-size为空的分组:aggregated_result = aggregated_result.dropna(subset=["更新大小"]) - 你可以根据实际需求修改聚合函数,比如把
sum改成mean计算平均值,或者添加更多聚合指标。
内容的提问来源于stack exchange,提问作者P.Hubert
相关产品推荐
相关产品推荐

