Rentry到numpy函数返回错误:float对象没有属性exp

时间:2018-10-13 23:00:25

标签: python pandas numpy

我终于弄清楚了为什么在函数调用中出现“奇怪”错误。但是我不明白为什么会收到错误或以后如何避免该错误。

错误是:

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

问题:

有没有一种方法可以确保不再发生这种情况?我花了一天的时间来调试它,我很担心,因为我有很多非熊猫函数,当我在其他项目中使用它们时,我不想让它们失败。这甚至与函数调用方式有关吗?

谢谢。

1 个答案:

答案 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”

哦,我得到的数据量很大,加载时间很慢,...使用先验功能时请检查一下代码。