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

将API获取的股票数据转换为DataFrame并导出至Excel的问题

问题描述

我正在遍历Excel文件的单列数据,每次迭代时将单元格值拼接进API URL的两段之间,生成可请求数据的有效URL。数据前9行的Symbol列值为:ISR、CVM、NNVC、AIM、NAVB、OGEN、PLX、PTN、SYN。

我的目标是把API返回的这些数据转换成以键为列、值为行的DataFrame,再导出到新的Excel文件,但在格式化数据时遇到了困难。

当前代码

import pandas as pd
import json
import requests

file = pd.read_excel('stockgroups.xlsx')
# 遍历图片中显示的9行数据(文件共4500行)
file = file.iloc[:9]

tickers = list(file["Symbol"])

for i in tickers:
    response = requests.get('https://financialmodelingprep.com/api/v3/stock-price-change/' + str(i) + '?apikey=YOURAPIKEY')
alldata = json.loads(response.text)

print(alldata)

当前输出

[{'symbol': 'ISR', '1D': -7.66, '5D': -3.23, '1M': 7.14, '3M': -9.09, '6M': -21.05, 'ytd': -26.83, '1Y': -55.22, '3Y': -26.83, '5Y': -50.82, '10Y': -71.15, 'max': -94.12}]
[{'symbol': 'CVM', '1D': -13.02, '5D': -25.11, '1M': -17.94, '3M': 3.41, '6M': -43.58, 'ytd': -56.620000000000005, '1Y': -56.34, '3Y': -46.9, '5Y': 38.02, '10Y': -96.29, 'max': -99.89}]
[{'symbol': 'NNVC', '1D': -1.01, '5D': -6.19, '1M': -10.45, '3M': 12.57, '6M': -24.81, 'ytd': -49.74, '1Y': -55.73, '3Y': -58.96, '5Y': -93.06, '10Y': -95.06, 'max': -94.37}]
[{'symbol': 'AIM', '1D': -3.05, '5D': -4.32, '1M': -9.05, '3M': -34.22, '6M': -16.28, 'ytd': -28.470000000000002, '1Y': -64.58, '3Y': -81.81, '5Y': -96.51, '10Y': -99.63, 'max': -99.94}]
[{'symbol': 'NAVB', '1D': 1.43, '5D': 7.68, '1M': -7.91, '3M': -29.3, '6M': -30.7, 'ytd': -41.67, '1Y': -61.12, '3Y': 20.67, '5Y': -92.71, '10Y': -99.23, 'max': -99.46}]
[{'symbol': 'OGEN', '1D': 0.0, '5D': -1.23, '1M': 15.23, '3M': -9.03, '6M': -24.85, 'ytd': -26.450000000000003, '1Y': -46.82, '3Y': -26.45, '5Y': -91.14, '10Y': -98.62, 'max': -99.96}]
[{'symbol': 'PLX', '1D': 1.85, '5D': 0.0, '1M': 1.85, '3M': -17.29, '6M': 35.8, 'ytd': 20.880000000000003, '1Y': -27.15, '3Y': -71.79, '5Y': -85.53, '10Y': -98.07, 'max': -99.87}]
[{'symbol': 'PTN', '1D': -0.37, '5D': -6.55, '1M': -6.55, '3M': -38.41, '6M': -33.9, 'ytd': -49.81, '1Y': -46.86, '3Y': -72.63, '5Y': -38.41, '10Y': -61.83, 'max': -99.71}]
[{'symbol': 'SYN', '1D': 2.27, '5D': -30.54, '1M': -12.26, '3M': -33.32, '6M': -35.88, 'ytd': -44.43, '1Y': -66.66, '3Y': -69.69, '5Y': -99.1, '10Y': -99.79, 'max': -99.96}]
解决方案

你当前代码的核心问题是循环中每次覆盖response变量,最终alldata只保留了最后一个股票的数据,而非全部9个。只需把所有API返回的数据收集到一个列表,再转换为DataFrame即可解决问题。

修改后的代码如下:

import pandas as pd
import requests

# 读取Excel文件
file = pd.read_excel('stockgroups.xlsx')
# 取前9行测试(正式运行可删除此行)
file = file.iloc[:9]
tickers = file["Symbol"].tolist()

# 初始化列表存储所有股票数据
all_data = []

for ticker in tickers:
    # 用f-string简化URL拼接
    url = f'https://financialmodelingprep.com/api/v3/stock-price-change/{ticker}?apikey=YOURAPIKEY'
    response = requests.get(url)
    # API返回的是包含单个字典的列表,直接取第一个元素存入
    stock_data = response.json()[0]
    all_data.append(stock_data)

# 将列表转换为DataFrame,自动按字典键生成列
result_df = pd.DataFrame(all_data)

# 导出到新Excel文件,index=False避免写入行索引
result_df.to_excel('stock_price_changes.xlsx', index=False)

# 打印查看格式化后的数据
print(result_df)

关键说明

  • 用列表all_data收集每个API返回的字典,避免数据被覆盖;
  • 直接使用response.json()解析返回内容,无需额外导入json模块;
  • pd.DataFrame(all_data)会自动将字典的键设为列名,每个字典的内容对应一行数据;
  • to_excel的index=False参数可避免导出时生成多余的行索引列。

运行后你会得到一个结构规整的Excel文件,列包含symbol、1D、5D等字段,每行对应一只股票的价格变动数据。


内容的提问来源于stack exchange,提问作者noviceprogramer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:39:18