如何通过循环保存股票数据至CSV?优化DataFrame使用方案
解决方案:批量获取股票数据并保存到CSV
针对你提出的三个问题,以下是具体的优化方案和修改后的代码:
1. 解决循环保存CSV的覆盖问题
当前代码每次循环调用to_csv时会覆盖原有文件,推荐先收集所有数据再一次性写入,既避免覆盖问题,也提升IO效率。
2. 优化DataFrame的使用
不需要创建完整的df1和df2,直接从JSON响应中提取目标字段即可,减少内存占用,提升代码运行效率。
3. 提取并保存指定字段
将股票名称(Stock)、行业组排名(GR)、EPS排名(EPR)、基金数量(Funds)整合成结构化数据,统一保存到CSV文件。
修改后的代码
# -*- coding: utf-8 -*- """ Created on Tue Jul 25 13:43:22 2023 @author: eruku """ import pandas as pd import requests infile = 'C:/Volume/PythonProjects/WIP_Projects/Marketsmithindia/StocksList.txt' outfile = 'C:/Volume/PythonProjects/WIP_Projects/Marketsmithindia/MktSmithData.csv' timeout = 10 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" } starturl = 'https://msi-gcloud-prod.appspot.com/gateway/simple-api/ms-india/instr/0/3023210/symboldetails.json?s=20180719&e=20230719&text=' endurl = '&lang=en&isConsolidated=0&ms-auth=3990+MarketSmithINDUID-Web0000000000+MarketSmithINDUID-Web0000000000+0+230325200706+-514613229' # 初始化列表存储所有股票数据 all_stock_data = [] with open(infile, 'r') as IN: for stock in IN: stock = stock.strip() if not stock: continue # 跳过空行 url = starturl + stock + endurl try: r = requests.get(url, headers=headers, timeout=timeout) r.raise_for_status() # 捕获HTTP请求错误 response_data = r.json()['response'] # 直接提取所需字段,无需创建完整DataFrame gr = response_data['detailsGeneralInformationHeader']['industryGroupRank'] epr = response_data['detailsGeneralInformationHeader']['epsRank'] funds = response_data['quarterlySalesAndEarningsInternational']['quarterlySalesAndEarningsOrigin'][0]['noOfFunds'] # 将数据添加到列表 all_stock_data.append({ 'Stock': stock, 'GR': gr, 'EPR': epr, 'Funds': funds }) print(f"已获取 {stock} 的数据") except KeyError as e: print(f"{stock} 数据提取失败:KeyError - {e}") except requests.exceptions.RequestException as e: print(f"{stock} 请求失败:{e}") # 将收集的数据写入CSV if all_stock_data: pd.DataFrame(all_stock_data).to_csv(outfile, index=False) print(f"所有数据已保存到 {outfile}") else: print("未获取到任何有效数据")
关键修改说明
- 数据收集方式:用列表
all_stock_data统一存储所有股票的目标字段,最后一次性写入CSV,避免循环追加的IO开销,同时保证表头只出现一次。 - 字段提取优化:直接从JSON响应中定位并提取
industryGroupRank、epsRank、noOfFunds,无需将整个JSON结构转为DataFrame,减少内存占用。 - 错误处理增强:新增HTTP请求错误捕获(
r.raise_for_status()),以及空行跳过逻辑,提升代码健壮性。 - 目标字段对齐:确保CSV中只包含你需要的
Stock、GR、EPR、Funds四个字段,结构清晰。
内容的提问来源于stack exchange,提问作者erukumk
相关产品推荐
相关产品推荐

