You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将年度数据填充至日度DataFrame时出现数据匹配错误

问题分析与修正

错误原因

  1. 核心错位问题:你在else块中注释掉了GDPD.append(list(SGD_def_dict.values())[-1][-1]),导致新年份的第一天没有被加入GDPD列表。当后续将df2赋值给df["GDP_Deflator"]时,pandas按索引对齐,所有平减指数数据会整体向后偏移一位,最终出现2004年的指数出现在2003年最后一天的错位情况。
  2. 逻辑不严谨:原代码中用list(SGD_def_dict.values())[-1][-1]获取平减指数,会取字典中最后添加的年份的指数,而非当前日期对应的年份指数(虽然日度数据是升序的,但这种写法逻辑脆弱)。
  3. 效率低下:循环遍历每一天的日期并重复请求世界银行数据,不仅慢,还容易因网络问题导致异常。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:55:35