J'ai 2 dataframes dans python que je voudrais interroger pour des données.
DF1: 4 millions d'enregistrements x 3 colonnes. La fonction de requête semble plus efficace que la fonction loc.
DF2: 2K enregistrements x 6 colonnes. La fonction loc semble beaucoup plus efficace que la fonction de requête.
Les deux requêtes renvoient un seul enregistrement. La simulation a été effectuée en exécutant la même opération dans une boucle 10K fois.
En cours d'exécution python 2.7 et pandas 0.16.0
Des recommandations pour améliorer la vitesse de requête?
Pour améliorer les performances, il est possible d'utiliser numexpr
:
import numexpr
np.random.seed(125)
N = 40000000
df = pd.DataFrame({'A':np.random.randint(10, size=N)})
def ne(df):
x = df.A.values
return df[numexpr.evaluate('(x > 5)')]
print (ne(df))
In [138]: %timeit (ne(df))
1 loop, best of 3: 494 ms per loop
In [139]: %timeit df[df.A > 5]
1 loop, best of 3: 536 ms per loop
In [140]: %timeit df.query('A > 5')
1 loop, best of 3: 781 ms per loop
In [141]: %timeit df[df.eval('A > 5')]
1 loop, best of 3: 770 ms per loop
import numexpr
np.random.seed(125)
def ne(x):
x = x.A.values
return x[numexpr.evaluate('(x > 5)')]
def be(x):
return x[x.A > 5]
def q(x):
return x.query('A > 5')
def ev(x):
return x[x.eval('A > 5')]
def make_df(n):
df = pd.DataFrame(np.random.randint(10, size=n), columns=['A'])
return df
perfplot.show(
setup=make_df,
kernels=[ne, be, q, ev],
n_range=[2**k for k in range(2, 25)],
logx=True,
logy=True,
equality_check=False,
xlabel='len(df)')