Berechnung ausführen für Elemente einer Liste

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mack

Hallo zusammen,

ich bin neu hier und auch bei der Programmierung mit Python, daher möchte ich mich vorweg schonmal für meine vermutlich amateurhaften Fragen entschuldigen.

Nun zu meinem konkreten Problem:

Ich habe für verschiedene Zeitreihen die logarithmierten Renditen berechnet und in Spalten ausgegeben. Jede Spalte enthält die log returns für eine Aktie. Nun würde ich gerne für jede einzelne Aktie auf Basis der jeweiligen log returns verschiedene Kennzahlen berechnen.

Ich habe die einzelnen Aktien in eine Liste gepackt. Die Liste besteht aus den Überschriften für die Spalten mit den log returns. Meine Liste heißt "stockslistLogReturn". Mein Dataframe heißt "stockprices". Mein Ansatz ist nun für das Shortfall Risk folgender:

Code: Alles auswählen

stockprices_SFR = stockprices[[stockslistLogReturn]].apply(
    lambda x:numpy.where(x<0,1,0)).sum()/(stockprices.shape[0]-1)
stockprices_SFR
Mein Problem ist nun, dass ich folgende Fehlermeldung erhalte:

Code: Alles auswählen

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-10-0a257b083405> in <module>
      1 #
      2 #
----> 3 stockprices_SFR = stockprices[[stockslistLogReturn]].apply(
      4     lambda x:numpy.where(x<0,1,0)).sum()/(stockprices.shape[0]-1)
      5 stockprices_SFR

C:\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2932                 key = list(key)
   2933             indexer = self.loc._convert_to_indexer(key, axis=1,
-> 2934                                                    raise_missing=True)
   2935 
   2936         # take() does not accept boolean indexers

C:\Anaconda3\lib\site-packages\pandas\core\indexing.py in _convert_to_indexer(self, obj, axis, is_setter, raise_missing)
   1352                 kwargs = {'raise_missing': True if is_setter else
   1353                           raise_missing}
-> 1354                 return self._get_listlike_indexer(obj, axis, **kwargs)[1]
   1355         else:
   1356             try:

C:\Anaconda3\lib\site-packages\pandas\core\indexing.py in _get_listlike_indexer(self, key, axis, raise_missing)
   1159         self._validate_read_indexer(keyarr, indexer,
   1160                                     o._get_axis_number(axis),
-> 1161                                     raise_missing=raise_missing)
   1162         return keyarr, indexer
   1163 

C:\Anaconda3\lib\site-packages\pandas\core\indexing.py in _validate_read_indexer(self, key, indexer, axis, raise_missing)
   1244                 raise KeyError(
   1245                     u"None of [{key}] are in the [{axis}]".format(
-> 1246                         key=key, axis=self.obj._get_axis_name(axis)))
   1247 
   1248             # We (temporarily) allow for some missing keys with .loc, except in

KeyError: "None of [Index([('ML FP Equity LogReturn', 'BKT SM Equity LogReturn')], dtype='object')] are in the [columns]"
ML FP Equity LogReturn und BKT SM Equity LogReturn sind die beiden Elemente in der Liste, für die ich jeweils das Shortfall Risk berechnen möchte. Wenn ich in der ursprünglichen Formel allerdings "stockslistLogReturn" ersetze mit "'ML FP Equity LogReturn','BKT SM Equity LogReturn'"

Es funktioniert, wenn ich den Code also wie folgt laufen lasse:

Code: Alles auswählen

stockprices_SFR = stockprices[['ML FP Equity LogReturn','BKT SM Equity LogReturn']].apply(
    lambda x:numpy.where(x<0,1,0)).sum()/(stockprices.shape[0]-1)
stockprices_SFR
Warum funktioniert es nicht, wenn ich die Liste im Code angebe?
Was müsste ich ändern, damit es mit der Angabe der Liste ebenfalls funktioniert?
Antworten