Скользящая статистика pandas на основе фиксированного периода или доступных данных - PullRequest
1 голос
/ 06 января 2020

Я хотел бы взять скользящую статистику за фиксированный период, скажем, за 5 дней, например,

                 DATE       Price
ID          
AAPL US Equity  2015-01-02  109.33
AAPL US Equity  2015-01-05  106.25
AAPL US Equity  2015-01-06  106.26
AAPL US Equity  2015-01-07  107.75
AAPL US Equity  2015-01-08  111.89
AAPL US Equity  2015-01-09  112.01
AAPL US Equity  2015-01-12  109.25
AAPL US Equity  2015-01-13  110.22
AAPL US Equity  2015-01-14  109.80
AAPL US Equity  2015-01-15  106.82

при


df['Average']=df['Price'].rolling(5).mean()

, чтобы дать

                DATE        Price   Average
ID                  
AAPL US Equity  2015-01-02  109.33  NaN
AAPL US Equity  2015-01-05  106.25  NaN
AAPL US Equity  2015-01-06  106.26  NaN
AAPL US Equity  2015-01-07  107.75  NaN
AAPL US Equity  2015-01-08  111.89  108.296
AAPL US Equity  2015-01-09  112.01  108.832
AAPL US Equity  2015-01-12  109.25  109.432
AAPL US Equity  2015-01-13  110.22  110.224
AAPL US Equity  2015-01-14  109.80  110.634
AAPL US Equity  2015-01-15  106.82  109.620

как Могу ли я изменить, чтобы применить любую функцию, чтобы получить любую скользящую статистику за фиксированный период, но для первых нескольких строк по доступным данным ie для первого ряда будет средняя цена за первый день, для первых двух строк среднее будет за первые два дня et c

Я знаю, что могу использовать iterrows для достижения этой цели в этом случае со «средним» значением, но в идеале я хотел бы использовать его для любого показателя, например, quantile, std et c

Что-то вроде

df['Average']=my_rolling_stat(df['Price'],period=5,function='mean')
df['Stdev']=my_rolling_stat(df['Price'],period=10,function='std')
df['95_Perc']=my_rolling_stat(df['Price'],period=10,function='quantile',quantile_value=0.95)

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 07 января 2020

IIU C, используйте параметр min_periods в rolling:

df['Average']=df['Price'].rolling(5, min_periods=1).mean()

Выход:

0    109.3300
1    107.7900
2    107.2800
3    107.3975
4    108.2960
5    108.8320
6    109.4320
7    110.2240
8    110.6340
9    109.6200
Name: PRICE, dtype: float64
2 голосов
/ 07 января 2020

Чтобы добавить к ответу Скотта Бостона, вы можете определить функцию скользящей статистики как:

def my_rolling_stat(series, period, function, **kwargs):
    window = series.rolling(period, min_periods=1)
    func = getattr(window, function)

    return func(**kwargs)

Использование:

my_rolling_stat(df['Price'], period=5, function='mean')
my_rolling_stat(df['Price'], period=10, function='std')
my_rolling_stat(df['Price'], period=10, function='quantile', quantile=0.95)

Список функций и их аргументы можно найти в список Вычислительная / Описательная статистика .

...