Seite 1 von 2

Log Kalkulation

Verfasst: Samstag 3. Oktober 2020, 21:09
von Bebbi
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...?

Re: Log Kalkulation

Verfasst: Samstag 3. Oktober 2020, 22:10
von Sirius3
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.

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 08:31
von Bebbi
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)

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 08:45
von Bebbi
Wie würde ich das Datum gleich zu Beginn formatieren? Kann ich diesen Befehl verwenden? parse_dates = True, encoding =' utf-8 '

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 08:58
von Bebbi
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.

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 09:05
von Sirius3
Dann zeig doch mal die Daten? Welche Typen haben dir Spalten?

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 12:19
von Bebbi
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

Re: Log Kalkulation

Verfasst: Sonntag 4. Oktober 2020, 19:16
von Bebbi
Kann mir hier wirklich niemand weiterhelfen?

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 07:14
von Sirius3
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?

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 09:53
von Bebbi
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.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 10:10
von Sirius3
Kann ja nicht sein, weil eine Spalte den Typ String hat.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 12:25
von Bebbi
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?

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 13:08
von sparrow
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.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 13:23
von Sirius3
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.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 13:34
von Bebbi
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!

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 14:13
von Sirius3
@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.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 14:31
von Bebbi
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


Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 15:07
von Bebbi
Ich habe die CSV-Datei als CSV (MS DOS) gespeichert kann das einen Einfluss haben, ist das falsch?

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 15:41
von Sirius3
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.

Re: Log Kalkulation

Verfasst: Montag 5. Oktober 2020, 15:49
von Bebbi
Also, ich habe jetzt manuell jedes einzelne von diesen scheiss Kommas mit einem Leerschlag ersetzt. Aber auch das funktioniert leider nicht!!!