在循环中应用curve_fit

时间:2015-06-28 12:27:38

标签: python pandas

如果表示,我在将函数拟合到循环中的数据时遇到问题。这是数据帧中的groupby对象。该groupby对象具有以下结构:

    f [MHz] T [K]   Rs
0   400 1.75    13.472493
1   400 2.00    14.054298
2   400 2.25    14.900821
3   400 2.50    16.453007
4   400 2.75    18.050460
13  800 1.75    36.008499
14  800 2.00    37.924344
15  800 2.25    41.246962
16  800 2.50    45.780308
17  800 2.75    51.904333
26  1200    1.75    53.809458
27  1200    2.00    61.427391
28  1200    2.25    67.438682
29  1200    2.50    75.302240
30  1200    2.75    88.015202

现在,我想对每个频率组(400,800和1200)应用拟合,并在循环内有效地执行此操作。第一次尝试是:

i = 0
for freq, grp1 in RT1.groupby(['f [MHz]']):
    T[i] = grp1['T [K]'].values[condition]
    Rs[i]= grp1['Rs'].values[condition]
    popt[i], pcov[i] = curve_fit(RsT, T[i], Rs[i], p0)
    figure = plt.figure()
    grp1.plot(x = 'T [K]',y = 'Rs', color = colors[i], marker = markers[i] , ls = 'None', title = 'R(T) {f} MHz with Fit'.format(f = freq)) 
    plt.plot(T[i], RsT(T[i], *popt[i]), label = 'fit')
    i += 1

我从0到2运行以创建T1,Rs1; T2,Rs2等。条件将T值限制在一定范围内,这似乎正常。但是,我无法将curv_fit例程适当地添加到所有三个频率组 - 它引发了以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-14-0b3b4adc65e7> in <module>()
     24 i = 0
     25 for freq, grp1 in RT1.groupby(['f [MHz]']):
---> 26     T[i] = grp1['T [K]'].values[condition]
     27     Rs[i]= grp1['Rs'].values[condition]
     28     popt[i], pcov[i] = curve_fit(RsT, T[i], Rs[i], p0)

ValueError: setting an array element with a sequence.

问题是,我没有为每个组分配三个不同的T和Rs数组 - 我希望T1和Rs1的值为400 MHz,T2和Rs2的值为800 MHz等等。另外,popt和pcov应分别计算三次(popt1,pcov1; pop2,pcov2; ...),对应于每个数据组的单独拟合。 我希望,有人可以解释,是否有可能在循环中应用curv_fit例程,如果是的话 - 如何。 非常感谢!

1 个答案:

答案 0 :(得分:0)

听起来TRsT是带有非对象dtype 的NumPy数组。尝试将值数组分配给T的一个单元格会引发您看到的ValueError:

In [117]: T = np.zeros(3)

In [118]: T[0] = np.arange(10)
ValueError: setting an array element with a sequence.

您可以使用对象dtype

的数组
In [119]: T = np.zeros(3, dtype='O')

In [120]: T[0] = np.arange(10)

In [121]: T
Out[121]: array([array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 0, 0], dtype=object)

但是对象数组不是特别快;你也可以制作TRsT列表。