如何将API获取的单只股票数据合并为日期索引的主DataFrame
解决方案
核心思路
将每个API返回的单只股票数据处理为以日期为索引、股票代码为列的格式,逐步合并到主DataFrame中,最终得到日期为行、股票代码为列的结构化数据。
修正后的完整代码
import requests import pandas as pd import time # 用于控制请求频率,避免触发API限流 # 获取唯一股票代码列表(修正原代码中unique缺少括号的问题) tickers = list(data.ticker.unique()) # 初始化主DataFrame main_df = None for ticker in tickers: try: # 修正API调用中的变量错误:使用ticker而非tickers api_response = requests.get(f'api_call_from_site.com/stonkz&ticker={ticker}') # 检查请求是否成功 api_response.raise_for_status() stock_data = api_response.json() # 将JSON数据转为DataFrame df = pd.DataFrame(stock_data) # 处理日期格式:转换为datetime并保留日期部分 df['date'] = pd.to_datetime(df['date']).dt.date # 设置日期为索引 df.set_index('date', inplace=True) # 将adjClose列重命名为股票代码 df.rename(columns={'adjClose': ticker}, inplace=True) # 合并到主DataFrame if main_df is None: main_df = df else: # outer保留所有日期,inner仅保留共同日期(根据需求选择) main_df = main_df.join(df, how='outer') # 可选:添加请求间隔,避免API限流 time.sleep(0.5) except Exception as e: print(f"处理{ticker}时出错:{e}") continue # 将索引转换为datetime类型(可选,便于后续时间序列操作) main_df.index = pd.to_datetime(main_df.index) # 按日期排序 main_df.sort_index(inplace=True) # 查看结果 print(main_df.head())
关键细节说明
- 修正API调用错误:原代码中
{tickers}改为{ticker},确保请求对应单只股票数据。 - 日期处理:将API返回的带时间戳的日期转换为纯日期格式,统一索引格式。
- 合并逻辑:使用
join方法按日期索引合并,保证每一行对应同一日期的多只股票收盘价。 - 错误处理:通过
try-except捕获请求或数据处理异常,避免因单只股票失败导致整个循环中断。 - 限流控制:添加
time.sleep降低请求频率,防止触发API的访问限制(根据API规则调整间隔时间)。
最终结果格式
处理完成后,main_df的结构将与你期望的一致:
| date | AAPL | TSLA | AMD | ... |
|---|---|---|---|---|
| 2020-01-02 | 73.4678 | ... | ... | ... |
| 2020-01-03 | 72.7535 | ... | ... | ... |
内容的提问来源于stack exchange,提问作者jd_h2003
相关产品推荐
相关产品推荐

