Python:取数据框中每一列的对数差

问题描述 投票:0回答:2

我有一个数据框列表,并希望对这些数据框中的每个元素进行记录并找到第一个区别。在时间序列计量经济学中,此过程给出了近似的增长率。以下代码

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。如何解决密码?谢谢!!

python logarithm
2个回答
0
投票

问题不在于您的代码,而是您的数据。您不会收到错误,但会收到两个警告。最可能的原因是您的DataFrame中的以下类型的值:

  1. 负数
  2. 非数值

其中任何一个的对数都没有定义,所以得到NaN


0
投票

一些测试数据

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感兴趣,则有不同的技术,例如fillnaimputation

© www.soinside.com 2019 - 2024. All rights reserved.