Python 如何有效地获取数据帧中行之间的日志变化率?

Python 如何有效地获取数据帧中行之间的日志变化率?,python,numpy,pandas,dataframe,series,Python,Numpy,Pandas,Dataframe,Series,假设我有一些数据帧(在我的例子中大约有10000行,这只是一个最小的示例) 出于我的目的,我需要为数据帧中的每个col\u I计算由ln(col\u I(n+1)/col\u I(n))表示的序列,其中n表示一个行号。 如何计算此值 背景知识 我知道我可以通过使用 >>> sample_df.diff() col1 col2 0 NaN NaN 1 1 1 2 1 1 3 1 1 4 1 1 5

假设我有一些数据帧(在我的例子中大约有10000行,这只是一个最小的示例)

出于我的目的,我需要为数据帧中的每个
col\u I
计算由
ln(col\u I(n+1)/col\u I(n))表示的序列,其中
n
表示一个行号。 如何计算此值


背景知识 我知道我可以通过使用

>>> sample_df.diff()

   col1  col2
0   NaN   NaN
1     1     1
2     1     1
3     1     1
4     1     1
5     1     1
6     1     1
7     1     1
8     1     1
或者百分比变化,即
(col_i(n+1)-col_i(n))/col_i(n+1)
,使用

>>> sample_df.pct_change()

       col1      col2
0       NaN       NaN
1  1.000000  0.100000
2  0.500000  0.090909
3  0.333333  0.083333
4  0.250000  0.076923
5  0.200000  0.071429
6  0.166667  0.066667
7  0.142857  0.062500
8  0.125000  0.058824
我一直在努力寻找一种简单的方法来直接将每个连续的列除以前一列。如果我知道如何做到这一点,我可以在事后将自然对数应用于序列中的每个元素

目前为了解决我的问题,我需要创建另一列,每列的行元素向下移动1,然后在两列之间应用公式。不过,对我来说,这似乎是混乱和次优的

任何帮助都将不胜感激

您可以使用它,它符合您的建议

>>> sample_df['col1'].shift()
0    NaN
1    1.0
2    2.0
3    3.0
4    4.0
5    5.0
6    6.0
7    7.0
8    8.0
Name: col1, dtype: float64
最后的答案是:

import math
(sample_df['col1'] / sample_df['col1'].shift()).apply(lambda row: math.log(row))

0         NaN
1    0.693147
2    0.405465
3    0.287682
4    0.223144
5    0.182322
6    0.154151
7    0.133531
8    0.117783
Name: col1, dtype: float64
只需使用np.log:

np.log(df.col1 / df.col1.shift())
您也可以按照@nikita的建议使用apply,但速度会慢一些

此外,如果您想对整个数据帧执行此操作,您可以执行以下操作:

np.log(df / df.shift())
IIUC:

比率的对数是对数的差值:

sample_df.apply(np.log).diff()
或者更好:

np.log(sample_df).diff()


时机

Gahh我知道这肯定缺少一个简单的函数。这绝对是一个进步。谢谢不错的加法,但我想“移位”是这里的关键。这是我在数学上的疏忽。谢谢
np.log(sample_df).diff()