Ich habe gehört, dass kurze Reden und Röcke besser sind.
Selbst in der Datenanalyse möchte ich so viele Experimente wie möglich durchführen Routinemäßige Wiederholungsarbeiten wie die Vorbehandlung sollten so kurz wie möglich sein.
Ich denke, dass die Profilerstellung in solchen Fällen nützlich ist.
Vor kurzem habe ich beschlossen, Daten mit einer Größe von mehreren zehn GB privat zu verarbeiten.
Durch diese Arbeit geht es um Parallelverarbeitung, Profilerstellung usw. Ich habe eine kleine Entdeckung gemacht, also wünschte ich, ich könnte sie teilen.
Das erste ist die Entdeckung beim Profiling mit line_profiler
.
Viele Leute haben über line_profiler geschrieben. Es ist ein großartiges Projekt.
Ich kann Ihnen die tatsächlich verwendeten Daten nicht zeigen. .. .. Wir werden mit Beispieldaten fortfahren, die eine ähnliche Struktur wie diese Daten haben.
In [1]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100000 entries, 0 to 99999
Data columns (total 3 columns):
key 100000 non-null int64
data1 100000 non-null int64
data2 100000 non-null int64
dtypes: int64(3)
memory usage: 3.1 MB
In [2]: df.head()
Out[2]:
key data1 data2
0 1800 4153 159
1 5568 6852 45
2 432 7598 418
3 4254 9412 931
4 3634 8204 872
Die tatsächliche Anzahl der Daten beträgt zig Millionen Zeilen. Da es sich hier um Beispieldaten handelt, werden sie auf 100.000 Zeilen gelöscht.
Der folgende Code wurde aggregiert (er ist aufgrund der zeilenweisen Profilerstellung redundant).
def proc1():
chunker = pd.read_csv('./data/testdata.csv', chunksize=10000)
li = []
for df in chunker:
#Spaltennamen ändern
df.rename(columns={'data': 'value1', 'data2': 'value2'}, inplace=True)
#Aggregieren Sie für jeden Schlüssel und nehmen Sie den Gesamtwert1
li.append(df.groupby('key')['value1'].sum())
g = pd.concat(li, axis=1)
return g.sum(axis=1)
value2
vorgehen.line_profiler
Dieses Mal wird es in ipython notebook verwendet.
%load_ext line_profiler
Sie können mit dem magischen Befehl "% lprun" darauf zugreifen. Verwenden wir dies, um das obige "proc1" zu messen.
In [3]: %load_ext line_profiler
In [4]: %lprun -f proc1 proc1()
Timer unit: 1e-06 s
Total time: 0.060401 s
File: <ipython-input-105-0457ade3b36e>
Function: proc1 at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def proc1():
2 1 1785 1785.0 3.0 chunker = pd.read_csv('./data/coltest.csv', chunksize=100000)
3
4 1 2 2.0 0.0 li = []
5 2 49155 24577.5 81.4 for df in chunker:
6 1 1932 1932.0 3.2 df.rename(columns={'data': 'value1', 'data2': 'value2'}, inplace=True)
7 1 4303 4303.0 7.1 li.append(df.groupby('key')['value1'].sum())
8
9 1 2723 2723.0 4.5 g = pd.concat(li, axis=1)
10 1 501 501.0 0.8 return g.sum(axis=1)
Bis ich line_profiler
ausführte, war es wie" Ich frage mich, ob das Laden in File Split langsam ist ". Es ist langsam, aber es gibt andere Teile, die viel Zeit in Anspruch nehmen.
a. Der Teil von "df.rename ..." nimmt ungefähr die Hälfte des Aggregationsprozesses von "groupby" in% Zeit (Prozentsatz des Ganzen) in Anspruch.
--Das Umbenennen einer Spalte darf nicht innerhalb der Schleife erfolgen. ..
b. Wenn Sie die Spalte "value2" nicht verwenden, sollten Sie sie auch nicht mit der Option "usercols" von "read_csv" lesen.
Ich dachte, es würde länger dauern, als ich erwartet hatte, um umzubenennen.
Ich denke, der line_profiler
, der eine solche Entdeckung gemacht hat, ist sehr gut.
Als nächstes möchte ich ein Arbeitsmemo über die Parallelverarbeitung von Ipython schreiben.
Recommended Posts