如何根据前 N 行计算 Pandas 数据框列的斜率

edn*_*edn 2 python numpy scipy dataframe pandas

我有以下示例数据框:

import pandas as pd

d = {'col1': [2, 5, 6, 5, 4, 6, 7, 8, 9, 7, 5]}

df = pd.DataFrame(data=d)
print(df)
Run Code Online (Sandbox Code Playgroud)

输出:

       col1
0      2
1      5
2      6
3      5
4      4
5      6
6      7
7      8
8      9
9      7
10     5
Run Code Online (Sandbox Code Playgroud)

我需要计算col1中前 N 行的斜率,并将斜率值保存在单独的列中(称为斜率)。所需的输出可能如下所示:(出于示例目的,下面给出的斜率值只是随机数。)

       col1  slope
0      2
1      5
2      6
3      5
4      4     3
5      6     4
6      7     5
7      8     2
8      9     4
9      7     6
10     5     5
Run Code Online (Sandbox Code Playgroud)

因此,在索引号为 4 的行中,斜率是 3,它是 [2, 5, 6, 5, 4] 的斜率。

有没有一种不使用 for 循环的优雅方法?


附录:

根据下面接受的答案,如果您收到以下错误:

TypeError: ufunc 'true_divide' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
Run Code Online (Sandbox Code Playgroud)

数据帧的索引可能不是数字。以下修改使其可以工作:

df['slope'] = df['col1'].rolling(5).apply(lambda s: linregress(range(5), s.values)[0])
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

您可以使用rolling+applyscipy.stats.linregress

from scipy.stats import linregress

df['slope'] = df['col1'].rolling(5).apply(lambda s: linregress(s.reset_index())[0])

print(df)
Run Code Online (Sandbox Code Playgroud)

输出:

    col1  slope
0      2    NaN
1      5    NaN
2      6    NaN
3      5    NaN
4      4    0.4
5      6    0.0
6      7    0.3
7      8    0.9
8      9    1.2
9      7    0.4
10     5   -0.5
Run Code Online (Sandbox Code Playgroud)