Возврат к пустой функции возвращает ошибку: объект с плавающей точкой не имеет атрибута exp - PullRequest
0 голосов
/ 14 октября 2018

Я наконец понял, почему я получаю "странную" ошибку при вызове функции.Но я не понимаю, ПОЧЕМУ я получил ошибку или как ее избежать в будущем.

Ошибка была:

rates  = Qi*np.exp(-Di*(days-T0))

AttributeError: у объекта 'float' нет атрибута 'exp'

Этот вопрос был задан более 5 лет назад ( Numpy AttributeError: у объекта 'float' нет атрибута 'exp' и он похож на Различное поведение арифметики в dtype float 'object 'and' float '), но ни один из ответов не говорит мне, как произвольно избежать этой проблемы.

Я использую панд и 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 (не для панд) и ожидает numy векторы.Запуск функции 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 имел разные значения, но в рабочем и нерабочем случаях вектор дней (который является столбцом df3 [dayscol]) в «int64».Однако, когда я сделал следующее изменение в вызываемой функции:

      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 голосов
/ 14 октября 2018

Базовый тип массива numpy не может быть разработан.

Только Python строго типизирован ( Является ли Python строго типизированным? )

В этом его главная сила и одно из главных разочарованийСлабость.

В вашем случае нет реального пути обойти это.В некоторых случаях вы можете Принудительно указать тип параметра функции в Python? , но в вашем случае вы не можете указать базовый тип в numpy.ndarray.

Что вызывает беспокойство

Мне потребовалось более одного дня, чтобы отладить эту

ошибку, которая вызвала бы у вас прямую проверку типов в строке 110

Файл "... \"PetroPy \ DeclineCurves.py ", строка 110, в arps
rate = Qi * np.exp (-Di * (days-T0)) *
AttributeError: у объекта 'float' нет атрибута 'exp'

О, я получаю большие данные, медленное время загрузки, ... Что ж, проверяйте свой код, когда используете трансцендентные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...