将字典数据追加到Pandas DataFrame产生冗余行,求优化代码方案
API行情数据提取存入DataFrame优化方案
问题原因
你原有代码每次调用append仅传入单个字段的字典,每次调用都会新增一行,未传入的字段默认填充NaN,5次循环共执行40次append,最终得到40行半缺省数据,不符合需求。
优化方案
推荐优先使用「先存列表再统一转DataFrame」的写法,执行效率远高于循环追加DataFrame,也更适配高频更新的场景。
单次处理最新API返回数据代码
import pandas as pd # 存放单批次所有行数据 rows = [] # res为你从API获取的最新字典数据 for x in range(5): bid_item = res["Bids"][x] ask_item = res["Asks"][x] # 一次性组装单条完整数据 rows.append({ "bidsize": bid_item["Size"], "bidprice": bid_item["Price"], "bid_to": bid_item["TotalOrders"], "bid_buyback": bid_item["BuyBackMarketMaker"], "asksize": ask_item["Size"], "askprice": ask_item["Price"], "ask_to": ask_item["TotalOrders"], "ask_buyback": ask_item["BuyBackMarketMaker"] }) # 生成目标DataFrame df = pd.DataFrame(rows) # 导出为CSV df.to_csv("latest_bid_ask.csv", index=False, encoding="utf-8-sig") print(df)
持续1秒更新、累加历史数据代码
如果需要长期采集每秒的最新数据,可使用如下写法:
import pandas as pd import time # 存放全量历史数据 all_data = [] # 可自定义采集次数,设置为while True可永久采集 collect_count = 60 for _ in range(collect_count): # 此处替换为你调用API获取最新res的代码 # res = your_api_request_func() for x in range(5): bid_item = res["Bids"][x] ask_item = res["Asks"][x] all_data.append({ "bidsize": bid_item["Size"], "bidprice": bid_item["Price"], "bid_to": bid_item["TotalOrders"], "bid_buyback": bid_item["BuyBackMarketMaker"], "asksize": ask_item["Size"], "askprice": ask_item["Price"], "ask_to": ask_item["TotalOrders"], "ask_buyback": ask_item["BuyBackMarketMaker"] }) # 间隔1秒获取下一次数据 time.sleep(1) # 导出全量历史数据 df_all = pd.DataFrame(all_data) df_all.to_csv("history_bid_ask.csv", index=False, encoding="utf-8-sig")
兼容旧版pandas append写法(不推荐)
如果你使用的pandas版本低于2.0,必须沿用append逻辑,可修改为如下写法:
import pandas as pd # 提前定义列名 df1 = pd.DataFrame(columns=["bidsize","bidprice","bid_to","bid_buyback","asksize","askprice","ask_to","ask_buyback"]) for x in range(5): bid_item = res["Bids"][x] ask_item = res["Asks"][x] # 单次append完整行数据,不要拆分单个字段追加 df1 = df1.append({ "bidsize": bid_item["Size"], "bidprice": bid_item["Price"], "bid_to": bid_item["TotalOrders"], "bid_buyback": bid_item["BuyBackMarketMaker"], "asksize": ask_item["Size"], "askprice": ask_item["Price"], "ask_to": ask_item["TotalOrders"], "ask_buyback": ask_item["BuyBackMarketMaker"] }, ignore_index=True) print(df1) df1.to_csv("bid_ask_data.csv", index=False, encoding="utf-8-sig")
内容的提问来源于stack exchange,提问作者Deep Vora
相关产品推荐
相关产品推荐

