如何仅将DataFrame中各symbol的最大asOfDate行写入CSV?
修改后的代码:仅保留每个标的最新季度资产负债表数据
import pandas as pd from yahooquery import Ticker symbols = ['AAPL','GOOG','MSFT'] # 实际有75000个标的 header = ["asOfDate","CashAndCashEquivalents","CashFinancial","CurrentAssets","TangibleBookValue","CurrentLiabilities","TotalLiabilitiesNetMinorityInterest"] # 标记是否为首次写入CSV(用于控制表头输出) first_write = True for tick in symbols: faang = Ticker(tick) # 仅调用一次接口获取数据,避免重复请求浪费资源 df = faang.balance_sheet(frequency='q') # 跳过无数据的标的,避免后续代码报错 if df.empty: print(f"标的 {tick} 无季度资产负债表数据,已跳过") continue # 转换日期格式,确保能正确筛选最新数据 df['asOfDate'] = pd.to_datetime(df['asOfDate']) # 筛选出当前标的asOfDate最大的一行(即最新季度数据) latest_df = df[df['asOfDate'] == df['asOfDate'].max()] # 补充表头中缺失的列,值设为None for column_name in header: if column_name not in latest_df.columns: latest_df.loc[:, column_name] = None # 写入CSV:首次写入带表头,后续追加不带表头 latest_df.to_csv('output.csv', mode='a', index=True, header=first_write, columns=header) # 首次写入完成后切换标记 if first_write: first_write = False
关键修改说明
- 移除重复API调用:原代码连续两次调用
balance_sheet接口,保留一次即可,大幅减少网络请求次数(尤其针对75000个标的的场景)。 - 精准筛选最新数据:将
asOfDate转为日期类型后,通过最大值匹配筛选出每个标的的最新季度报告行,确保每个标的仅保留一条数据。 - 空数据容错处理:增加空DataFrame判断,跳过无资产负债表数据的标的,避免后续逻辑报错。
- 优化CSV写入逻辑:通过
first_write标记控制表头输出,仅在第一次写入时生成表头,避免文件中出现重复表头。
内容的提问来源于stack exchange,提问作者HTMLHelpMe
相关产品推荐
相关产品推荐

