如何循环调用API并动态更换月份、Corridor等请求参数
自动化按月批量调用API并处理数据
需求背景
现有代码可单次从JAO API获取指定日期、指定通道的拍卖数据,完成清洗和排序,但API仅支持按月请求数据。需要实现循环遍历指定月份范围、动态切换corridor参数,自动化完成全流程的数据获取、清洗、合并与排序。
解决方案代码
以下是封装后的自动化实现,包含月份生成、批量请求、数据复用处理逻辑:
import requests import pandas as pd from datetime import datetime from dateutil.relativedelta import relativedelta # 基础配置 BASE_URL = "https://api.jao.eu/OWSMP/getauctions?" HEADERS = { "AUTH_API_KEY": "06e690fb-697b-4ab2-9325-4268cbd14502" } # 需要遍历的通道列表(可自行添加更多通道) CORRIDORS = ["IF1-FR-GB"] # 自定义月份范围:起始日期到当前月份 START_DATE = datetime(2021, 1, 1) END_DATE = datetime.now() # 生成需要请求的所有月份的fromdate列表 def generate_monthly_dates(start_date, end_date): dates = [] current_date = start_date while current_date <= end_date: dates.append(current_date.strftime("%Y-%m-%d")) current_date += relativedelta(months=1) return dates # 定义复用的数据清洗函数 def clean_data(raw_df): # 展开results字段并归一化处理 cleaned_df = raw_df.explode('results') cleaned_df = cleaned_df.join(pd.json_normalize(cleaned_df.pop('results')).add_suffix('_new')) # 移除不需要的冗余列 drop_cols = [ 'ftroption','identification','horizonName','periodToBeSecuredStart','periodToBeSecuredStop', 'bidGateOpening','bidGateClosure','isBidGateOpen','atcGateOpening','atcGateClosure', 'marketPeriodStop','disputeSubmissionGateOpening','disputeSubmissionGateClosure', 'disputeProcessGateOpening','disputeProcessGateClosure','ltResaleGateOpening','ltResaleGateClosure', 'maintenances','xnRule','winningParties','operationalMessage','products','lastDataUpdate', 'cancelled','comment_new','corridorCode_new','productIdentification_new','additionalMessage_new' ] cleaned_df.drop(drop_cols, axis=1, inplace=True) return cleaned_df # 主流程:批量获取并合并所有数据 all_data = pd.DataFrame() monthly_dates = generate_monthly_dates(START_DATE, END_DATE) for corridor in CORRIDORS: for from_date in monthly_dates: params = { "horizon": "Daily", "corridor": corridor, "fromdate": from_date } # 发送API请求 response = requests.get(BASE_URL, headers=HEADERS, params=params) json_data = response.json() raw_df = pd.DataFrame.from_dict(json_data) # 清洗当前批次数据 cleaned_df = clean_data(raw_df) cleaned_df['corridor'] = corridor # 添加通道标识 # 合并到总数据集 all_data = pd.concat([all_data, cleaned_df], ignore_index=True) # 按日期排序 all_data['new'] = pd.to_datetime(all_data['marketPeriodStart']).dt.strftime('%d/%m/%Y') all_data = all_data.sort_values(by='new', ascending=True) # 查看最终处理结果 print(all_data)
关键说明
- 月份自动生成:通过
generate_monthly_dates函数生成指定时间范围内的每月第一天,完美适配API的fromdate参数要求 - 代码复用:将数据清洗逻辑封装为独立函数,避免重复代码,后续修改清洗规则只需调整该函数
- 多通道支持:通过遍历
CORRIDORS列表,可一次性处理多个通道的数据 - 数据合并:用
pd.concat将所有月份、所有通道的数据合并为统一DataFrame,便于后续分析
处理后的数据示例

内容的提问来源于stack exchange,提问作者Chetan Patel
相关产品推荐
相关产品推荐

