将Pandas数据帧传递到Scipy.optimize.curve\u fi

2024-05-05 12:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道使用Scipy来适应Pandas数据框列的最佳方法。如果我有一个包含列(ABCDZ_real)的数据表(Pandas DataFrame),其中Z依赖于a、B、C和D,那么我想为每个数据帧行(序列)拟合一个函数,该函数对Z(Z_pred)进行预测。

要匹配的每个函数的签名是

func(series, param_1, param_2...)

其中series是与数据帧的每一行相对应的Pandas系列。我使用Pandas系列,以便不同的函数可以使用不同的列组合。

我尝试使用

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

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


Tags: 数据对象函数numpypandas列表paramtable
1条回答
网友
1楼 · 发布于 2024-05-05 12:21:57

您对curve_fit的调用不正确。来自the documentation

xdata : An M-length sequence or an (k,M)-shaped array for functions with k predictors.

The independent variable where the data is measured.

ydata : M-length sequence

The dependent data — nominally 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

相关问题 更多 >