Ich beginne hier mit den Pandas DataFrame-Dokumenten: http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Ich möchte den DataFrame iterativ mit Werten in einer Zeitreihenberechnung füllen. Grundsätzlich möchte ich den DataFrame mit den Spalten A, B und Zeitstempelzeilen initialisieren, alle 0 oder alle NaN.
Ich würde dann Anfangswerte hinzufügen und diese Daten durchgehen, um beispielsweise die neue Zeile aus der vorherigen Zeile zu berechnen row[A][t] = row[A][t-1]+1
.
Ich verwende derzeit den folgenden Code, aber ich finde ihn irgendwie hässlich und es muss eine Möglichkeit geben, dies direkt mit einem DataFrame zu tun, oder nur eine bessere Möglichkeit im Allgemeinen. Hinweis: Ich verwende Python 2.7.
import datetime as dt
import pandas as pd
import scipy as s
if __name__ == '__main__':
base = dt.datetime.today().date()
dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
dates.sort()
valdict = {}
symbols = ['A','B', 'C']
for symb in symbols:
valdict[symb] = pd.Series( s.zeros( len(dates)), dates )
for thedate in dates:
if thedate > dates[0]:
for symb in valdict:
valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]
print valdict
.append
in pd und dem Anhängen einer Liste? Ich weiß, dass.append
in Pandas der gesamte Datensatz in ein neues Objekt kopiert wird. Funktioniert das Anhängen von Pythons anders?Antworten:
Hier einige Vorschläge:
Verwendung
date_range
für den Index:Hinweis: Wir könnten einen leeren DataFrame (mit
NaN
s) einfach durch Schreiben erstellen :Verwenden Sie ein numpy-Array, um diese Art von Berechnungen für die Daten durchzuführen:
Daher können wir den DataFrame erstellen:
quelle
index
x0
Dimensionen (columns = []
) und das Anhängen einer Spalte in jeder Schleife einer Schleife. Ich meinedf[col_name] = pandas.Series([...])
in einer Schleife, die durch Spaltennamen iteriert. Im ersteren Fall braucht nicht nur die Speicherzuweisung Zeit, sondern das Ersetzen von NaNs durch neue Werte scheint extrem langsam zu sein.Wenn Sie einfach einen leeren Datenrahmen erstellen und ihn später mit einigen eingehenden Datenrahmen füllen möchten, versuchen Sie Folgendes:
In diesem Beispiel verwende ich dieses Pandas-Dokument , um einen neuen Datenrahmen zu erstellen und dann Anhängen zu verwenden Datenrahmen , um mit Daten von oldDF in die newDF zu schreiben.
Wenn ich weiterhin neue Daten aus mehr als einer alten DD an diese neue DD anhängen muss, verwende ich einfach eine for-Schleife, um über pandas.DataFrame.append () zu iterieren.
quelle
append
(und in ähnlicher Weiseconcat
) jedes Mal der gesamte Datensatz in ein neues Objekt kopiert wird. Daher kann und wird das Iterieren und Anhängen zu einem erheblichen Leistungseinbruch führen. Weitere Informationen finden Sie unter: pandas.pydata.org/pandas-docs/stable/merging.htmlDer richtige Weg ™, um einen DataFrame zu erstellen
Die meisten Antworten hier zeigen Ihnen, wie Sie einen leeren DataFrame erstellen und ausfüllen, aber niemand wird Ihnen sagen, dass dies eine schlechte Sache ist.
Hier ist mein Rat: Warten Sie, bis Sie sicher sind, dass Sie alle Daten haben, mit denen Sie arbeiten müssen. Verwenden Sie eine Liste, um Ihre Daten zu sammeln, und initialisieren Sie dann einen DataFrame, wenn Sie bereit sind.
Es ist immer billiger, an eine Liste anzuhängen und einen DataFrame auf einmal zu erstellen, als einen leeren DataFrame (oder einen von NaNs) zu erstellen und immer wieder daran anzuhängen. Listen beanspruchen außerdem weniger Speicher und sind eine viel leichtere Datenstruktur , anhängen und entfernen können (falls erforderlich).
Der andere Vorteil dieser Methode ist, dass
dtypes
automatisch abgeleitet wird (anstatt zuzuweisenobject
allen zuzuweisen).Der letzte Vorteil ist das a
RangeIndex
automatisch für Ihre Daten erstellt wird , sodass Sie sich weniger Sorgen machen müssen (werfen Sie einen Blick auf die Armenappend
undloc
Methoden unten, Sie werden in beiden Elementen sehen, die eine angemessene Behandlung des Index erfordern).Dinge, die Sie NICHT tun sollten
append
oderconcat
innerhalb einer SchleifeHier ist der größte Fehler, den ich von Anfängern gesehen habe:
Der Speicher wird für jede
append
oder jedeconcat
Operation neu zugewiesen . Wenn Sie dies mit einer Schleife verbinden, erhalten Sie eine quadratische Komplexitätsoperation . Von demdf.append
Dokumentseite :Der andere Fehler, der damit verbunden
df.append
ist, besteht darin, dass Benutzer häufig vergessen, dass das Anhängen keine In-Place-Funktion ist. Daher muss das Ergebnis zurück zugewiesen werden. Sie müssen sich auch um die dtypes kümmern:Der Umgang mit Objektspalten ist niemals eine gute Sache, da Pandas Operationen an diesen Spalten nicht vektorisieren können. Sie müssen dies tun, um das Problem zu beheben:
loc
innerhalb einer SchleifeIch habe auch gesehen
loc
, wie an einen DataFrame angehängt wurde, der leer erstellt wurde:Nach wie vor haben Sie nicht jedes Mal die benötigte Speichermenge vorab zugewiesen, sodass der Speicher jedes Mal neu vergrößert wird, wenn Sie eine neue Zeile erstellen . Es ist genauso schlimm wie
append
und noch hässlicher.Leerer Datenrahmen von NaNs
Und dann wird ein DataFrame mit NaNs und allen damit verbundenen Einschränkungen erstellt.
Es erstellt wie die anderen einen DataFrame aus Objektspalten.
Das Anhängen hat immer noch alle Probleme wie die oben genannten Methoden.
Der Beweis ist im Pudding
Das Timing dieser Methoden ist der schnellste Weg, um festzustellen, wie stark sie sich in Bezug auf Speicher und Nutzen unterscheiden.
Benchmarking-Code als Referenz.
quelle
Initialisieren Sie einen leeren Frame mit Spaltennamen
Fügen Sie einem Frame einen neuen Datensatz hinzu
Vielleicht möchten Sie auch ein Wörterbuch übergeben:
Fügen Sie Ihrem vorhandenen Frame einen weiteren Frame hinzu
Leistungsüberlegungen
Wenn Sie Zeilen innerhalb einer Schleife hinzufügen, berücksichtigen Sie Leistungsprobleme. Bei etwa den ersten 1000 Datensätzen ist die Leistung von "my_df.loc" besser, wird jedoch allmählich langsamer, indem die Anzahl der Datensätze in der Schleife erhöht wird.
Wenn Sie vorhaben, innerhalb einer großen Schleife dünner zu werden (z. B. 10 Millionen Datensätze oder so), ist es besser, eine Mischung aus diesen beiden zu verwenden. Füllen Sie einen Datenrahmen mit iloc, bis die Größe ungefähr 1000 erreicht, hängen Sie ihn dann an den ursprünglichen Datenrahmen an und leeren Sie den temporären Datenrahmen. Dies würde Ihre Leistung um das Zehnfache steigern.
quelle
my_df = my_df.append(my_df2)
funktioniert bei mir nur, wenn ich es spezifiziereignore_index=True
.Angenommen, ein Datenrahmen mit 19 Zeilen
Spalte A konstant halten
Beibehaltung von Spalte b als Variable, die durch eine Schleife gegeben ist
Sie können das erste x in
pd.Series([x], index = [x])
durch einen beliebigen Wert ersetzenquelle