2

我想知道使用 Scipy 拟合 Pandas DataFrame 列的最佳方法。如果我有一个数据表(Pandas DataFrame),其中Z 取决于 A、B、C 和DA列()。BCDZ_realZ_pred

要拟合的每个函数的签名是

func(series, param_1, param_2...)

其中 series 是对应于 DataFrame 每一行的 Pandas 系列。我使用 Pandas 系列,以便不同的功能可以使用不同的列组合。

我尝试将 DataFrame 传递给scipy.optimize.curve_fit使用

curve_fit(func, table, table.loc[:, 'Z_real'])

但由于某种原因,每个 func 实例都将整个数据表作为其第一个参数而不是每行的 Series 传递。我也尝试将 DataFrame 转换为 Series 对象列表,但这会导致我的函数被传递一个 Numpy 数组(我认为是因为 Scipy 执行从 Series 列表到不保留 Pandas 的 Numpy 数组的转换系列对象)。

4

1 回答 1

5

您的呼叫curve_fit不正确。从文档中

xdataM 长度序列或 (k,M) 形数组,用于具有 k 个预测变量的函数。

测量数据的自变量。

ydata : M-length 序列

依赖数据——名义上是 f(xdata, ...)

在这种情况下,您的自变量 xdata是 A 到 D 列,即table[['A', 'B', 'C', 'D']],而您的因变量 ydatatable['Z_real']

还要注意xdata应该是一个(k, M)数组,其中k是预测变量的数量(即列),M是观察值的数量(即行)。因此,您应该转置输入数据帧,使其为(4, M)而不是(M, 4),即table[['A', 'B', 'C', 'D']].T

整个调用curve_fit可能看起来像这样:

curve_fit(func, table[['A', 'B', 'C', 'D']].T, table['Z_real'])

这是一个显示多元线性回归的完整示例:

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit

X = np.random.randn(100, 4)     # independent variables
m = np.random.randn(4)          # known coefficients
y = X.dot(m)                    # dependent variable

df = pd.DataFrame(np.hstack((X, y[:, None])),
                  columns=['A', 'B', 'C', 'D', 'Z_real'])

def func(X, *params):
    return np.hstack(params).dot(X)

popt, pcov = curve_fit(func, df[['A', 'B', 'C', 'D']].T, df['Z_real'],
                       p0=np.random.randn(4))

print(np.allclose(popt, m))
# True
于 2016-02-05T22:00:17.350 回答