Fehler beim Versuch, Protokollmethode auf pandas data frame Spalte in Python anzuwenden

Also, ich bin sehr neu in Python und Pandas (und Programmierung im Allgemeinen), aber ich habe Probleme mit einer scheinbar einfachen Funktion. Also habe ich das folgende Dataframe mit Daten erstellt, die mit einer SQL-Abfrage gezogen wurden (wenn du die SQL-Abfrage sehen musst, lass es mich wissen und ich füge es ein)

spydata = pd.DataFrame(row,columns=['date','ticker','close', 'iv1m', 'iv3m']) tickerlist = unique(spydata[spydata['date'] == '2013-05-31']) 

Danach habe ich eine Funktion geschrieben, um einige neue Spalten im Dataframe zu erstellen, die die bereits vorhandenen Daten verwenden:

 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 

Der einzige Teil, den ich mit einem Problem habe, ist die erste Zeile der Funktion:

 arr['retlog'] = log(arr['close']/arr['close'].shift(1)) 

Was, wenn ich laufe, mit diesem Befehl bekomme ich einen Fehler:

 result = spydata.groupby(['ticker']).apply(demean) 

Fehler:

  --------------------------------------------------------------------------- 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 

Ich habe versucht, die Funktion auf np.log sowie math.log zu ändern, in welchem ​​Fall bekomme ich den Fehler

 TypeError: only length-1 arrays can be converted to Python scalars 

Ich habe versucht, dies zu suchen, aber habe nichts direkt anwendbar gefunden. Irgendwelche Hinweise?

  • Holen Sie sich dot-Produkt von Dataframe mit Vektor, und senden Sie dataframe, in Pandas
  • Wie man ein 3d Arrays in ein Dataframe in Python umwandelt
  • Serialize Pandas (Python) Dataframe zum Binärformat
  • Wie kann man Pandas DataFrame von floats mit einem Formatstring für Spalten anzeigen?
  • Zuordnen mehrerer Dataframe basierend auf den passenden Spalten
  • Erstellen eines Pandas DataFrame aus Spalten anderer DataFrames mit ähnlichen Indizes
  • One Solution collect form web for “Fehler beim Versuch, Protokollmethode auf pandas data frame Spalte in Python anzuwenden”

    Dies geschieht, wenn der Datentyp der Spalte nicht numerisch ist. Versuchen

     arr['retlog'] = log(arr['close'].astype('float64')/arr['close'].astype('float64').shift(1)) 

    Ich vermute, dass die Zahlen als generische "Objekt" -Typen gespeichert sind, was ich weiß, dass Protokoll diesen Fehler auslöst. Hier ist eine einfache Darstellung des Problems:

     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 

    Ihr Versuch mit math.log funktionierte nicht, da diese Funktion nur für einzelne Zahlen (Skalare), nicht Listen oder Arrays ausgelegt ist.

    Für was es wert ist, denke ich, das ist eine verwirrende Fehlermeldung; Es hat mich doch einmal für eine Weile gestumpft. Ich frage mich, ob es verbessert werden kann.

    Python ist die beste Programmiersprache der Welt.