Problem mit Korrelationsberechnung

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.
Antworten
yannik0802
User
Beiträge: 5
Registriert: Freitag 23. Dezember 2016, 13:46

Hallo Ihr Lieben,

ich habe aktuell ein Problem und komme leider nicht weiter, bin im Umgang mit python noch sehr grün hinter den Ohren. :mrgreen:

Ich versuche aktuell die Korrelation der Schlusskurse vom DAX & SP500 seit 2000 zu berechnen. Diese habe ich in zwei unterschiedlichen csv-Dateien gespeichert. Im Folgenden mal mein Code:

Code: Alles auswählen

import pandas as pd
import numpy as np
from scipy.stats.stats import pearsonr

data_file1 = 'DAX30.csv'
data_file2 = 'SP500.csv'

# read data from csv
df1 = pd.read_csv(data_file1, parse_dates=True, index_col=0)
df2 = pd.read_csv(data_file2, parse_dates=True, index_col=0)

cor1 = np.corrcoef(df1['Adj Close'], df2['Adj Close'])[0,1]

cor2 = pearsonr(df1['Adj Close'], df2['Adj Close'])
Versucht habe ich es bisher mit corrcoef() und pearsonr() (wie Ihr im Code sehen könnt)

Bei corrcoef() erhalte ich folgende Fehlermeldung:
ValueError: all the input array dimensions except for the concatenation axis must match exactly

und bei pearsonr() diese:
ValueError: operands could not be broadcast together with shapes (4361,) (4305,)

Ich verstehe, dass meine Daten offensichtlich nicht genau zusammen passen. Ich habe bereits versucht über .shape() oder .reshape() meine Daten zu shapen, aber leider gelingt mir das nicht. Wie genau schaffe ich es nun die Daten für meine Korrelationsberechnung verfügbar zu machen?

Ich freue mich über jeglichen Input.

Lg Yannik
Zuletzt geändert von Anonymous am Sonntag 12. Februar 2017, 12:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@yannik0802: Die Anzahl der Daten unterscheidet sich offenbar geringfügig wenn man die Zahlen in der zweiten Fehlermeldung vergleicht. Das bekommst sich nicht mit einem `reshape()` weg, Du musst halt überlegen warum sich die Daten unterscheiden und wie Du das lösen willst. Fehlen Daten die man auffüllen kann/muss, falls ja wie? Oder kann man die Daten die zu viel sind einfach raus filtern?
yannik0802
User
Beiträge: 5
Registriert: Freitag 23. Dezember 2016, 13:46

@BlackJack: Erstmal danke für deine Antwort und den Input.

Ich glaube die Anzahl der Datensätze unterscheidet sich aufgrund der unterschiedlichen Feiertagen ind DE und USA. Schließlich handelt es sich ja um Schlusskurse und an Feiertagen wird nicht gehandelt. Wie ich damit nun umgehe, ist tatsächlich eine gute Frage.

Ich hätte eine Idee, aber weiss leider nicht wie ich diese umsetzen kann.
Prinzipiell habe ich in meinen dataframes außer den Adj Close Daten auch noch Zeitangaben im Format 09-01-2016 (zb) gespeichert. Gibt es eine Möglichkeit wie ich die Zeitangaben quasi als "Index" für die Korrelationsberechnung nutzen kann?

Ich würde zum Beispiel gerne für jeden Tag X die Korrelation der beiden Kurse über eine festgelegte Periode (z.B. 30 Handelstage) berechnen lassen.

Am 30.01 sollte dann z.B. die Korrelation von DAX und SP500 vom 01.-30.01 berechnet werden. Am 31. dann vom 02.-31.01 etc.

Vielleicht ginge das mit so etwas in der Richtung:

Code: Alles auswählen

for line in df1['Date']:
	if df1['Date'] == df2['Date']:
		cor1 = corrcoef(df1['Adj Close'], df2['Adj Close'])
		return cor1
	else:
		return False
Könnte man die False-Werte dann einfach irgendwie ignorieren? Oder bekomme ich dann ein Problem, weil ich wieder nicht genau gleich viele Werte für die Korrelationsberechnung habe?

Kann ich irgendwie definieren, dass anstatt von False z.B. der letzte ermittelte Wert ausgegeben wird?

Ich bin mir sicher, dass das alles funktioniert, aber leider hab ich viel zu wenig Ahnung :?
BlackJack

@yannik0802: Arbeite am besten mal ein Tutorial zu `pandas` durch und schau Dich in der Dokumentation um. Man kann Datumsangaben als Index verwenden. Was bei Zeitreihen auch Sinn macht. Und man kann Dataframes beispielsweise mit `join()` über den Index ”joinen” ähnlich wie bei Datenbanken.
yannik0802
User
Beiträge: 5
Registriert: Freitag 23. Dezember 2016, 13:46

Okay, werde ich machen. Danke dir.
Antworten