如何从熊猫数据框中提取x和y对,然后用于symfit?

时间:2019-05-21 21:16:39

标签: python pandas symfit

我正在使用熊猫读取.csv文件。然后,我从数据框中获取x和y对,并使用symfit对数据执行全局拟合。我是熊猫数据框和symfit的新手。我当前的概念验证代码适用于两个数据集,但是我想以一种适用于这种方式的方式编写该代码,但是无论从原始.csv文件中导入的数据集是多少,这些文件始终在同一个文件中格式-列将始终是xy值对,格式为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数组?

1 个答案:

答案 0 :(得分:1)

事实证明,这比我想象的要容易得多。我能够重新构造输入的.csv文件,以便有一栏用于x值,一栏用于y值,一栏用于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()

这有效,并且比我认为的最终结果更清洁。重组输入文件以简化数据导入很有帮助!