将年度数据填充至日度DataFrame时出现数据匹配错误
问题分析与修正
错误原因
- 核心错位问题:你在
else块中注释掉了GDPD.append(list(SGD_def_dict.values())[-1][-1]),导致新年份的第一天没有被加入GDPD列表。当后续将df2赋值给df["GDP_Deflator"]时,pandas按索引对齐,所有平减指数数据会整体向后偏移一位,最终出现2004年的指数出现在2003年最后一天的错位情况。 - 逻辑不严谨:原代码中用
list(SGD_def_dict.values())[-1][-1]获取平减指数,会取字典中最后添加的年份的指数,而非当前日期对应的年份指数(虽然日度数据是升序的,但这种写法逻辑脆弱)。 - 效率低下:循环遍历每一天的日期并重复请求世界银行数据,不仅慢,还容易因网络问题导致异常。
修正后的代码
import pandas as pd import yfinance as yf import world_bank_data as wb # 下载日度汇率数据并重置索引 df = yf.download(tickers='USDSGD=X', period='max', interval='1d') df.reset_index(inplace=True) # 提取数据中所有唯一的年份 unique_years = df['Date'].dt.year.unique() # 构建年份到GDP平减指数的映射字典 sgd_deflator_map = {} for year in unique_years: try: # 获取新加坡对应年份的GDP平减指数 deflator_value = wb.get_series( 'NY.GDP.DEFL.ZS', country='SGP', date=year, id_or_value='id', simplify_index=True ) sgd_deflator_map[year] = deflator_value except Exception: # 若获取失败则填充NaN sgd_deflator_map[year] = float('nan') # 直接通过年份映射生成平减指数列,避免循环错位 df['GDP_Deflator'] = df['Date'].dt.year.map(sgd_deflator_map) # 保存结果(注意路径要写完整,比如C:/.../WBTEST.csv) df.to_csv(r'C:/path/to/your/WBTEST.csv', index=False)
修正说明
- 批量获取数据:先提取所有唯一年份,一次性请求世界银行数据构建字典,避免重复请求,提升效率。
- 向量化映射:用
dt.year提取日期的年份,再通过map方法直接匹配字典中的平减指数,完全避免循环导致的索引错位问题。 - 鲁棒性提升:明确捕获异常并填充NaN,同时保存时加上
index=False避免生成多余的索引列。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

