Ich habe die Aufgabe: Ich sollte einige Daten in großer Datei finden und diese Daten zu einer Datei hinzufügen. Datei, wo ich Daten suche ist 22 million string
und ich teile es mit chunksize
. In einer anderen Datei habe ich Spalte mit 600 id of users
und ich finde Informationen über jeden Benutzer in einer großen Datei. Die erste Ich teile Daten auf Intervall und nächste Suche Informationen über jeden Benutzer in all diesen Dateien. Ich benutze timer
um zu wissen, wie viel Zeit es verbringen, um in Datei und durchschnittliche Zeit zu schreiben, um Informationen in df
Größe 1 million string
zu finden und in die Datei schreiben ist 1.7 sec
. Und nach der Zählung aller Zeit des Programms bekomme ich 6 hours
. (1.5 sec * 600 id * 22 interval
). Ich möchte es schneller machen, aber ich weiß keinen Weg neben chunksize
. füge ich meinen CodePandas: Wie man Algorithmus schneller macht
el = pd.read_csv('df2.csv', iterator=True, chunksize=1000000)
buys = pd.read_excel('smartphone.xlsx')
buys['date'] = pd.to_datetime(buys['date'])
dates1 = buys['date']
ids1 = buys['id']
for i in el:
i['used_at'] = pd.to_datetime(i['used_at'])
df = i.sort_values(['ID', 'used_at'])
dates = df['used_at']
ids = df['ID']
urls = df['url']
for i, (id, date, url, id1, date1) in enumerate(zip(ids, dates, urls, ids1, dates1)):
start = time.time()
df1 = df[(df['ID'] == ids1[i]) & (df['used_at'] < (dates1[i] + dateutil.relativedelta.relativedelta(days=5)).replace(hour=0, minute=0, second=0)) & (df['used_at'] > (dates1[i] - dateutil.relativedelta.relativedelta(months=1)).replace(day=1, hour=0, minute=0, second=0))]
df1 = DataFrame(df1)
if df1.empty:
continue
else:
with open('3.csv', 'a') as f:
df1.to_csv(f, header=False)
end = time.time()
print(end - start)
in dieser Zeichenfolge sollte nicht 'wählen = wählen Sie [chunk.columns]' und sollte 'wählen sein = ausgewählt [chunk.columns]'? – ldevyataykina
In der Ausgabedatei bekomme ich 'id', das nicht in' kauft'. Es ist verbunden mit der Arbeit von 'merge'. Ich ändere es 'fusionierte = pd.merge (Buys, Brocken, left_on = 'id', right_on = 'ID')', weil es drehen 'KeyError' – ldevyataykina
@ldevyataykina Ah, ja,' select' ein Tippfehler ist; sollte überall "ausgewählt" werden. Ich habe auch versehentlich "ID" und "ID" getauscht. (Die Antwort wurde aktualisiert.) Aber ich verstehe nicht, warum du 'id's bekommst, die nicht in' buy's sind - es sollte nicht passieren. Vielleicht versuche, 'how = 'inner' hinzuzufügen, um explizit zu verschmelzen. – ptrj