为何循环获取的多份股票期权DataFrame仅最后一份存入Excel?
问题成因
- 循环内部每次迭代都会直接给
df_puts、df_calls重新赋值,上一轮循环获取的旧数据会被直接覆盖,循环结束后这两个变量仅存储最后一支股票的对应数据。 - 写入Excel的操作放在了循环结束之后,自然只能写入最后一次迭代保留的数据。
修正后的代码
import pandas as pd import os from pandas import ExcelWriter stocklist = pd.read_excel(filePath) # 初始化两个空列表存储每轮生成的DataFrame puts_data = [] calls_data = [] for i in stocklist.index: stock = str(stocklist["Symbols"][i]) option_dict = options.get_options_chain(stock) df_puts = pd.DataFrame.from_dict(option_dict.get("puts")) df_calls = pd.DataFrame.from_dict(option_dict.get("calls")) # 新增股票代码列,方便后续区分数据归属 df_puts["stock_code"] = stock df_calls["stock_code"] = stock # 将当前股票的DataFrame存入对应列表 puts_data.append(df_puts) calls_data.append(df_calls) # 合并所有股票的数据为总DataFrame total_puts = pd.concat(puts_data, ignore_index=True) total_calls = pd.concat(calls_data, ignore_index=True) # 写入Excel newFile = os.path.dirname(filePath1) + "/OptionsOutput.xlsx" writer = ExcelWriter(newFile) total_puts.to_excel(writer, "puts", float_format="%.3f", index=False) total_calls.to_excel(writer, "calls", float_format="%.3f", index=False) writer.save()
补充说明
- 先将每轮的DataFrame存入列表最后再合并的写法,比循环中直接拼接DataFrame的性能更高,数据量越大优势越明显。
- 新增的
stock_code字段用于区分不同股票的数据,若不需要可以删除对应赋值行。
内容的提问来源于stack exchange,提问作者fxbaba108
相关产品推荐
相关产品推荐

