【发布时间】:2016-07-17 15:54:06
【问题描述】:
我正在编写一个函数来进行非线性曲线拟合并且遇到了这个错误:
TypeError: Improper input: N=2 must not exceed M=1.
我不知道为什么当我只从 csv 文件中读取列时,它认为我试图使用太大的数组。
import math
#stolen sig-fig function <--trust but verify
def round_figures(x, n):
return round(x, int(n - math.ceil(math.log10(abs(x)))))
def try_michaelis_menten_fit( df, pretty=False ):
# auto-guess
p0 = ( df['productFinal'].max(), df['substrateConcentration'].mean() )
popt, pcov = curve_fit( v, df['substrateConcentration'], df['productFinal'], p0=p0 )
perr = sqrt( diag( pcov ) )
kcat_km = popt[0] / popt[1]
# error propegation
kcat_km_err = (sqrt( (( (perr[0]) / popt[0])**2) + (( (perr[1]) / popt[1])**2) ))
kcat = ( popt[0] )
kcat_std_err = ( perr[0] )
km_uM = ( popt[1] * 1000000 )
km_std_err = ( perr[1] *1000000)
if pretty:
results = {
'kcat': round_figures(kcat, 3),
'kcat_std_err': round_figures(kcat_std_err, 3),
'km_uM': round_figures(km_uM, 5),
'km_std_err': round_figures(km_std_err, 3),
'kcat/km': round_figures(kcat_km, 2),
'kcat/km_err': round_figures(kcat_km_err, 2),
}
return pandas.Series( results )
else:
return popt, perr
df = pandas.read_csv( 'PNP_Raw2Fittr.csv' )
fits = df.groupby('sample').apply( try_michaelis_menten_fit, pretty=True )
fits.to_csv( 'fits_pretty_output.csv' )
print( fits )
我正在读取一个数据框,它是这样的扩展版本:
sample yield dilution time productAbsorbance substrateConcentration internalStandard
0 PNPH_I_4 2.604 10000 2400 269.6 0.007000 2364.0
1 PNPH_I_4 2.604 10000 2400 215.3 0.002333 2515.7
2 PNPH_I_4 2.604 10000 2400 160.3 0.000778 2252.2
3 PNPH_I_4 2.604 10000 2400 104.1 0.000259 2302.4
4 PNPH_I_4 2.604 10000 2400 60.9 0.000086 2323.5
5 PNPH_I_4 2.604 10000 2400 35.4 0.000029 2367.9
6 PNPH_I_4 2.604 10000 2400 0.0 0.000000 2165.3
当我在这个较小版本的数据框上调用这个函数时,它似乎可以工作,但是当我在大版本上使用它时,我得到了这个错误。当我添加 internalStandard 列并在此之前完美运行时,此错误就开始了。更令人困惑的是,当我使用旧版本的数据框恢复到旧代码时,它可以正常工作,但是如果我添加该行,我会得到预期的错误,但是,当我删除同一行时我的数据框并再次运行代码我仍然得到同样的错误!
我发现我在优化方法中传入method='trf' 而不是lm 我得到错误OverflowError: cannot convert float infinity to integer,但是我确实使用df.dropna(inplace=True),是否有类似的方法专门针对无穷大?
【问题讨论】:
-
这里有很多活动部件。哪一行抛出错误,回溯是什么?修剪将有助于调试:它是读取 CSV 还是 pandas 中的某些内容或 curve_fit 中的某些内容
-
当我在
popt, pcov = curve_fit( v, df['substrateConcentration'], df['productFinal'], p0=p0 )调用try_michaelis_menten_fit时会抛出错误。我已经用上面的小数据框尝试过这个并且它有效,只有当我使用df.groupby('sample').apply(try_michaelis_menten_fit)调用它时它才会失败。
标签: python-3.x pandas scipy curve-fitting