Pd.rolling_mean становится устаревшим - альтернативы для ndarrays
Похоже, что pd.rolling_mean
устаревает для ndarrays
,
pd.rolling_mean(x, window=2, center=False)
FutureWarning: pd.rolling_mean устарел для ndarrays и будет удален в будущей версии
но, по-видимому, это самый быстрый способ сделать это, согласно this SO answer.
Есть ли теперь новые способы сделать это непосредственно с SciPy или NumPy, которые бывают такими же быстрыми, как pd.rolling_mean
?
Ответы
Ответ 1
EDIT - К сожалению, похоже, что новый способ не так быстро:
Новая версия 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'
Старая версия:
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'
Ответ 2
Похоже, новый способ осуществляется с помощью методов класса DataFrame.rolling
(думаю, вы должны думать о нем как о groupby
):
http://pandas.pydata.org/pandas-docs/version/0.18.0/whatsnew.html
например.
x.rolling(window=2).mean()
Ответ 3
Я предлагаю scipy.ndimage.filters.uniform_filter1d, как в ответе , на связанный вопрос, Это также быстрее для больших массивов:
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
Ответ 4
Если ваши измерения однородны, вы можете попытаться реализовать n-мерную форму Таблица суммированных областей, используемую для двумерных изображений:
Таблица суммированных областей - это структура данных и алгоритм для быстрого и эффективного генерирования суммы значений в прямоугольном подмножестве сетки.
Затем в этом порядке вы могли бы:
- Создайте таблицу суммированных областей ( "интеграл" ) вашего массива;
- Итерацию, чтобы получить (довольно дешевую) сумму n-мерного ядра в данной позиции;
- Разделите размер n-мерного тома ядра.
К сожалению, я не могу знать, эффективно ли это или нет, но по данной предпосылке это должно быть.