首页 > 解决方案 > 对dict的操作无效

问题描述

我正在处理财务数据,以便建立一些波动性预测模型。我创建了一个名为indices包含我的资产的字典。

我必须在字典中为每个资产的数据框添加一些列。在循环之后,尤其是使用indices[key]and之后value,我被卡住了。

indices = dict(AEX = df[df.Symbol==".AEX"],AORD = df[df.Symbol==".AORD"],BFX = df[df.Symbol==".BFX"])

ict_items([('AEX', Unnamed: 0 Symbol    ...      Rvol    LogRvol
0     2000-01-03 00:00:00+00:00   .AEX  ...  0.000580  -7.453228
1     2000-01-04 00:00:00+00:00   .AEX  ...  5.646706   1.731072
2     2000-01-05 00:00:00+00:00   .AEX  ...  0.014028  -4.266704
3     2000-01-06 00:00:00+00:00   .AEX  ...  0.862001  -0.148499
4     2000-01-07 00:00:00+00:00   .AEX  ...  3.128320   1.140496
5     2000-01-10 00:00:00+00:00   .AEX  ...  0.129058  -2.047497
6     2000-01-11 00:00:00+00:00   .AEX  ...  0.782647  -0.245074
7     2000-01-12 00:00:00+00:00   .AEX  ...  0.271311  -1.304490
8     2000-01-13 00:00:00+00:00   .AEX  ...  0.071858  -2.633065
9     2000-01-14 00:00:00+00:00   .AEX  ...  0.727395  -0.318286

for key,value in indices.items():
    indices[key] = value.reset_index(drop = True)
    rv1 = np.full((len(value.index),1),0,dtype=float)
    rv5 = np.full((len(value.index),1),0,dtype=float)
    rv22 = np.full((len(value.index),1),0,dtype=float)
    for j in list(range(22, len(value.index), 1)):
        rv1[j] = value.iloc[j-1]['LogRvol']
        rv5[j] = np.mean(value.iloc[j - 5:j]['LogRvol'])
        rv22[j] =  np.mean(value.iloc[j - 22:j]['LogRvol'])
    indices[key] = pd.concat([value,pd.DataFrame(rv1),pd.DataFrame(rv5),pd.DataFrame(rv22)],axis=1)
    indices[key] = value.iloc[22:]
    indices[key] = value.reset_index(drop=True)

运行代码后,我期望更新的 dict 项目实际上不是。

这是预期和未达到的结果

indices = dict(AEX = df[df.Symbol==".AEX"],AORD = df[df.Symbol==".AORD"],BFX = df[df.Symbol==".BFX"])

ict_items([('AEX', Unnamed: 0 Symbol    ...      Rvol    LogRvol rv1 rv5 rv22
0     2000-02-03 00:00:00+00:00   .AEX  ...  0.000580  -7.453228 
1     2000-02-04 00:00:00+00:00   .AEX  ...  5.646706   1.731072 -7.453228 
2     2000-02-05 00:00:00+00:00   .AEX  ...  0.014028  -4.266704 1.731072
3     2000-02-06 00:00:00+00:00   .AEX  ...  0.862001  -0.148499 -4.266704
4     2000-02-07 00:00:00+00:00   .AEX  ...  3.128320   1.140496 -0.148499
5     2000-02-10 00:00:00+00:00   .AEX  ...  0.129058  -2.047497 ..etc
6     2000-02-11 00:00:00+00:00   .AEX  ...  0.782647  -0.245074 
7     2000-02-12 00:00:00+00:00   .AEX  ...  0.271311  -1.304490 
8     2000-02-13 00:00:00+00:00   .AEX  ...  0.071858  -2.633065 
9     2000-02-14 00:00:00+00:00   .AEX  ...  0.727395  -0.318286 

标签: pythonpandas

解决方案


您示例中的 for 循环会覆盖indices[key]4 次的值。

因此,您的代码相当于:

for key, value in indices.items():
    indices[key] = value.reset_index(drop=True)

这显然不会改变 的值indices[key]

请注意,在这种情况下,更新您正在迭代的项目通常不是一个好主意indices


推荐阅读