it-swarm.com.de

pd.rolling_mean veraltet - Alternativen für Narrays

Es sieht so aus, als würde pd.rolling_mean für ndarrays veraltet,

 pd.rolling_mean(x, window=2, center=False)

FutureWarning: pd.rolling_mean ist für ndarrays veraltet und wird in einer zukünftigen Version entfernt

dies scheint jedoch der schnellste Weg zu sein, laut dieser SO Antwort .

Gibt es jetzt neue Möglichkeiten, dies direkt mit SciPy oder NumPy zu tun, die so schnell wie pd.rolling_mean sind?

14
saladi

BEARBEITEN - Leider sieht es so aus, als sei der neue Weg bei weitem nicht so schnell:

Neue Version von Pandas:

In [1]: x = np.random.uniform(size=100)

In [2]: %timeit pd.rolling_mean(x, window=2)
1000 loops, best of 3: 240 µs per loop

In [3]: %timeit pd.Series(x).rolling(window=2).mean()
1000 loops, best of 3: 226 µs per loop

In [4]: pd.__version__
Out[4]: '0.18.0'

Alte Version:

In [1]: x = np.random.uniform(size=100)

In [2]: %timeit pd.rolling_mean(x,window=2)
100000 loops, best of 3: 12.4 µs per loop

In [3]: pd.__version__
Out[3]: u'0.17.1'
9
saladi

Sieht so aus, als ob der neue Weg über Methoden in der DataFrame.rolling-Klasse besteht (ich denke, Sie sollten sich so etwas wie eine groupby vorstellen): http://pandas.pydata.org/pandas-docs/version /0.18.0/whatsnew.html

z.B.

x.rolling(window=2).mean()
4
maxymoo

versuche dies 

x.rolling(window=2, center=False).mean()
1
Pruce Uchiha

Ich schlage scipy.ndimage.filters.uniform_filter1d wie in meiner Antwort zu der verlinkten Frage vor. Es ist auch für große Arrays viel schneller:

import numpy as np
from scipy.ndimage.filters import uniform_filter1d
N = 1000
x = np.random.random(100000)

%timeit pd.rolling_mean(x, window=N)
__main__:257: FutureWarning: pd.rolling_mean is deprecated for ndarrays and will be removed in a future version
The slowest run took 84.55 times longer than the fastest. This could mean that an intermediate result is being cached.
1 loop, best of 3: 7.37 ms per loop

%timeit uniform_filter1d(x, size=N)
10000 loops, best of 3: 190 µs per loop
0
moi