Python 如何从pandas数据帧中提取x和y对,然后在symfit中使用?
我正在使用pandas读取.csv文件。然后,我从数据帧中提取x和y对,并使用Python 如何从pandas数据帧中提取x和y对,然后在symfit中使用?,python,pandas,symfit,Python,Pandas,Symfit,我正在使用pandas读取.csv文件。然后,我从数据帧中提取x和y对,并使用symfit对数据执行全局拟合。我不熟悉熊猫数据帧和symfit。我当前的概念验证代码适用于两个数据集,但我想用一种方式来编写它,无论从原始.csv文件中导入多少数据集,该文件始终采用相同的格式--列总是成对的x和y值,格式为x1,y1,x2,y2,等 我是否可以迭代数据帧并拉出x1、y1、x2、y2、等的单个数组。?这是否违背了使用数据帧的目的 # creating the dataframe
symfit
对数据执行全局拟合。我不熟悉熊猫数据帧和symfit
。我当前的概念验证代码适用于两个数据集,但我想用一种方式来编写它,无论从原始.csv
文件中导入多少数据集,该文件始终采用相同的格式--列总是成对的x
和y
值,格式为x1,y1,x2,y2,
等
我是否可以迭代数据帧并拉出x1、y1、x2、y2、
等的单个数组。?这是否违背了使用数据帧的目的
# creating the dataframe
from pandas import read_csv, Series, DataFrame, isnull
data_file = read_csv(filename, header=None, skiprows=2) # no data in first two rows--these contain information I use later on for plotting
# important note: data sets contain different numbers of points, so pandas reads in nan for any missing values.
X1 = Series(data_file[0]).values
X1 = x_1[~isnull(x_1)] # removes any nan values (up for any suggestions on a better way to do this. Other methods I have tried remove entire rows or columns that contain nan)
Y1 = Series(data_file[1]).values
Y1 = y_1[~isnull(y_1)]
X2 = Series(data_file[2]).values
X2 = x_2[~isnull(x_2)]
Y2 = Series(data_file[3]).values
Y2 = y_2[~isnull(y_2)]
# sample data
# X1 = [12.5, 6.7, 5, 3.1, 128, 47, 5, 3.1, 6.7, 12.5]
# Y1 = [280, 150, 127, 85, 400, 401, 110, 96, 131, 241]
# X2 = [75, 39, 10, 7.7, 19, 39, 75]
# Y2 = [296, 257, 141, 100, 181, 254, 324]
从这里,我将X和Y传递给一个包含symfit模型和拟合函数的类。我不认为我可以连接X和Y;我需要它们保持独立,以便symfit将为每个数据集拟合单独的曲线(具有四个共享参数)
下面是我正在使用的模型。我可能在破坏symfit的语法。我仍在学习symfit,但到目前为止它非常棒。这种拟合适用于两个数据集,我能够提取拟合参数并在以后绘制结果
# This model assumes two data sets. I need to figure out how to fit as many as 10 data sets.
from symfit import parameters, variables, Fit, Model
fi_1 = 0 # These parameters change with each x,y pair. These will also be read from the original data file. I have them hard-coded here for ease.
fi_2 = 1
x_1, x_2, y_1, y_2 = variables('x_1, x_2, y_1, y_2')
vmax, km, evk, ev = parameters('vmax, km, evk, ev') # these are all shared
model = Model({
y_1: vmax * x_1 / (km * (1 + (fi_1 * evk)) + x_1 * (1 + (fi_1 * ev))),
y_2: vmax * x_2 / (km * (1 + (fi_2 * evk)) + x_2 * (1 + (fi_2 * ev)))})
fit = Fit(model, x_1=X1, x_2=X2, y_1=Y1, y_2=Y2)
fit_result = fit.execute()
问题摘要:
我可以有多达10对x,y同时适合。有没有一种干净的方法可以遍历数据帧,从而避免对传递给symfit的x和y数组进行硬编码?事实证明,这比我想象的要容易得多。我能够重新构造input.csv文件,这样就有一列表示x值,一列表示y值,一列表示fi,fi是在数据集之间更改的参数。所以所有的x,y对都有对应的fi值。例如,对于第一个数据集中的所有x,y对,fi=0,一旦第二个数据集开始,fi=1。对于任意数量的x,y对,我可以很好地展开它,并且fi的值不同。现在我能够有效地使用数据帧:
data_file = read_csv(filename, header=None, skiprows=1) #first row contains column labels now
以下是简化模型:
x, y, fi = variables('x, y, fi') # set variables
vmax, km, evk, ev = parameters('vmax, km, evk, ev') # set shared parameters
model = Model({y: vmax * x / (km * (1 + (fi * evk)) + x *(1 + (fi * ev)))})
fit = Fit(model, x=data_file[0], y=data_file[1], fi=data_file[2])
fit_result = fit.execute()
这是有效的,比我想象的要干净得多。重新构造输入文件以简化数据导入非常有帮助 你能提供你的数据样本吗?我很好奇你的模型是什么。它是否只有共享参数,或者也有特定于每对(x,y)的参数?既然您提到数据集的长度不同,连接将不起作用,因此您确实需要进行全局拟合。感谢您的快速回复!我已经编辑了这篇文章,所以它包含了一小部分样本数据和我在symfit中使用的模型。我知道必须能够创建一个动态symfit模型,该模型可以在加载时为尽可能多的x,y对工作,但我对它的外观有点迷茫。我很感激你的洞察力。