我有一个数据框列表,并希望对这些数据框中的每个元素进行记录并找到第一个区别。在时间序列计量经济学中,此过程给出了近似的增长率。以下代码
for i in [0, 1, 2, 5]:
df1_list[i] = 100 * np.log(df_list[i]).diff()
给出错误
__main__:7: RuntimeWarning: divide by zero encountered in log
__main__:7: RuntimeWarning: invalid value encountered in log
当我查看结果时,结果数据帧中的许多元素都是nan。如何解决密码?谢谢!!
问题不在于您的代码,而是您的数据。您不会收到错误,但会收到两个警告。最可能的原因是您的DataFrame中的以下类型的值:
其中任何一个的对数都没有定义,所以得到NaN
。
一些测试数据
df = pd.DataFrame(np.random.rand(5, 5))
df = df.mask(np.random.random(df.shape) < .1)
0 1 2 3 4
0 0.579643 0.614592 0.333945 0.241791 0.426162
1 0.576076 0.841264 0.235148 0.577707 0.278260
2 0.735097 0.594789 0.640693 0.913639 0.620021
3 0.015446 NaN 0.062203 0.253076 0.042025
4 0.401775 0.522634 0.521139 0.032310 NaN
应用您的代码
for c in df:
print(100 * np.log(df[c]).diff())
产量这样输出(对于c = 1
:]
0 NaN
1 31.394708
2 -34.670002
3 NaN
4 NaN
您可以用nans
删除.dropna()
for c in df:
print(100 * np.log(df[c].dropna()).diff())
产生(c = 1
而言)
0 NaN
1 31.394708
2 -34.670002
4 -12.932474
如您所见,由于.dropna()
,我们已经“丢失”了一行,而您的第0行将始终为nan
,因为没有区别。
如果您对使用其他值的替换 nans感兴趣,则有不同的技术,例如fillna或imputation。