Python dataframe оконные функции

Windowing operations

pandas содержит компактный набор API-интерфейсов для выполнения оконных операций — операции, которая выполняет агрегирование по скользящему разделу значений. API-интерфейс функционирует аналогично API-интерфейсу groupby в этой Series и DataFrame ,вызывая оконный метод с необходимыми параметрами, а затем впоследствии вызывает функцию агрегирования.

In [1]: s = pd.Series(range(5)) In [2]: s.rolling(window=2).sum() Out[2]: 0 NaN 1 1.0 2 3.0 3 5.0 4 7.0 dtype: float64

Окна составляются,оглядываясь назад на длину окна от текущего наблюдения.Приведенный выше результат можно получить,взяв сумму следующих оконных разделов данных:

In [3]: for window in s.rolling(window=2): . print(window) . 0 0 dtype: int64 0 0 1 1 dtype: int64 1 1 2 2 dtype: int64 2 2 3 3 dtype: int64 3 3 4 4 dtype: int64 

Overview

pandas поддерживает 4 типа оконных операций:

  1. Скользящее окно:Общее фиксированное или переменное скользящее окно над значениями.
  2. Взвешенное окно: взвешенное непрямоугольное окно, предоставляемое библиотекой scipy.signal .
  3. Расширяющееся окно:Накапливающееся окно над значениями.
  4. Экспоненциально взвешенное окно:Накопление и экспоненциально взвешенное окно над значениями.

Поддержка окон,основанных на времени

Поддерживает цепную группировку

Поддерживает табличный метод

Поддерживает работу в режиме онлайн

Экспоненциально взвешенное окно

Как отмечалось выше,некоторые операции поддерживают указание окна на основе временного смещения:

In [4]: s = pd.Series(range(5), index=pd.date_range('2020-01-01', periods=5, freq='1D')) In [5]: s.rolling(window='2D').sum() Out[5]: 2020-01-01 0.0 2020-01-02 1.0 2020-01-03 3.0 2020-01-04 5.0 2020-01-05 7.0 Freq: D, dtype: float64

Кроме того, некоторые методы поддерживают groupby операции groupby с операцией управления окнами, которая сначала группирует данные по указанным ключам, а затем выполняет операцию управления окнами для каждой группы.

In [6]: df = pd.DataFrame('A': ['a', 'b', 'a', 'b', 'a'], 'B': range(5)>) In [7]: df.groupby('A').expanding().sum() Out[7]: B A a 0 0.0 2 2.0 4 6.0 b 1 1.0 3 4.0

В настоящее время оконные операции поддерживают только числовые данные (целые числа и числа с плавающей запятой) и всегда будут возвращать значения float64 .

Некоторые методы оконной агрегации, mean , sum , var и std могут страдать от числовой неточности из-за того, что лежащие в основе алгоритмы работы с окнами накапливают суммы. Когда значения отличаются на величину \ (1 / np.finfo (np.double) .eps \), это приводит к усечению. Следует отметить, что большие значения могут повлиять на окна, которые не включают эти значения. Суммирование Кахана используется для вычисления скользящих сумм, чтобы максимально сохранить точность.

Некоторые оконные операции также поддерживают параметр method=’table’ в конструкторе, который выполняет оконную операцию для всего DataFrame , а не для одного столбца или строки за раз. Это может обеспечить полезный выигрыш в производительности для DataFrame со многими столбцами или строками (с соответствующим аргументом axis ) или возможностью использовать другие столбцы во время операции управления окнами. Опция method=’table’ может использоваться только в том случае, если engine=’numba’ указан в соответствующем вызове метода.

Например, расчет взвешенного среднего может быть рассчитан с помощью apply() , указав отдельный столбец весов.

In [8]: def weighted_mean(x): . arr = np.ones((1, x.shape[1])) . arr[:, :2] = (x[:, :2] * x[:, 2]).sum(axis=0) / x[:, 2].sum() . return arr . In [9]: df = pd.DataFrame([[1, 2, 0.6], [2, 3, 0.4], [3, 4, 0.2], [4, 5, 0.7]]) In [10]: df.rolling(2, method="table", min_periods=0).apply(weighted_mean, raw=True, engine="numba") # noqa:E501 Out[10]: 0 1 2 0 1.000000 2.000000 1.0 1 1.800000 2.000000 1.0 2 3.333333 2.333333 1.0 3 1.555556 7.000000 1.0 

Некоторые оконные операции также поддерживают online метод после создания оконного объекта, который возвращает новый объект, который поддерживает передачу новых DataFrame или Series , чтобы продолжить вычисление окон с новыми значениями (т. Е. Онлайн-вычисления).

Методы этих новых оконных объектов должны сначала вызвать метод агрегации, чтобы «подготовить» начальное состояние онлайн-вычисления. Затем в аргументе update можно передать новые DataFrame или Series , чтобы продолжить вычисление окна. update

In [11]: df = pd.DataFrame([[1, 2, 0.6], [2, 3, 0.4], [3, 4, 0.2], [4, 5, 0.7]]) In [12]: df.ewm(0.5).mean() Out[12]: 0 1 2 0 1.000000 2.000000 0.600000 1 1.750000 2.750000 0.450000 2 2.615385 3.615385 0.276923 3 3.550000 4.550000 0.562500 
In [13]: online_ewm = df.head(2).ewm(0.5).online() In [14]: online_ewm.mean() Out[14]: 0 1 2 0 1.00 2.00 0.60 1 1.75 2.75 0.45 In [15]: online_ewm.mean(update=df.tail(1)) Out[15]: 0 1 2 3 3.307692 4.307692 0.623077 

Все оконные операции поддерживают аргумент min_periods , который определяет минимальное количество значений, np.nan от np.nan, которое должно иметь окно; в противном случае результирующее значение будет np.nan . min_periods по умолчанию равен 1 для временных окон и window для фиксированных окон.

In [16]: s = pd.Series([np.nan, 1, 2, np.nan, np.nan, 3]) In [17]: s.rolling(window=3, min_periods=1).sum() Out[17]: 0 NaN 1 1.0 2 3.0 3 3.0 4 2.0 5 3.0 dtype: float64 In [18]: s.rolling(window=3, min_periods=2).sum() Out[18]: 0 NaN 1 NaN 2 3.0 3 3.0 4 NaN 5 NaN dtype: float64 # Equivalent to min_periods=3 In [19]: s.rolling(window=3, min_periods=None).sum() Out[19]: 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN 5 NaN dtype: float64

Кроме того, все оконные операции поддерживают метод aggregate для возврата результата множественных агрегатов, примененных к окну.

In [20]: df = pd.DataFrame(A": range(5), "B": range(10, 15)>) In [21]: df.expanding().agg([np.sum, np.mean, np.std]) Out[21]: A B sum mean std sum mean std 0 0.0 0.0 NaN 10.0 10.0 NaN 1 1.0 0.5 0.707107 21.0 10.5 0.707107 2 3.0 1.0 1.000000 33.0 11.0 1.000000 3 6.0 1.5 1.290994 46.0 11.5 1.290994 4 10.0 2.0 1.581139 60.0 12.0 1.581139 

Rolling window

Общие скользящие окна поддерживают задание окон в виде фиксированного числа наблюдений или переменного числа наблюдений на основе смещения.Если задано смещение по времени,соответствующий индекс по времени должен быть монотонным.

In [22]: times = ['2020-01-01', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-29'] In [23]: s = pd.Series(range(5), index=pd.DatetimeIndex(times)) In [24]: s Out[24]: 2020-01-01 0 2020-01-03 1 2020-01-04 2 2020-01-05 3 2020-01-29 4 dtype: int64 # Окно с 2 наблюдениями In [25]: s.rolling(window=2).sum() Out[25]: 2020-01-01 NaN 2020-01-03 1.0 2020-01-04 3.0 2020-01-05 5.0 2020-01-29 7.0 dtype: float64 # Окно с наблюдениями за 2 дня In [26]: s.rolling(window='2D').sum() Out[26]: 2020-01-01 0.0 2020-01-03 1.0 2020-01-04 3.0 2020-01-05 5.0 2020-01-29 4.0 dtype: float64 

Для всех поддерживаемых функций агрегирования см. Функции скользящего окна .

Centering windows

По умолчанию метки устанавливаются у правого края окна, но доступно ключевое слово center , поэтому метки могут быть установлены в центре.

In [27]: s = pd.Series(range(10)) In [28]: s.rolling(window=5).mean() Out[28]: 0 NaN 1 NaN 2 NaN 3 NaN 4 2.0 5 3.0 6 4.0 7 5.0 8 6.0 9 7.0 dtype: float64 In [29]: s.rolling(window=5, center=True).mean() Out[29]: 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 5 5.0 6 6.0 7 7.0 8 NaN 9 NaN dtype: float64

Это также можно применить к индексам,подобным времени суток.

In [30]: df = pd.DataFrame( . "A": [0, 1, 2, 3, 4]>, index=pd.date_range("2020", periods=5, freq="1D") . ) . In [31]: df Out[31]: A 2020-01-01 0 2020-01-02 1 2020-01-03 2 2020-01-04 3 2020-01-05 4 In [32]: df.rolling("2D", center=False).mean() Out[32]: A 2020-01-01 0.0 2020-01-02 0.5 2020-01-03 1.5 2020-01-04 2.5 2020-01-05 3.5 In [33]: df.rolling("2D", center=True).mean() Out[33]: A 2020-01-01 0.5 2020-01-02 1.5 2020-01-03 2.5 2020-01-04 3.5 2020-01-05 4.0 

Конечные точки скользящего окна

Включение конечных точек интервала в вычисления скользящего окна можно указать с помощью параметра closed :

закрыть правую конечную точку

закрыть левую конечную точку

закрыть обе конечные точки

Например,наличие открытой правой конечной точки полезно во многих проблемах,требующих,чтобы не было контаминации от настоящей информации обратно к прошлой.Это позволяет скользящему окну вычислять статистику «до этого момента времени»,но не включая этот момент времени.

In [34]: df = pd.DataFrame( . 1>, . index=[ . pd.Timestamp("20130101 09:00:01"), . pd.Timestamp("20130101 09:00:02"), . pd.Timestamp("20130101 09:00:03"), . pd.Timestamp("20130101 09:00:04"), . pd.Timestamp("20130101 09:00:06"), . ], . ) . In [35]: df["right"] = df.rolling("2s", closed="right").x.sum() # default In [36]: df["both"] = df.rolling("2s", closed="both").x.sum() In [37]: df["left"] = df.rolling("2s", closed="left").x.sum() In [38]: df["neither"] = df.rolling("2s", closed="neither").x.sum() In [39]: df Out[39]: x right both left neither 2013-01-01 09:00:01 1 1.0 1.0 NaN NaN 2013-01-01 09:00:02 1 2.0 2.0 1.0 1.0 2013-01-01 09:00:03 1 2.0 3.0 2.0 1.0 2013-01-01 09:00:04 1 2.0 3.0 2.0 1.0 2013-01-01 09:00:06 1 1.0 2.0 1.0 NaN

© 2008–2022, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/1.5.0/user_guide/window.html

pandas 1.5

В некоторых ситуациях все еще может быть предпочтительнее или необходимо подготовить графики непосредственно с помощью matplotlib, например, когда определенный тип настройки не

Расширяющееся окно дает значение агрегированной статистики со всеми данными, доступными к этому моменту времени.

Источник

Window#

Rolling objects are returned by .rolling calls: pandas.DataFrame.rolling() and pandas.Series.rolling() . Expanding objects are returned by .expanding calls: pandas.DataFrame.expanding() and pandas.Series.expanding() . ExponentialMovingWindow objects are returned by .ewm calls: pandas.DataFrame.ewm() and pandas.Series.ewm() .

Rolling window functions#

Calculate the rolling count of non NaN observations.

Calculate the rolling sum.

Calculate the rolling mean.

Calculate the rolling median.

Calculate the rolling variance.

Calculate the rolling standard deviation.

Calculate the rolling minimum.

Calculate the rolling maximum.

Calculate the rolling correlation.

Calculate the rolling sample covariance.

Calculate the rolling unbiased skewness.

Calculate the rolling Fisher’s definition of kurtosis without bias.

Calculate the rolling custom aggregation function.

Aggregate using one or more operations over the specified axis.

Calculate the rolling quantile.

Calculate the rolling standard error of mean.

Calculate the rolling rank.

Weighted window functions#

Calculate the rolling weighted window mean.

Calculate the rolling weighted window sum.

Calculate the rolling weighted window variance.

Calculate the rolling weighted window standard deviation.

Expanding window functions#

Calculate the expanding count of non NaN observations.

Calculate the expanding sum.

Calculate the expanding mean.

Calculate the expanding median.

Calculate the expanding variance.

Calculate the expanding standard deviation.

Calculate the expanding minimum.

Calculate the expanding maximum.

Calculate the expanding correlation.

Calculate the expanding sample covariance.

Calculate the expanding unbiased skewness.

Calculate the expanding Fisher’s definition of kurtosis without bias.

Calculate the expanding custom aggregation function.

Aggregate using one or more operations over the specified axis.

Calculate the expanding quantile.

Calculate the expanding standard error of mean.

Calculate the expanding rank.

Exponentially-weighted window functions#

Calculate the ewm (exponential weighted moment) mean.

Calculate the ewm (exponential weighted moment) sum.

Calculate the ewm (exponential weighted moment) standard deviation.

Calculate the ewm (exponential weighted moment) variance.

Calculate the ewm (exponential weighted moment) sample correlation.

Calculate the ewm (exponential weighted moment) sample covariance.

Window indexer#

Base class for defining custom window boundaries.

Base class for window bounds calculations.

Creates window boundaries for fixed-length windows that include the current row.

Calculate window boundaries based on a non-fixed offset such as a BusinessDay.

Источник

Читайте также:  Запуск php скриптов через ssh
Оцените статью