Pandas: Zeitreihe vervollständigen

Code-Stücke können hier veröffentlicht werden.
Antworten
pytony
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2017, 11:26

Sonntag 4. August 2019, 20:01

Hallo alle!

Ich habe mehrere Reden analysiert, die von 1999 bis 2015 gehen (monatlich). Für jede Rede wurde der Ton (in der Datei tone_i und tone_ii genannt) berechnet. Also war die Rede eher negativ oder positiv gestimmt. Nun ist es so, dass

1. es vorkommen kann, dass in einem Monat mehrere Reden gehalten wurden und
2. nicht jeden Monat eine Rede gehalten wurde.

Damit eine ununterbrochene Zeitreihe entsteht und immer nur ein Wert einem Monat zugewiesen wird, habe ich folgendes vor:

Im Falle von 1. : Es wird der Durchschnitt aller Werte in einem Monat berechnet und übernommen.
Im Falle von 2. : Der vorangegangene monatliche Wert wird für den Monat ohne Reden übernommen. Fand also in Februar keine Rede statt, so wird für Februar der Wert von Januar übernommen.

Jede Rede hat ein bestimmtes Thema behandelt. Für jedes Thema habe ich vor die Zeitreihe i.S.v. x: Datum (hier: "Date") und y: Ton (hier: "tone_i") zu erstellen. Sie soll monatlich von 01/1999-02/2017 gehen.

Bisher habe ich folgenden Code geschrieben:

Code: Alles auswählen

import pandas as pd

#csv Datei wird eingelesen
ecb_seperated_analyzed=pd.read_csv(filepath_or_buffer="python_forum.csv",header=0,sep=',')

#Eine neue DataFrame wird erstellt.
#Für Monate mit mehreren Reden (und wiederum allen Themen) wird der Mittelwert errechnet wie vorhin beschrieben (siehe Fall 1)
ecb_seperated_series=pd.DataFrame()
ecb_seperated_series["tone_i"]=ecb_seperated_analyzed.groupby(["date","date_of_speech","dominant_topic_seperated"])["tone_i"].mean()


#Jetzt konzentrieren wir uns auf die Reden, die die Fiskalpolitik behandeln (fiscal policy -> für ein matching reicht "Fiscal")
#ecb_seperated_analyzed[ecb_seperated_analyzed["dominant_topic_seperated"].str.match("Fiscal")] -> Damit nur die Zeilen ausgegeben werden, die sich um "Fiscal Policy" drehen)
#.resample("M",how=None) -> Da die Zeitreihe nicht durchgängig monatlich verläuft, sondern einige Monate überspringt, sollen diese nun ergänzt werden. Hierfür soll nicht nochmal bspw. ein Mittelwert berechnet werden
# sondern mit .fillna(method="ffill", inplace=True) mit den vorangegangenen Wert gefüllt werden (siehe Fall 2)

ecb_fiscal_seperated_series_tone_i = ecb_seperated_analyzed[ecb_seperated_analyzed["dominant_topic_seperated"].str.match("Fiscal")].resample("M",how=None).fillna(method="ffill", inplace=True)

Hier bekomme ich leider folgenden Fehler: TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'
Die Problemzeile scheint diese Zeile zu sein: ecb_fiscal_seperated_series_tone_i = ecb_seperated_analyzed[ecb_seperated_analyzed["dominant_topic_seperated"].str.match("Fiscal")].resample("M",how=None).fillna(method="ffill", inplace=True)

Das obwohl ich bei der Erstellung der Datei die Zeile per pd.todatetime erstellt habe. Selbst wenn ich in den read_csv parameter die Spalte ("date") als datetime Spalte vorgebe, funktioniert es leider nicht.

Weiss jemand, was ich machen kann? Die Spalte "date_of_speech" ist die Ursprungsspalte, die ich zur datetime-Spalte konvertiert habe, damit die Reden auch chronologisch geordnet sind.



Ich habe für euch hier ein Sample hochgeladen (.csv-Datei auf OneDrive hochgeladen): https://1drv.ms/u/s!As0cHBpV4ab_6xQeeP1 ... Z?e=CbnrtZ



Vielen lieben Dank für jeden Tipp und jede Hilfe im Voraus! :-)

Grüße
pytony
Sirius3
User
Beiträge: 10895
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 5. August 2019, 09:01

Der Link ist kaputt, da kann man keine csv-Datei herunterladen. Ich sehe auch nirgends Code, der die Spalte date zu einem DateTime konvertiert.

Spalte die lange Zeile in mehrere auf, dann muß man das auch nicht in einem langen Kommentar beschreiben, was da passiert. Schau Dir den Typ der verwendeten Spalten an, um sicher zu gehen, dass da wirklich das drin ist, was Du Dir vorstellst.
pytony
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2017, 11:26

Montag 5. August 2019, 12:14

Sirius3 hat geschrieben:
Montag 5. August 2019, 09:01
Der Link ist kaputt, da kann man keine csv-Datei herunterladen.

Danke für den Hinweis. Komischerweise funktioniert der Link auch vom anderen Computer. Sicherheitshalber hier ein Link, der bestimmt funktioniert: https://jlubox.uni-giessen.de/dl/fi74Yk ... hqYyH4bqg6
Sirius3 hat geschrieben:
Montag 5. August 2019, 09:01
Ich sehe auch nirgends Code, der die Spalte date zu einem DateTime konvertiert.
Oh sorry! Habe ich das noch nicht erwähnt? Die "date" Spalte enthält bereits das Datum im DateTime Format.
Sirius3 hat geschrieben:
Montag 5. August 2019, 09:01
Spalte die lange Zeile in mehrere auf, dann muß man das auch nicht in einem langen Kommentar beschreiben, was da passiert. Schau Dir den Typ der verwendeten Spalten an, um sicher zu gehen, dass da wirklich das drin ist, was Du Dir vorstellst.
alles klar. mache ich und melde mich dann wieder.
Sirius3
User
Beiträge: 10895
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 5. August 2019, 12:31

Unter dem Link finde ich eine xlsx-Datei keine csv-Datei. Und der Inhalt sieht auch ziemlich durcheinander aus.
pytony
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2017, 11:26

Montag 5. August 2019, 12:58

entschuldige. Als ich die csv auf onedrive hochgeladen habe, hat sich wohl onedrive gedacht, es täte mir einen gefallen, indem es die datei sofort als xlsx darstellt. als ich ein reupload auf den anderen cloudspeicher gemacht habe, habe ich nicht aufgepasst und habe dabei eine xlsx datei hochgeladen.

jetzt aber die csv datei mit "," als sep: https://jlubox.uni-giessen.de/dl/fiLBmR ... 8Ff87otabt
Benutzeravatar
__blackjack__
User
Beiträge: 4676
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 5. August 2019, 13:22

Die Datei ist komplett wirr. Da scheint CSV, viel ganz normaler Fliesstext, und teilweise sogar in Zeichenketten umgewandelte Python-Listen, durcheinander in der Datei zu stecken‽
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
Sirius3
User
Beiträge: 10895
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 5. August 2019, 13:30

Die csv-Datei hat keinen Header, woher kommen also die ganzen Spaltennamen?
Der Index ist auch der Default-Index und nicht der von einer date-Spalte.
Das kann also nicht der vollständige Code sein.
Antworten