如何将比特币、以太坊与谷歌数据合并为DataFrame并解决运行报错?
报错原因
该ValueError的核心触发逻辑是:比特币、以太坊属于加密资产,全年无休交易,返回的日期索引覆盖所有自然日;谷歌(GOOG)是美股标的,仅在交易日(排除周末、法定节假日)产生行情数据,二者日期序列无法对齐;且部分情况下雅虎接口会为加密货币返回重复的日期记录,导致pandas做多标的数据拼接reshape操作时检测到重复索引,无法生成多级列的宽表。
修正方案
采用逐个拉取单个标的数据、按日期对齐合并的逻辑,同时主动清理重复索引即可解决:
import datetime import pandas as pd import pandas_datareader.data as web # 设置起止日期 start = datetime.datetime(2018, 2, 15) end = datetime.datetime(2020, 2, 14) # 标的列表 tickers = ["BTC-USD","ETH-USD","GOOG"] df_list = [] for ticker in tickers: # 逐个拉取单标的数据 tmp_df = web.DataReader(ticker, "yahoo", start=start, end=end) # 清理可能的重复日期索引,保留最后一条有效记录 tmp_df = tmp_df[~tmp_df.index.duplicated(keep='last')] # 给列名加上标的代码,方便后续区分不同标的的行情字段 tmp_df.columns = pd.MultiIndex.from_product([[ticker], tmp_df.columns]) df_list.append(tmp_df) # 按日期索引对齐合并,默认取所有标的共有的交易日日期 combined_df = pd.concat(df_list, axis=1, join='inner')
如果需要保留加密货币所有自然日的记录,仅对缺失的GOOG行情自动填充空值,将最后一行concat的参数join='inner'改为join='outer'即可。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

