2013-03-13 15 views
7

Ho lunghi calcoli che ripeto molte volte. Pertanto, vorrei utilizzare la memoizzazione (pacchetti come jug e joblib), in concerto con Pandas. Il problema è se il pacchetto memoize bene Pandas DataFrames come argomenti del metodo.Memoizzazione panda

Qualcuno l'ha provato? C'è qualche altro pacchetto/modo consigliato per farlo?

risposta

6

Autore della brocca qui: la brocca funziona bene. Ho provato quanto segue e funziona:

from jug import TaskGenerator 
import pandas as pd 
import numpy as np 


@TaskGenerator 
def gendata(): 
    return pd.DataFrame(np.arange(343440).reshape((10,-1))) 

@TaskGenerator 
def compute(x): 
    return x.mean() 

y = compute(gendata()) 

Non è così efficiente come potrebbe essere il solo utilizza pickle internamente per l'DataFrame (anche se comprime al volo, quindi non è orribile in termini di uso della memoria, solo più lento di quanto potrebbe essere).

sarei aperto a un cambiamento che li memorizza come un caso speciale come brocca attualmente fa per gli array NumPy: https://github.com/luispedro/jug/blob/master/jug/backends/file_store.py#L102

+0

E cosa succede quando chiami' compute (gendata()) '? Carica effettivamente DataFrame dalla cache? – Yariv

+0

Se' ' gendata() '' è stato calcolato in un processo diverso, quindi sì. – luispedro

+0

Esiste un modo per eseguire jug con il comando 'python' invece di' jug'? – Light

4

Uso questo decoratore di memoizzazione di base, memoized. http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

DataFrames sono lavabili, quindi dovrebbe funzionare correttamente. Ecco un esempio.

In [2]: func = lambda df: df.apply(np.fft.fft) 

In [3]: memoized_func = memoized(func) 

In [4]: df = DataFrame(np.random.randn(1000, 1000)) 

In [5]: %timeit func(df) 
10 loops, best of 3: 124 ms per loop 

In [9]: %timeit memoized_func(df) 
1000000 loops, best of 3: 1.46 us per loop 

Mi sembra buono.

+0

Grazie. Cosa intendi con "DataFrames hashable"? 'hash (pd.DataFrame ([1,2,3]))' restituisce un valore diverso se lo chiami due volte. – Yariv

+0

Il codice per memoized controlla collections.Hashable() prima che tenti di memorizzare nella cache i dati. Ma il tuo commento mi sta facendo riconsiderare se funziona come previsto. –

+0

DataFrame dovrebbe probabilmente aumentare in questo caso, metterò su pr su github –