pandas / rolling().mean() / interpolate Anfangsbereich

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Hallo in die Runde,

wenn ich für eine Datenreihe (pandas.DataFrame) über rolling und mean den gleitenden Durchschnitt berechne, fehlt mir logischerweise der erste Teil der Linie, da mir Punkte für die "Vergangenheit" fehlen.

Nun kenne ich interpolate-Funktionen für das Füllen von fehlenden Daten oder "Glätten" einer Kurve, aber es muss doch auch irgendwie möglich sein, diesen gleitenden Durchschnitt im Anfangsbereich zu interpolieren?

Geht das?
Wie?

Danke euch!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum willst du lügen? Du hast keine Daten. Du müsstest sie extrapolieren. Nach welcher Vorschrift?
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

__deets__ hat geschrieben:Warum willst du lügen? Du hast keine Daten. Du müsstest sie extrapolieren. Nach welcher Vorschrift?
Das ist natürlich ein Argument.
Also auf die "Schönheit" des Graphen verzichten oder diesen erst ab dem ersten möglichen Datenpunkt des Durchschnitts anzeigen?
Oder siehst du noch eine andere Möglichkeit?

P.S. Und wie würde das Extrapolieren(=Lügen) funktionieren?
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was du darstellen magst kannst nur du wissen. Wenn dein Publikum nur am Durchschnitt interessiert ist, kannst du abschneiden. Ich würde es nicht machen.

Extrapolieren kannst du zb mit einer Funktion die du gefittet hast. Damit kannst du dann Daten generieren.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

__deets__ hat geschrieben:Extrapolieren kannst du zb mit einer Funktion die du gefittet hast. Damit kannst du dann Daten generieren.
Ah, also durch interpolieren habe ich f(x) und berechne einfach die ersten Werte? Wie einfach ... danke dir!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiss jetzt nicht, wieso du fitten und interpolieren gleichsetzt. Ersteres kann dazu genutzt werden, letzteres zu machen - aber umgekehrt geht da nix.
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

__deets__ hat geschrieben:Ich weiss jetzt nicht, wieso du fitten und interpolieren gleichsetzt. Ersteres kann dazu genutzt werden, letzteres zu machen - aber umgekehrt geht da nix.
Also ich nutze aus interp1d aus scipy.interpolate. Ist das nicht dasselbe wie fitten?
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn ich schon sage, das es nicht dasselbe ist, dann wohl kaum :mrgreen:

Fitting ist der Versuch, eine Funktion zu finden, die deine Daten moeglichst gut nachbildet. Dann kannst du auch ausserhalb der bekannten Werte Daten erzeugen. Wie *sinnvoll* die sind, ist immer fraglich, darum nenne ich das ganze ja luegen.

Fitting ist aber ein kompliziertes Ding, da gibt es keine one-size-fits-all Loesung. Du musst schon wissen, wie deine Daten aussehen, und was dein Fitting fuer Eigenschaften haben soll.

Interpolieren geht immer nur zwischen Werten, die bekannt sind. Das ist ja nun genau das, was du schon kannst, wobei dir halt werte "fehlen".

Warum ist das denn ueberhaupt ein Problem, das du keine Daten hast?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

PythonTrader hat geschrieben:Also auf die "Schönheit" des Graphen verzichten oder diesen erst ab dem ersten möglichen Datenpunkt des Durchschnitts anzeigen?
Wenn du den gleitenden Mittelwert plotten willst, dann solltest du das auch tun und nur das, das macht die Doku nämlich einfacher.
Du musst den Plot einfach nur mit gleitender Mittelwert von Y beschreiben. Du brauchst nicht zu erklären was der gleitende Mittelwert ist oder
wie er berechnet wird.

Wenn du an den Anfang und das Ende der Kurve noch Daten dazu-berechnest, dann musst du ein Vielfaches dokumentieren.
Denn diese Daten sind eben kein gleitender Mittelwert von Y mehr. Sie werden anders berechnet, diese andere Berechnung musst
du beschreiben, im Plot musst du zeigen wo der gleitende Mittelwert anfängt und aufhört und was deine anders berechneten Daten sind.
PythonTrader hat geschrieben:P.S. Und wie würde das Extrapolieren(=Lügen) funktionieren?
Extrapolieren ist nicht Lügen. Gelogen ist es nur, wenn du es heimlich machst ohne im Plot klar zu kennzeichnen welche Daten echt sind und welche
extrapoliert sind.

Auf
https://de.wikipedia.org/wiki/Nigeria#E ... %B6lkerung
werden in der Tabelle gemessene Daten und extrapolierte Daten angezeigt.
Es ist nicht gelogen eine Bevölkerungsschätzung für 2030 und 2050 zu machen.
In meinem Plot zu diesen Daten
Bild
zeige ich aber nur echte Daten (+ minimale Extrapolation bis 2019), weil ich das Ganze nicht unnötig kompliziert machen wollte mit der Kennzeichnung der Prognose.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
PythonTrader
User
Beiträge: 55
Registriert: Montag 13. Februar 2017, 22:31

Entschuldige die späte Rückmeldung.
Vielen Dank für die Erläuterungen. Ich werde mich mit dem Extrapolieren beschäftigen, es aber nur selten und dann dokumentiert nutzen.

Danke allen!
Nach Basic, Pascal, Visual Basic, C++, Visual C, HTML und PHP folgt endlich Python und Shell!
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Wie lange reichen denn deine Datasets zurück und welchen Bereich willst du dir anzeigen? Bei den meisten Sachen berechne ich - aus Faulheit - z. B. gleitende Durchschnitte von Beginn an mit der von dir beschriebenen Lücke und plotte nur z. B. das letzte Jahr oder einen Ausschnitt, der mich interessiert. Wenn ich mich nicht gerade für den Anfang des Datensets interessiere, habe ich da "überall" schön durchgehende gleitende Durchschnitte.

Alle anderen Überlegungen - meine Meinung - sind nicht praktikabel, weil du falsche Werte generierst und kaum noch unterscheiden kannst, was jetzt real und was eben nur der Optik wegen da ist. Das führt dann leicht zu Fehlschlüssen usw., die du kaum noch später ausfindig machen kannst.

BTW: Bei matplotlib nutze ich schon mal die Achsenbeschriftungen, um mir nach einem Zeilenumbruch was unterzubringen (aber meist nur das erste und letzte Datum, das in den Plot Eingang gefunden hat).
Antworten