Python/pandas获取历史汇率时如何加速批量货币转换
问题核心原因
你当前代码效率极低的根源和pandas性能无关,是两个完全可以避免的问题:
- 逐行处理时每次都重新初始化
CurrencyRates对象,产生大量无意义开销 - 每处理1条记录就发起1次独立网络请求拉取汇率,网络IO延迟是所有操作里最慢的环节,大量重复请求完全浪费。你总共只有10种计价货币,绝大多数相同日期相同货币的汇率被重复请求了成百上千次。
优化思路
核心逻辑就是尽量减少网络请求次数,所有网络请求只做一次,剩下的计算全部在本地完成:
- 全局只初始化一次汇率转换器,不要在循环/转换函数里反复新建实例
- 从全量数据中提取所有不重复的「货币+续费日期」组合,只对这些唯一组合发起一次汇率请求,相同组合直接复用结果
- 拿到所有需要的汇率后在本地做映射匹配,批量计算加元成本,不要逐行调用接口
- 遇到接口限频可以在请求循环里加极短的等待时间,就算加等待总耗时也会比原方案低几个数量级
可直接运行的优化代码
import pandas as pd import time !pip install forex-python from forex_python.converter import CurrencyRates # 全局初始化一次转换器即可 cr = CurrencyRates() # 加载数据集,替换为你自己的全量数据读取逻辑 dummy_data = { 'siteid': ['11', '12', '13', '41', '42','51'], 'userid': [0,0,0,0,0,0], 'domain': ['A', 'B', 'C', 'E', 'F', 'G'], 'currency':['MXN', 'CAD', 'USD', 'USD', 'AUD', 'HKD'], 'servicecost': [2.5, 3.3, 1.3, 2.5, 2.5, 2.3], 'date': ['2022-02-04', '2022-03-05', '2022-01-03', '2021-04-06', '2022-12-05', '2022-11-01'] } df = pd.DataFrame(dummy_data, columns = ['siteid', 'userid', 'domain','currency','servicecost','date']) df['date'] = pd.to_datetime(df['date'],errors='coerce') # 提取所有唯一的(货币,日期)对,去重后批量拉取汇率 unique_currency_date = df[['currency', 'date']].drop_duplicates() rate_lookup = {} for _, row in unique_currency_date.iterrows(): curr = row['currency'] req_date = row['date'] # 加元本身不需要请求汇率,直接赋值1 if curr == 'CAD': rate_lookup[(curr, req_date)] = 1.0 continue # 拉取对应日期对应货币兑加元的汇率 rate_lookup[(curr, req_date)] = cr.get_rate(curr, 'CAD', req_date) # 如果碰到接口限频,解开下面这行注释即可 # time.sleep(0.1) # 本地批量映射汇率计算成本,无网络开销 df['cost_cad'] = df.apply( lambda x: x['servicecost'] * rate_lookup[(x['currency'], x['date'])], axis=1 )
效果说明
按你6.1万条记录、10种货币的规模算,去重后需要请求的汇率组合最多不会超过数据覆盖的自然天数*10,就算覆盖2年时间也就7000多个组合,总耗时会从原方案的8小时压缩到数分钟级别,完全满足使用需求。
内容的提问来源于stack exchange,提问作者Francisco Cortes
相关产品推荐
相关产品推荐

