我终于弄清楚了为什么在函数调用中出现“奇怪”错误。但是我不明白为什么会收到错误或以后如何避免该错误。
错误是:
rates = Qi*np.exp(-Di*(days-T0))
AttributeError:“浮动”对象没有属性“ exp”
这个问题是5年前问的(Numpy AttributeError: 'float' object has no attribute 'exp',它与Different behavior of arithmetics on dtype float 'object' and 'float'相似),但没有一个答案告诉我如何任意避免该问题。
我正在使用pandas和numpy。该函数的调用方式如下:
df3['Model_EXP'], df3['Model_EXPcum'] =arps.arps(days = df3[dayscol], Qi=parmexp[0], Di=parmexp[1], T0=parmexp[2])
其中df3是数据帧,列df3 [dayscol]是int64类型的列,而parmexp是包含该函数参数的元组。
该函数最初是为numpy(不是熊猫)编写的,并且需要numpy向量。函数def的开始如下:
def arps(days = None, Qi = None, Di = None, Bi = 0., T0=None, DTMIN=-5., QMIN = 1., Oil=True):
if (not Di or not Qi):
print("Nominal Decline or Rate not entered in routine arps. Stopping.")
sys.exit()
if (np.isnan(np.sum(days))):
print("Error in days passed to routine arps. Some non-days in vector. Stopping.")
sys.exit()
if (Di < 0.):
Di = -1.*Di # just in case someone got their signs wrong
#
rates = np.zeros(len(days))
cums = np.zeros(len(days))
dtval = np.zeros(len(days))
if (T0 == None):
T0 = days[0]
if (Bi == 0.): # Exponential Decline
rates = Qi*np.exp(-Di*(days-T0)) # THIS IS WHERE THINGS GET INTERESTING
我在应用程序中多次调用了此函数。它一直都有效。我添加了另一个函数以另一个数据框调用此例程。但是,即使在相同的执行过程中也可行,我还是开始出现以下错误:
File "...Local\conda\conda\envs\py36\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "decline_curve_analysis.py", line 993, in predpred
df3['Model_EXP'], df3['Model_EXPcum'] =arps.arps(days = df3[dayscol], Qi=parmexp[0], Di=parmexp[1], T0=parmexp[2])
File "...\PetroPy\DeclineCurves.py", line 110, in arps
rates = Qi*np.exp(-Di*(days-T0))
AttributeError: 'float' object has no attribute 'exp'
我不明白为什么,所以我在函数调用之前打印了数据框。 “ dayscol”列具有不同的值,但在工作和非工作情况下,“ int64”中的天向量(即df3 [dayscol]列)均如此。但是,当我在调用的函数中进行以下更改时:
print("Type of days",days.dtype)
newexp = (-Di*(days-T0))
print("Type of newexp",newexp.dtype)
rates = Qi*np.exp(-Di*(days-T0)) # THIS IS WHERE THINGS GET INTERESTING
我发现在有效的通话中收到以下答复:
Type of days int64
Type of newexp float64
但失败者得到以下信息:
Type of days int64
Type of newexp object
我现在通过将我的原始函数重写为:
newexp = (-Di*(days-T0))
newexp = newexp.astype(np.float64)
rates = Qi*np.exp(-Di*(days-T0)) # THIS IS WHERE THINGS GET INTERESTING
问题:
有没有一种方法可以确保不再发生这种情况?我花了一天的时间来调试它,我很担心,因为我有很多非熊猫函数,当我在其他项目中使用它们时,我不想让它们失败。这甚至与函数调用方式有关吗?
谢谢。
答案 0 :(得分:-2)
无法设计numpy数组的基础类型。
Python仅是动态强类型(Is Python strongly typed?)
这是主要优点,也是主要令人沮丧的缺点之一。
您的情况没有真正的解决方法。在某些情况下,您可以Force a function parameter type in Python?,但不能在numpy.ndarray中指定基础类型。
麻烦的是
花了我一天的时间来调试
错误提示您直接检查第110行的类型
文件“ ... \ PetroPy \ DeclineCurves.py”,第110行,在arps中
费率= Qi * np.exp(-Di *(天-T0))
AttributeError:“ float”对象没有属性“ exp”
哦,我得到的数据量很大,加载时间很慢,...使用先验功能时请检查一下代码。