Mise à jour. Plus autant de latence.
J'ai continué à chercher et j'ai trouvé une solution qui fait que ça va aussi vite, selon le jour..., que pandas.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
import dask.dataframe as dd
import pandas as pd
def fonction_df(game):
try:
df=dd.from_pandas(pd.DataFrame(course,
index=[course['_id']]*len(course['classement'])),
npartitions=4)# Après tatônnement 4 partitions dans ce cas de figure c'est un des facteurs de vitesse. On ne fait donc plus un dataframe pandas ==> df=pd.DataFrame(game, index=[game['_id']]*len(game['rank']))
return df
except:
print('problem with:{}'.format(game['_id']))
dfs=list(map(lambda game:
fonction_df(game),
games)) # list of dictionnaries where each one is a game
df=delayed(pd.concat)(dfs,axis=0)# Ici on utilise pandas.concat et non plus dask.dataframe.concat, ainsi on respecte ce que préconise la doc
df=dd.from_delayed(df)# Au lieu de faire compute() sur l'objet delayed on utilise la méthode from_delayed |
Code:
1 2
| %%time
sys.getsizeof(df.compute(scheduler="single-threaded"))# 652 ms et 2307862bytes |
Code:
1 2
| %%time
sys.getsizeof(pd.concat(dfs))# 477 ms et 2307862bytes /!\ pour se faire, la fonction fonction_df() reprend l'ancienne méthode df=pd.DataFrame(game, index=[game['_id']]*len(game['rank'])), sinon renvoit une erreur. |
Il est aussi lourd que pandas.DataFrame quand on utilise la méthode compute() sur le dataframe de dask,mais en dehors il consomme beaucoup moins de mémoire, aujourd'hui il est un peu plus long pcq hier j'avais réussi à avoir les même temps:
Code:
sys.getsizeof(df)# 56 bytes
J'espère ne pas me tromper, mais avoir 56 bytes pour faire des calculs tel que:
Code:
1 2 3 4 5 6 7 8
| import dask.dataframe as dd
df = dd.read_parquet('...')
data = df[['age', 'income', 'married']]
labels = df['outcome']
from dask_ml.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(data, labels) |
source ici
ça prend toujours moins de place qu'un dataframe pandas qui va peser en permanence 2307862bytes dans la mémoire, et encore que je n'ai pas encore créé de dummy variables, pcq on se contente rarement de données brutes pour se lancer dans des modélisations. Ais-je raison de le penser?