高效跟踪数据修订:DataFrame快速处理API数据修订方案问询
高效跟踪API数据修订的实现方案
核心思路
用Pandas的向量化操作替代逐行遍历,通过分组、合并等方法快速对比新数据与历史数据的差异,自动生成修订版本号,彻底避开低效循环。
具体步骤
数据预处理
把API返回的datetime,value格式数据转成DataFrame,同时将datetime转为时间类型、value转为数值类型,避免字符串匹配带来的性能损耗:import pandas as pd # 假设api_data是从API获取的原始数据(列表/文本) new_df = pd.DataFrame(api_data, columns=["datetime", "value"]) new_df["datetime"] = pd.to_datetime(new_df["datetime"]) new_df["value"] = pd.to_numeric(new_df["value"])加载历史数据
读取本地保存的历史DataFrame,首次运行则初始化空表:try: history_df = pd.read_csv("history_data.csv", parse_dates=["datetime"]) except FileNotFoundError: history_df = pd.DataFrame(columns=["datetime", "value", "revision"])快速识别新增与修订数据
先提取历史数据中每个datetime的最新版本(最大revision)及对应value:# 按datetime分组,取每组最新的记录(最大revision对应的行) latest_history = history_df.groupby("datetime").agg( latest_value=("value", "last"), max_revision=("revision", "max") ).reset_index()将新数据与最新历史数据合并,筛选出需要新增的行:
# 左连接新数据和最新历史数据 merged = new_df.merge(latest_history, on="datetime", how="left") # 筛选条件:要么是从未出现过的datetime,要么是value发生变化的旧datetime to_add = merged[(merged["latest_value"].isna()) | (merged["value"] != merged["latest_value"])]生成修订版本号并合并数据
为需要新增的行计算revision:新datetime的revision为0,修订的datetime为当前最大revision+1(空值则填0):to_add["revision"] = to_add["max_revision"].fillna(-1) + 1 # 保留目标列 to_add = to_add[["datetime", "value", "revision"]]把新增行合并到历史DataFrame:
updated_history = pd.concat([history_df, to_add], ignore_index=True)保存更新后的历史数据
updated_history.to_csv("history_data.csv", index=False)
效果验证
按照上述方法处理后,针对2023-09-12 08:00的三次数据(1000、2000、1000),最终生成的DataFrame会自动生成对应的revision 0、1、2,完全符合需求,且所有操作都是Pandas向量化处理,性能远高于逐行遍历。
内容的提问来源于stack exchange,提问作者jacoo
相关产品推荐
相关产品推荐

