将Pandas DataFrame传递给Scipy.optimize.curve_fit

时间:2016-02-05 21:16:10

标签: python pandas scipy mathematical-optimization model-fitting

我想知道使用Scipy来配合Pandas DataFrame列的最佳方法。如果我有一个包含(ABCDZ_real)列的数据表(Pandas DataFrame),其中Z取决于A,B ,C和D,我想拟合每个DataFrame行(Series)的函数,它对Z(Z_pred)进行预测。

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

func(series, param_1, param_2...)

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

我已尝试使用

将DataFrame传递给scipy.optimize.curve_fit
curve_fit(func, table, table.loc[:, 'Z_real'])

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

1 个答案:

答案 0 :(得分:3)

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

  

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

     

测量数据的自变量。

     

ydata M长度序列

     

依赖数据 - 名义上为f(xdata,...)

在这种情况下,您的自变量 xdata是A到D列,即table[['A', 'B', 'C', 'D']],您的因变量 {{1} }是ydata

另请注意,table['Z_real']应为(k,M)数组,其中 k 是预测变量(即列)和 M 是观察数(即行数)。因此,您应该将输入数据帧转换为(4,M)而不是(M,4),即xdata

table[['A', 'B', 'C', 'D']].T的整个调用可能如下所示:

curve_fit

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

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