Conociendo Dask

Introduccion a una de las herramientas mas potentes de Python para realizar procesos con gran volumen de datos. La libreria Dask, ademas de utilizar los lazy dataframes para ahorrar tiempo, nos permite paralelizar procesos en clusters de una forma sencilla

En este nuevo lab, vamos hacer una introduccion a la libreria de Dask. Dask es una liberia de codigo abierto y desarollada en cordinacion con Numpy Pandas y Scikit-Learn. Basicamente nos permite paralelizar procesos de python, y incluso hacer clusters de maquinas para nuestros procesos. Las posibilidades son ilimitadas, pero en este caso nos centraremos en la carga de grande dataframes, y como tratarlos posteriormente en pandas
La gracia de utilizar dask, es el utilizar los lazy dataframes, que es como una forma de trabajar con los datos "por encima" , y hasta que realmente no los necesitamos, no los procesamos.

Una vez explicado esto, empezamos!

In [ ]:
# %load_ext autotime ## Utilizamos este complemento para poder monitorizar los tiempos que tarda en realizar cada accion
import dask.dataframe as dd # importamos de dask el dataframe
from dask.diagnostics import ProgressBar # y la barra de progreso, para saber "donde estamos"

Ahora vamos a cargar todos los archivos de una carpeta, dentro de nuestra variable df, lo creara en un lazy dataframe, por eso todo funciona de forma tan rapida.

In [2]:
df = dd.read_csv('/home/py/lab1/lab1/datasets/optionstats/*.csv',parse_dates=True) #insertar la ruta de su carpeta con los CSV
time: 5.32 s

Ahora, vamos a asignar un indice al dataframe, en este caso queremos que sea la columna de la fecha, en este proceso, ya no puedo realziarlo de forma "lazy" asi que, le toca computar.

In [3]:
with ProgressBar(): # Para que nos muestre una barra de progreso.
    df = df.set_index('quotedate')
[########################################] | 100% Completed |  6min  8.0s
time: 6min 13s

El tiempo de carga, no es demasiado excedido, puedo aseguraros, que con pandas, el proceso tarda como unas 4 veces mas aproximadamente.

Ahora vamos a volver a utilizar el formato lazy del dataframe, asignamos las columnas que queremos tener en nuestro dataframe, y como vemos, es un proceso casi instantaneo.

Vamos a ver que columnas, tienen los archivos csv, y cuales vamos a seleccionar

In [24]:
df.columns
Out[24]:
Index(['symbol', 'iv30call', 'iv30put', 'iv30mean', 'callvol', 'putvol',
       'totalvol', 'calloi', 'putoi'],
      dtype='object')
time: 5.65 ms
In [4]:
cols = ['symbol','iv30call','iv30put','iv30mean','callvol','putvol','totalvol','calloi', 'putoi']
df = df[cols]
time: 5.17 ms

Vale, que bonito todo, pero a mi me gusta pandas, y veo que estamos trabajando con un dask.dataframe, no con un pandas datraframe, Esto tiene solucion?

In [10]:
type(df)
Out[10]:
dask.dataframe.core.DataFrame
time: 6.6 ms

Es muy simple, aqui es donde realmente se realiza todo el proceso, simplemente tenemos que pasar nuestro lazy dataframe a pandas mediante compute().

In [5]:
with ProgressBar():
    dfcomp = df.compute()
[########################################] | 100% Completed | 11min 27.4s
time: 11min 35s
In [9]:
type(dfcomp)
Out[9]:
pandas.core.frame.DataFrame
time: 6.94 ms
In [11]:
dfcomp.head()
Out[11]:
symboliv30calliv30putiv30meancallvolputvoltotalvolcalloiputoi
quotedate
1/10/2003A0.73040.94720.83881020598570055587752091
1/10/2003AA0.50490.44410.474576775015175428644490
1/10/2003AAI0.77670.76800.7724010010035629546
1/10/2003AAP0.43730.44690.442140509072363035
1/10/2003AAPL0.90990.77510.842540997994898159958120683
time: 29.8 ms

Y para finalizar este lab vamos a comprobar el ratio de perdida de nuestro dataframe, deberia ser 0, si algun valor no es igual a 0, deberiamos revisar nuestros datos y entender por donde se escapan los datos.

In [21]:
valores_null = df.isnull().sum() #sumamos los valores null
ratio_perdida = ((valores_null/df.index.size)*100) # sacamos el ratio entre valores null entre la longitud del dataframe
time: 1.05 s

Y como paso final, realizamos el .compute() para obtener nuestra serie de pandas.

In [19]:
with ProgressBar():
    ratio_perdida = ratio_perdida.compute()
[########################################] | 100% Completed | 11min 51.5s
time: 11min 58s
In [20]:
ratio_perdida
Out[20]:
symbol      0.0
iv30call    0.0
iv30put     0.0
iv30mean    0.0
callvol     0.0
putvol      0.0
totalvol    0.0
calloi      0.0
putoi       0.0
dtype: float64
time: 6.96 ms
In [ ]:
 

Recuerda pasarte por nuestro canal de Telegram de Python Para Trading

Python Para Trading en Telgram!