Я наконец понял, почему я получаю "странную" ошибку при вызове функции.Но я не понимаю, ПОЧЕМУ я получил ошибку или как ее избежать в будущем.
Ошибка была:
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
ВОПРОС:
Есть ли способ, которым я могуубедиться, что это не произойдет снова?Мне потребовался целый день, чтобы отладить это, и я обеспокоен, потому что у меня есть много функций, не относящихся к пандам, которые я не хочу терпеть неудачу, когда использую их в других проектах.Связано ли это даже с тем, как вызывается функция?
Спасибо.