You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环保存股票数据至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:43:24