解决Vega_dict函数生成的时序DataFrame重复存储及无法累积问题
解决Pandas时序数据累积重复问题
问题根源
Vega_dict函数内部错误地将全局df_vg与当前计算的单行数据合并,导致每次调用函数时,返回的DataFrame已包含之前的累积数据。- 外部代码连续两次调用
Vega_dict()后再次执行concat,相当于把重复的累积数据二次合并,最终产生多条重复行。 - 函数职责混乱:
Vega_dict应仅负责生成当前时间点的单行统计数据,累积存储逻辑需放在函数外部。
修正方案
1. 重构Vega_dict函数
修改函数,使其仅返回当前时间点的单行DataFrame,移除内部不必要的concat操作:
def Vega_dict(): Sum_CE_Vega = Final_df.loc[Final_df['instrumentType'] == 'CE', 'vega'].sum() Sum_PE_Vega = Final_df.loc[Final_df['instrumentType'] == 'PE', 'vega'].sum() # 直接构造单行DataFrame,简化逻辑 Vega_df = pd.DataFrame({ "Time": [Time], "Sum of OTM CE": [Sum_CE_Vega], "Sum of OTM PE": [Sum_PE_Vega] }) return Vega_df
2. 外部维护累积时序数据
在函数外部初始化空的累积DataFrame,每次调用Vega_dict()获取新行后合并:
import pandas as pd import time # 初始化空的累积DataFrame df_vg = pd.DataFrame(columns=["Time", "Sum of OTM CE", "Sum of OTM PE"]) # 模拟每20秒更新一次的循环(实际场景可根据触发逻辑调整) while True: # 获取当前时间点的统计数据 new_row = Vega_dict() # 合并新行到累积DataFrame df_vg = pd.concat([df_vg, new_row], ignore_index=True) # 打印当前累积结果 print(df_vg) # 等待20秒 time.sleep(20)
3. 避免重复的关键
- 确保
Vega_dict每次仅返回一行新数据,不包含历史累积内容。 - 外部仅在每次更新时调用一次
Vega_dict(),并将结果合并到累积DataFrame,禁止重复调用后再合并。
测试验证
运行代码后,每次循环会新增一行不同时间的统计数据,输出示例:
Time Sum of OTM CE Sum of OTM PE 0 20:14:32 176.90175243829978 166.3830493392582 1 20:14:52 176.93993499404044 166.3783648784774 2 20:15:12 177.00214567890123 166.3512345678901
内容的提问来源于stack exchange,提问作者denise
相关产品推荐
相关产品推荐

