yfinance在线获取与雅虎下载BTC-USD数据isna()返回缺失值结果不同
缺失值不一致的原因及排查方案
- yfinance内置自动补全逻辑:yfinance拉取加密货币类资产数据时,会对源接口返回的少量缺失记录自动执行前值填充/线性插值处理,不会保留空值。而雅虎金融网页端下载的CSV为原始未处理数据,会直接保留平台未补录的空值记录,这是该问题最常见的诱因。
- 拉取范围对齐误差:yfinance的
download方法的end参数为左闭右开规则,即不会返回end参数指定的当日数据。如果手动下载CSV时选择的时间范围包含了end参数对应的日期,且该日期前后刚好存在4条未补录的空值记录,也会导致统计结果不一致。 - 数据源更新节奏差异:雅虎金融网页端下载服务和API接口服务的数据源缓存更新频率不同,你下载CSV时网页端的缓存尚未补录那4条缺失数据,但API端已经完成了数据补录,也会出现二者的空值数量差。
验证步骤
- 首先校验两个数据集的长度:执行
print(len(df_b), len(df)),如果二者长度差为4,说明是本地CSV包含了yfinance未拉取的日期范围,调整本地CSV的筛选范围和yfinance拉取范围严格对齐后重新统计即可。 - 如果二者长度一致,筛出本地数据的空值行匹配yfinance的数据:执行
print(df[df['Open'].isna()]['Date'])拿到空值对应的日期,再到df_b中查询对应日期的数值,可确认该部分数据为yfinance的填充值。
数据对齐方案
如果需要让本地CSV数据和yfinance拉取的数据保持一致,可执行以下操作:
- 先筛选时间范围和yfinance拉取规则对齐:
df = df[(df['Date'] >= '2018-06-19') & (df['Date'] < '2021-06-19')] - 执行和yfinance逻辑一致的补全:
df = df.ffill()
内容的提问来源于stack exchange,提问作者Minhtr
相关产品推荐
相关产品推荐

