将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
相关产品推荐
相关产品推荐

