Ошибка при попытке применить метод журнала к столбцу фрейма данных pandas в Python
Итак, я очень плохо знаком с Python и Pandas (и программированием в целом), но у меня возникли проблемы с, казалось бы, простой функцией. Поэтому я создал следующий фрейм данных, используя данные, извлеченные с помощью SQL-запроса (если вам нужно увидеть SQL-запрос, дайте мне знать, и я его вставлю)
spydata = pd.DataFrame(row,columns=['date','ticker','close', 'iv1m', 'iv3m'])
tickerlist = unique(spydata[spydata['date'] == '2013-05-31'])
После этого я написал функцию для создания некоторых новых столбцов в кадре данных, используя данные, уже содержащиеся в нем:
def demean(arr):
arr['retlog'] = log(arr['close']/arr['close'].shift(1))
arr['10dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
arr['60dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
arr['90dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
arr['1060rat'] = arr['10dvol']/arr['60dvol']
arr['1090rat'] = arr['10dvol']/arr['90dvol']
arr['60dis'] = (arr['1060rat'] - arr['1060rat'].mean())/arr['1060rat'].std()
arr['90dis'] = (arr['1090rat'] - arr['1090rat'].mean())/arr['1090rat'].std()
return arr
Единственная часть, с которой у меня проблемы, это первая строка функции:
arr['retlog'] = log(arr['close']/arr['close'].shift(1))
Который при запуске этой команды выдает ошибку:
result = spydata.groupby(['ticker']).apply(demean)
Ошибка:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-196-4a66225e12ea> in <module>()
----> 1 result = spydata.groupby(['ticker']).apply(demean)
2 results2 = result[result.date == result.date.max()]
3
C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\core\groupby.pyc in apply(self, func, *args, **kwargs)
323 func = _intercept_function(func)
324 f = lambda g: func(g, *args, **kwargs)
--> 325 return self._python_apply_general(f)
326
327 def _python_apply_general(self, f):
C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\core\groupby.pyc in _python_apply_general(self, f)
326
327 def _python_apply_general(self, f):
--> 328 keys, values, mutated = self.grouper.apply(f, self.obj, self.axis)
329
330 return self._wrap_applied_output(keys, values,
C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\core\groupby.pyc in apply(self, f, data, axis, keep_internal)
632 # group might be modified
633 group_axes = _get_axes(group)
--> 634 res = f(group)
635 if not _is_indexed_like(res, group_axes):
636 mutated = True
C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\core\groupby.pyc in <lambda>(g)
322 """
323 func = _intercept_function(func)
--> 324 f = lambda g: func(g, *args, **kwargs)
325 return self._python_apply_general(f)
326
<ipython-input-195-47b6faa3f43c> in demean(arr)
1 def demean(arr):
----> 2 arr['retlog'] = log(arr['close']/arr['close'].shift(1))
3 arr['10dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
4 arr['60dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
5 arr['90dvol'] = sqrt(252)*sqrt(pd.rolling_std(arr['ret'] , 10 ))
AttributeError: log
Я попытался изменить функцию на np.log, а также math.log, и в этом случае я получаю сообщение об ошибке
TypeError: only length-1 arrays can be converted to Python scalars
Я пытался найти это, но не нашел ничего подходящего. Есть какие-нибудь подсказки?
1 ответ
Это происходит, когда тип данных столбца не является числовым. Пытаться
arr['retlog'] = log(arr['close'].astype('float64')/arr['close'].astype('float64').shift(1))
Я подозреваю, что числа хранятся как общие типы объектов, которые, как я знаю, заставляют журнал выдавать эту ошибку. Вот простая иллюстрация проблемы:
In [15]: np.log(Series([1,2,3,4], dtype='object'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-15-25deca6462b7> in <module>()
----> 1 np.log(Series([1,2,3,4], dtype='object'))
AttributeError: log
In [16]: np.log(Series([1,2,3,4], dtype='float64'))
Out[16]:
0 0.000000
1 0.693147
2 1.098612
3 1.386294
dtype: float64
Ваша попытка с math.log
не работал, потому что эта функция предназначена только для отдельных чисел (скаляров), а не для списков или массивов.
Для чего это стоит, я думаю, что это сбивающее с толку сообщение об ошибке; во всяком случае, это однажды поставило меня в тупик. Интересно, можно ли это улучшить.