我想知道使用Scipy来配合Pandas DataFrame列的最佳方法。如果我有一个包含(A
,B
,C
,D
和Z_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对象。)
答案 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'])