Pandas在多列上使用apply函数扩展

是否可以使用panda 的扩展函数使用window 对象的几列来计算多项式回归的系数?

我有一个数据框,它有两列,一个预测器和一个响应。我想使用熊猫的扩展()函数来计算每个扩展系列对的二阶多项式回归的相应系数。对于每一行,我想从应用于所有先前行的回归中获取更新的系数。

import pandas as pd
import numpy as np

def func1(df):
   # some processing
   return np.polyfit(df['Input'], df['Response'], 2)
   
def func2(x, y):
   # some processing
   return np.polyfit(x, y, 2)

np.random.seed(0)
df = pd.DataFrame(np.random.rand(10, 2).round(2), 
                  columns=['Input', 'Response'])

df[['Coef1', 'Coef2', 'Coef3']] = df.expanding(min_periods=3).apply(func)

我希望输出如下所示:

>>> df

   Input Response Coef1  Coef2  Coef3
0  0.63  0.23     NaN    NaN    NaN
1  0.45  0.11     NaN    NaN    NaN
2  0.17  0.71     NaN    NaN    NaN
3  0.17  0.32     0.19   0.54   0.50
4  0.65  0.99     0.48   0.23   0.60
5  0.21  0.54     0.71   0.89   0.97
6  0.63  0.73     0.22   0.05   0.80
7  0.54  0.23     0.87   0.01   0.25
8  0.33  0.06     0.18   0.96   0.03
9  0.18  0.72     0.13   0.38   0.13

我的不同尝试导致了两种类型的错误。如果我使用使用数据帧作为参数的函数,例如 in df[['Coef1', 'Coef2', 'Coef3']] = df.expanding(min_periods=3).apply(func1)),我会得到KeyError: 'Input'. 如果我使用之前提取参数的第二个函数df['Coef1', 'Coef2', 'Coef3'] = df.expanding(min_periods=3).apply(lambda x: func2(x['Input'], x['Output'])),我得到
DataError: No numeric types to aggregate
但是,如果我尝试例如df.expanding().cov(pairwise=True)它表明可以对由expanding. 这里有一个类似的问题:在数据框上应用扩展功能。但是,在函数中调用扩展()的解决方案似乎不适用于这种情况。我将不胜感激任何指示或建议。

我找到了一个使用 numpy 执行此操作的包:3jane.github.io/numpy_ext,因此它启发我手动执行此操作:

def func_np(df):
    length = len(df)
    if length == 1:
        return [[0], [0], [0]]

    coef1, coef2, coef3 = [], [], []

    x = df['A'].to_numpy()  # This is the predictor column
    y = df['B'].to_numpy()  # This is the response column

    for step in range(1, length + 1):
        weights = np.polyfit(x[: step], y[: step], 2)  # 2 is the polynomial's order
        coef1.append(weights[0])
        coef2.append(weights[1])
        coef3.append(weights[2])
    # Note that coef1, coef2, coef3 correspond to the polynomial terms from highest to lowest

    # It is easier to return a data frame, so that we can reassign the result to the initial one
    return pd.DataFrame({'Coef1': coef1, 'Coef2': coef2, 'Coef3': coef3})

我想用 Numba 来加快执行速度,但它无法识别 np.polyfit 函数。此外,我还没有找到一种巧妙的方法将结果分配回初始数据框。这就是为什么我仍然对使用 expand() 看到一个简单且更“pythonic”的解决方案感兴趣

以上是Pandas在多列上使用apply函数扩展的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>