在DATE索引上合并多个pandas dfs时间序列,它们包含在python词典中

时间:2016-09-28 21:52:01

标签: python pandas dictionary

我有一个python字典,包含几个股票,股票指数,固定收益工具和货币(AAPL,AORD等)的CLOSE价格,使用DATE指数。字典中的不同DF具有不同的长度,即一些时间序列比其他时间序列长。所有DF都具有相同的字段,即。 '关闭'。

字典的长度是可变的。如何通过DATE索引将所有DF合并为单个DF,还使用lsuffix =部分名称和我正在阅读的文件的特征? (例如,AAPL_CLOSE.csv文件有一个DATE& a CLOSE字段,但要区别于合并DF中的另一个'CLOSE',其名称应为AAPL_CLOSE)

这就是我所拥有的:

asset_name = []
files_to_test = glob.glob('*_CLOSE*')
for name in files_to_test:
    asset_name.append(name.rsplit('_', 1)[0])

返回:

asset_name = ['AAPL', 'AORD', 'EURODOLLAR1MONTH', 'NGETF', 'USDBRL']
files_to_test = ['AAPL_CLOSE.csv',
 'AORD_CLOSE.csv',
 'EURODOLLAR1MONTH_CLOSE.csv',
 'NGETF_CLOSE.csv',
 'USDBRL_CLOSE.csv']

然后:

asset_dict = {}
for name, file in zip(asset_name, files_to_test):
    asset_dict[name] = pd.read_csv(file, index_col = 'DATE', parse_dates = True)

这是我想要概括的小函数,使用lsuffix = assets_list中的元素,通过DATE创建字典中所有DF的大合并。

merged = asset_dict['AAPL'].join(asset_dict['AORD'], how = 'right', lsuffix ='_AAPL')

由于长度不匹配,DF会有很多N / A,但我会在稍后处理。

1 个答案:

答案 0 :(得分:0)

在没有得到任何答案之后,我找到了一个有效的解决方案,尽管可能有更好的解决方案。这就是我所做的:

asset_dict = {}
for name, file in zip(asset_name, files_to_test):
    asset_dict[name] = pd.read_csv(file, index_col='DATE', parse_dates=True)
    asset_dict[name].sort_index(ascending = True, inplace = True)

通过指定轴和其他参数,Pandas可以{+ 3}}多个dfs(同时,不是一个一个)包含在词典中,“开箱即用”,不需要太多调整。

df = pd.concat(asset_dict, axis = 1)

得到的df是一个多索引df,这对我来说是一个问题。此外,股票价格的时间序列都有不同的长度,这会产生大量的NaN。我解决了机器人问题:

df.columns = df.columns.droplevel(1)
df.dropna(inplace = True)

现在,我的df的列是这些:

['AAPL', 'AORD', 'EURODOLLAR1MONTH', 'NGETF', 'USDBRL']

但是因为我希望它们包含'STOCK_CLOSE'格式,所以我这样做:

old_columns = df.columns.tolist()
new_columns = []
for name in old_columns:
    new_name = name + '_CLOSE_'
    new_columns.append(new_name)