Log Kalkulation

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich versuche erfolglos mit folgenden Code die Log Rendite der beiden Zahlenreihen zu berechnen. Leider kommt dabei immer eine - sehr - ausführliche Fehlermeldung...

Code: Alles auswählen

# Load ABB Data
ABB = pd.read_csv('C:/Users/Startklar/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Anaconda3 (64-bit)/ABB.csv',sep=";",names=['Datum','ABBN_Preis'])
Roche = pd.read_csv('C:/Users/Startklar/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Anaconda3 (64-bit)/Roche.csv',sep=";", names=['ROG_Datum','ROG_Preis'])
Roche.head(10)

# Concatenate the different dataframes

stocks_data = pd.concat([ABB,Roche], axis=1)
stocks_data.head()

stocks_data['Datum'] = pd.to_datetime(stocks_data['Datum'])
stocks_data.head()

# Kick out the Dates

stocks_data = stocks_data.loc[:,['Datum','ABBN_Preis','ROG_Preis']]
stocks_data.head()

# Compute Log Returns

stocks_data_log = np.log(stocks_data / stocks_data.shift(1))
stocks_data_log.head()


Die Fehlermeldung sieht wie folgt aus (länger gehts fast nicht mehr)

Code: Alles auswählen

# Calculate the Log Returns

stocks_data_log = np.log(stocks_data / stocks_data.shift(1))
stocks_data_log.head()
1
# Calculate the Log Returns
2
​
3
stocks_data_log = np.log(stocks_data / stocks_data.shift(1))
4
stocks_data_log.head()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in na_arithmetic_op(left, right, op, str_rep)
    148     try:
--> 149         result = expressions.evaluate(op, str_rep, left, right)
    150     except TypeError:

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, op_str, a, b, use_numexpr)
    207     if use_numexpr:
--> 208         return _evaluate(op, op_str, a, b)
    209     return _evaluate_standard(op, op_str, a, b)

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    120     if result is None:
--> 121         result = _evaluate_standard(op, op_str, a, b)
    122 

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 

TypeError: unsupported operand type(s) for /: 'str' and 'float'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-62-5c8fcb5cdb27> in <module>
      1 # Calculate the Log Returns
      2 
----> 3 stocks_data_log = np.log(stocks_data / stocks_data.shift(1))
      4 stocks_data_log.head()

~\anaconda3\lib\site-packages\pandas\core\ops\__init__.py in f(self, other, axis, level, fill_value)
    701 
    702             left, right = self.align(other, join="outer", level=level, copy=False)
--> 703             new_data = left._combine_frame(right, pass_op, fill_value)
    704             return left._construct_result(new_data)
    705 

~\anaconda3\lib\site-packages\pandas\core\frame.py in _combine_frame(self, other, func, fill_value, level)
   5298         if ops.should_series_dispatch(self, other, func):
   5299             # iterate over columns
-> 5300             new_data = ops.dispatch_to_series(self, other, _arith_op)
   5301         else:
   5302             with np.errstate(all="ignore"):

~\anaconda3\lib\site-packages\pandas\core\ops\__init__.py in dispatch_to_series(left, right, func, str_rep, axis)
    414         raise NotImplementedError(right)
    415 
--> 416     new_data = expressions.evaluate(column_op, str_rep, left, right)
    417     return new_data
    418 

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, op_str, a, b, use_numexpr)
    206     use_numexpr = use_numexpr and _bool_arith_check(op_str, a, b)
    207     if use_numexpr:
--> 208         return _evaluate(op, op_str, a, b)
    209     return _evaluate_standard(op, op_str, a, b)
    210 

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    119 
    120     if result is None:
--> 121         result = _evaluate_standard(op, op_str, a, b)
    122 
    123     return result

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     68         _store_test_result(False)
     69     with np.errstate(all="ignore"):
---> 70         return op(a, b)
     71 
     72 

~\anaconda3\lib\site-packages\pandas\core\ops\__init__.py in column_op(a, b)
    383 
    384         def column_op(a, b):
--> 385             return {i: func(a.iloc[:, i], b.iloc[:, i]) for i in range(len(a.columns))}
    386 
    387     elif isinstance(right, ABCSeries) and axis == "columns":

~\anaconda3\lib\site-packages\pandas\core\ops\__init__.py in <dictcomp>(.0)
    383 
    384         def column_op(a, b):
--> 385             return {i: func(a.iloc[:, i], b.iloc[:, i]) for i in range(len(a.columns))}
    386 
    387     elif isinstance(right, ABCSeries) and axis == "columns":

~\anaconda3\lib\site-packages\pandas\core\ops\common.py in new_method(self, other)
     62         other = item_from_zerodim(other)
     63 
---> 64         return method(self, other)
     65 
     66     return new_method

~\anaconda3\lib\site-packages\pandas\core\ops\__init__.py in wrapper(left, right)
    498         lvalues = extract_array(left, extract_numpy=True)
    499         rvalues = extract_array(right, extract_numpy=True)
--> 500         result = arithmetic_op(lvalues, rvalues, op, str_rep)
    501 
    502         return _construct_result(left, result, index=left.index, name=res_name)

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in arithmetic_op(left, right, op, str_rep)
    195     else:
    196         with np.errstate(all="ignore"):
--> 197             res_values = na_arithmetic_op(lvalues, rvalues, op, str_rep)
    198 
    199     return res_values

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in na_arithmetic_op(left, right, op, str_rep)
    149         result = expressions.evaluate(op, str_rep, left, right)
    150     except TypeError:
--> 151         result = masked_arith_op(left, right, op)
    152 
    153     return missing.dispatch_fill_zeros(op, left, right, result)

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in masked_arith_op(x, y, op)
     92         if mask.any():
     93             with np.errstate(all="ignore"):
---> 94                 result[mask] = op(xrav[mask], yrav[mask])
     95 
     96     else:

TypeError: unsupported operand type(s) for /: 'str' and 'str'

Die Bezeichung stock_data ist doch ein sogenanntes Dataframe und sollte berechnet werden können oder irre ich mich da...?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Datum solltest du schon beim Einlesen richtig konvertieren und nicht hinterher. Und wahrscheinlich hast du Zahlen mit Dezimalkomma, solltest du auch beim Einlesen angeben. Lies mal die Dokumentation zu read_csv.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Auch wenn ich das Format noch explizit im Befehl angebe (siehe unten), kommt die gleiche Fehlermeldung. Ich glaube, dass das Format bereits zuvor richtig war, da es an der Darstellung nichts geändert hat.

Code: Alles auswählen

# Load ABB Data
ABB = pd.read_csv('C:/Users/Startklar/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Anaconda3 (64-bit)/ABB.csv',sep=";",decimal=",",names=['Datum','ABBN_Preis'])
Roche = pd.read_csv('C:/Users/Startklar/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Anaconda3 (64-bit)/Roche.csv',sep=";",decimal=",", names=['ROG_Datum','ROG_Preis'])
Roche.head(10)
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Wie würde ich das Datum gleich zu Beginn formatieren? Kann ich diesen Befehl verwenden? parse_dates = True, encoding =' utf-8 '
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Das Datumsformat müsste allerdings auch korrekt sein, ich habe dies nämlich im CSV File direkt angepasst (ein bisschen beschissen aber für mich einfacher). Trotzdem bleibt die Fehlermeldung bestehen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann zeig doch mal die Daten? Welche Typen haben dir Spalten?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Leider kann ich keine Dateien laden, deshalb bin ich mir nicht ganz sicher wie ich die daten zeigen soll. Vielleicht hilft das:

Ich habe die Spalte A und B, die sehen wie folgt aus

A B

30.09.2010 140.6
29.10.2010 150
30.11.2010 143

Zellenformat A: Datum
Zellenformat B: Standardzahl

Danke
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Kann mir hier wirklich niemand weiterhelfen?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Sind das jetzt die Daten, wie sie in der Datei stehen, oder wie sie im DataFrame stehen?
Gibt es irgendeine Zeile, die nicht diesem Format entspricht?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Das sind die Daten, welche so im CSV-File stehen. Sämtliche Daten haben das gleiche Format.

Im Data Frame werden die Daten auch genau so und damit korrekt wiedergegeben. Das einzige was nicht funktioniert ist halt die Berechnung der Log Performance.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Kann ja nicht sein, weil eine Spalte den Typ String hat.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich weiss wirklich nicht woran es liegt. Ich würde gerne die CSV-Datei irgendwo laden, damit man isch ein Bild davon machen kann. Gibt es ein anderes Forum wo das möglich ist? Es ist sehr frustrierend wenn einem die Zeit davon läuft und man einfach nicht weiter kommt. Wie erkennt Ihr denn ein str und wie kann das im CSV geprüft werden?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Dass eine der Spalten vom Typ 'str' ist, steht in der Fehlermeldung.

Es reicht doch, wenn du die ersten paar Zeilen deiner csv-Datei hier rein kopierst - und zwar zwischen Code-Tags.

Und dann lass dir doch mal anzeigen, welchen Typ die Spalten in deinem Dataframe haben.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das solltest Du doch selbst prüfen können, ob in der Datei eine Zeile vorkommt, die keine Zahl enthält.
Falls Du nichts findest, spalte die Datei so lange in mehrere auf, und schau in den Teil, der nicht eine Zahlenspalte hat.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Das habe ich eigentlich gemacht. Die Datei enthält 121 Zeilen, jede dieser Zeilen verfügt über einen Datumswert getrennt durch ein , und gefolgt vom entsprechenden Preis. Es gibt nur eine Spalte. Ich habe weitere Versuche unternommen das Ding zum laufen zu bringen. Hier deshalb die ersten drei Werte, alle in der Spalte A:

30.09.2020,315.15
31.08.2020,315.7
31.07.2020,316.1

Wie gesagt, sämtliche Zeilen sehen gleich aus und weitere Spalten gibt es nicht!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bebbi: was meinst Du "alle in der Spalte A"? Du hast doch zwei Spalten, die durch Komma getrennt sind. Oben gibst Du aber als Trennzeichen Strichpunkt an. Da ist also der Fehler.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich wollte das ganze verbessern da die erste heraufgeladene Variante nicht funktioniert hat. Ich habe gelesen, dass man die Systemsprache auf Englisch (USA) setzten kann, damit die CSV-Datei richtig erstellt wird. Deshalb habe ich jetzt nur eine Spalte, getrennt mit "," zwischen den beiden Werten. Ich habe dann sep=";" auf sep="," geändert, aber das ganze funktioniert weiterhin nicht. Jetzt erhalte ich bei folgendem Code diese Fehlermeldung (zum Glück kürzer als die erste).

Code: Alles auswählen

stocks_data['log_ret_ABBN'] = 100*np.log(stocks_data['ABBN_Preis']).diff()
stocks_data['log_ret_ROG'] = 100*np.log(stocks_data['ROG_Preis']).diff()
stocks_data.head()
Fehlermeldung

Code: Alles auswählen

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
AttributeError: 'str' object has no attribute 'log'

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
<ipython-input-180-aecced4dfae6> in <module>
----> 1 stocks_data['log_ret_ABBN'] = 100*np.log(stocks_data['ABBN_Preis']).diff()
      2 stocks_data['log_ret_ROG'] = 100*np.log(stocks_data['ROG_Preis']).diff()
      3 stocks_data.head()

~\anaconda3\lib\site-packages\pandas\core\series.py in __array_ufunc__(self, ufunc, method, *inputs, **kwargs)
    677 
    678         inputs = tuple(extract_array(x, extract_numpy=True) for x in inputs)
--> 679         result = getattr(ufunc, method)(*inputs, **kwargs)
    680 
    681         name: Optional[Hashable]

TypeError: loop of ufunc does not support argument 0 of type str which has no callable log method

Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich habe die CSV-Datei als CSV (MS DOS) gespeichert kann das einen Einfluss haben, ist das falsch?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gilt immer noch das, was vor etlichen Posts geschrieben wurde: Du hast in dieser Spalte nicht nur Zahlen.
121 Zeilen ist auch noch nicht zu lang, als dass man das hier als Code-Block posten könnte.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Also, ich habe jetzt manuell jedes einzelne von diesen scheiss Kommas mit einem Leerschlag ersetzt. Aber auch das funktioniert leider nicht!!!
Antworten