2017-05-03 2 views
1

Ich arbeite mit einem Code in Pandas, die das Lesen einer Vielzahl von Dateien und dann Ausführen verschiedener Operationen für jede Datei innerhalb einer Schleife (die über eine Dateiliste iteriert).Konvertieren Python Dask-Serie zu Liste oder Dask DataFrame innerhalb für Schleife

Ich versuche, dies zu einem Dask-basierten Ansatz anstelle eines Pandas-basierten Ansatz zu konvertieren und habe bisher den folgenden Versuch - ich bin neu zu Dask und muss fragen, ob dies ein vernünftiger Ansatz ist.

Hier ist, was die Eingabedaten wie folgt aussieht:

 A  X1  X2  X3 A_d S_d 
0 1.0 0.475220 0.839753 0.872468 1 1 
1 2.0 0.318410 0.940817 0.526758 2 2 
2 3.0 0.053959 0.056407 0.169253 3 3 
3 4.0 0.900777 0.307995 0.689259 4 4 
4 5.0 0.670465 0.939116 0.037865 5 5 

Hier ist der Code:

import dask.dataframe as dd 
import numpy as np; import pandas as pd 

def my_func(df,r): # perform representative calculations 
    q = df.columns.tolist() 

    df2 = df.loc[:,q[1:]]/df.loc[:,q()[1:]].sum() 
    df2['A'] = df['A'] 

    df2 = df2[ (df2['A'] >= r[0]) & (df2['A'] <= r[1]) ] 

    c = q[1:-2] 
    A = df2.loc[:,c].sum() 

    tx = df2.loc[:,c].min() * df2.loc[:,c].max() 

    return A - tx 

list_1 = [] 
for j in range(1,13): 
    df = dd.read_csv('Test_file.csv') 
    N = my_func(df,[751.7,790.4]) # perform calculations 
    out = ['X'+str(j)+'_2', df['A'].min()] + N.compute().tolist() 
    list_1.append(out) 
df_f = pd.DataFrame(list_1) 

my_func gibt eine Dask Serie N. Momentan muss ich die Diesk-Serie .compute() vor mir in eine Liste umwandeln. Ich habe Schwierigkeiten, das zu überwinden.

  1. Ist es möglich, N (was ist eine Dask-Serie) als Zeile zu einem leeren Dask DF vertikal anhängen? z.B. in Pandas tendiere ich dazu, dies zu tun: df_N = pd.DataFrame() würde außerhalb der for Schleife gehen und dann so etwas wie df_N = pd.concat([df_N,N],axis=0). Dies würde ermöglichen, dass ein DASK DF in der for Schleife aufgebaut wird. Danach (außerhalb der Schleife), konnte ich einfach einfach die gebaute Dask DF zu pd.DataFrame(list_1) horizontal verketten.
  2. Ein anderer Ansatz besteht darin, eine einzelne Reihe Dask DF aus der Dask Serie N zu erstellen. Dann verketten Sie diesen einreihigen DF vertikal mit einem leeren Dask-DF (der außerhalb der Schleife erstellt wurde). Ist es in Dask möglich, einzeiligen Dask DataFrame aus einer Serie zu erstellen?

Weitere Informationen (falls erforderlich):

  • In meinem realen Code, ich lese aus einer *.csv Datei in einer Schleife. Aus diesem Grund habe ich, als ich ein Beispiel-Dastaset generierte, es in eine *.csv-Datei geschrieben, um dd.read_csv() innerhalb der Schleife zu verwenden.
  • df2s['A'] = df['A'] - Diese Zeile wird benötigt, da die Zeile darüber die Spalte A auslässt (während einer Normalisierung jeder Spalte auf ihre Summe) und einen neuen DataFrame erzeugt. df2s['A'] = df['A'] fügt Spalte A zurück zum neuen DataFrame hinzu.
+0

Ich vermute, dass Sie schneller eine bessere Antwort erhalten, wenn Sie Ihr Problem auf kleinere Beispiele reduzieren können. Vielleicht möchten Sie https://stackoverflow.com/help/mcve lesen – MRocklin

+0

Okay, wie geht das? Ich habe mit Pandas zusammenhängendes Material entfernt und den restlichen auf Dask basierenden Code gekürzt, um es auf ein Minimum zu beschränken. –

+0

Und irgendwelche Gedanken darüber, wie man mit der Serie 'N' umgeht? –

Antwort

1

Ist es möglich, vertikal append N als eine Reihe zu einem leeren Dask DF (die eine Dask Serie ist)? z.B. in Pandas tendiere ich dazu: df_N = pd.DataFrame() würde außerhalb der for-Schleife gehen und dann etwas wie df_N = pd.concat ([df_N, N], axis = 0). Dadurch könnte ein DASK-DF in der for-Schleife aufgebaut werden. Danach (außerhalb der Schleife) konnte ich einfach den zusammengesetzten DASK DF mit pd.DataFrame (list_1) horizontal verketten.

Sie sollten Zeilen niemals an einen Pandas-Datenrahmen oder einen Dask-Datenrahmen anhängen. Dies ist sehr ineffizient. Stattdessen ist es besser, viele pandas/dask Datenrahmen zusammen zu sammeln und dann die pd.concat oder dd.concat Funktion aufzurufen.

Auch ich beachte, dass Sie compute innerhalb Ihrer for-Schleife aufrufen. Es wird empfohlen, compute erst dann aufzurufen, wenn Sie Ihre gesamte Berechnung nach Möglichkeit eingerichtet haben. Sonst wirst du wahrscheinlich nicht viel Parallelität bekommen.

Hinweis: Ich habe nicht wirklich die Mühe gemacht, Ihren Code zu verstehen. Ich beantworte nur die Fragen am Ende. Hoffentlich kommt jemand anderer mit einer umfassenderen Antwort.

Verwandte Themen