2016-03-16 8 views
6

Ho un grande insieme di dati panda, e ad un certo punto ho bisogno di usare la seguente funzionecome velocizzare una funzione di panda molto lenta?

def proc_trader(data): 
    data['_seq'] = np.nan 
    # make every ending of a roundtrip with its index 
    data.ix[data.cumq == 0,'tag'] = np.arange(1, (data.cumq == 0).sum() + 1) 
    # backfill the roundtrip index until previous roundtrip; 
    # then fill the rest with 0s (roundtrip incomplete for most recent trades) 
    data['_seq'] =data['tag'].fillna(method = 'bfill').fillna(0) 
    return data['_seq'] 
    # btw, why on earth this function returns a dataframe instead of the series `data['_seq']`?? 

e io uso applico

reshaped['_spell']=reshaped.groupby(['trader','stock'])[['cumq']].apply(proc_trader) 

Ovviamente, non posso condividere i dati qui, ma faccio vedi un collo di bottiglia nel mio codice? Potrebbe essere la cosa arange? Ci sono molte combinazioni name-productid nei dati.

Minimal Esempio di lavoro:

import pandas as pd 
import numpy as np 

reshaped= pd.DataFrame({'trader' : ['a','a','a','a','a','a','a'],'stock' : ['a','a','a','a','a','a','b'], 'day' :[0,1,2,4,5,10,1],'delta':[10,-10,15,-10,-5,5,0] ,'out': [1,1,2,2,2,0,1]}) 


reshaped.sort_values(by=['trader', 'stock','day'], inplace=True) 
reshaped['cumq']=reshaped.groupby(['trader', 'stock']).delta.transform('cumsum') 
reshaped['_spell']=reshaped.groupby(['trader','stock'])[['cumq']].apply(proc_trader).reset_index()['_seq'] 
+1

avete provato line-profiling del codice? – EnricoGiampieri

+0

Non ho idea di come farlo, –

+1

c'è una libreria per questo, e funziona meravigliosamente, dai un'occhiata! Darei un'occhiata, ma probabilmente dipende dai dati. https://github.com/rkern/line_profiler – EnricoGiampieri

risposta

0

Niente di veramente fantasioso qui, solo ottimizzato in un paio di posti. Non c'è davvero bisogno di inserire una funzione, quindi non l'ho fatto. Su questo piccolo campione di dati, è circa il doppio della velocità dell'originale.

reshaped.sort_values(by=['trader', 'stock','day'], inplace=True) 
reshaped['cumq']=reshaped.groupby(['trader', 'stock']).delta.cumsum() 
reshaped.loc[ reshaped.cumq == 0, '_spell' ] = 1 
reshaped['_spell'] = reshaped.groupby(['trader','stock'])['_spell'].cumsum() 
reshaped['_spell'] = reshaped.groupby(['trader','stock'])['_spell'].bfill().fillna(0) 

Risultato:

day delta out stock trader cumq _spell 
0 0  10 1  a  a 10  1.0 
1 1 -10 1  a  a  0  1.0 
2 2  15 2  a  a 15  2.0 
3 4 -10 2  a  a  5  2.0 
4 5  -5 2  a  a  0  2.0 
5 10  5 0  a  a  5  0.0 
6 1  0 1  b  a  0  1.0