Получение стандартного отклонения на определенное количество дат - PullRequest
0 голосов
/ 26 ноября 2018

В этом кадре данных ...

import pandas as pd
import numpy as np
import datetime

tf = 365
dt = datetime.datetime.now()-datetime.timedelta(days=365)

df = pd.DataFrame({
        'Cat': np.repeat(['a', 'b', 'c'], tf),
        'Date': np.tile(pd.date_range(dt, periods=tf), 3),
        'Val': np.random.rand(3*tf)
})

Как я могу получить словарь стандартного отклонения каждого значения 'Cat' для определенного количества дней - по сравнению с последним днем ​​для большого набора данных?

Этот код дает стандартное отклонение для 10 дней ...

{s: np.std(df[(df.Cat == s) & 
          (df.Date > today-datetime.timedelta(days=10))].Val) 
for s in df.Cat.unique()}

... выглядит неуклюже.

Есть ли лучший способ?

1 Ответ

0 голосов
/ 26 ноября 2018

Сначала отфильтруйте по boolean indexing, а затем агрегируйте std, но, поскольку для значения по умолчанию ddof=1 необходимо установить значение 0:

d1 = df[(df.Date>dt-datetime.timedelta(days=10))].groupby('Cat')['Val'].std(ddof=0).to_dict()
print (d1)
{'a': 0.28435695432581953, 'b': 0.2908486860242955, 'c': 0.2995981283031974}

Другим решением является использование пользовательской функции:

f = lambda x: np.std(x.loc[(x.Date > dt-datetime.timedelta(days=10)), 'Val'])
d2 = df.groupby('Cat').apply(f).to_dict()

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

d1 = {'b': 0.2908486860242955, 'c': 0.2995981283031974}

d2 = {'a': nan, 'b': 0.2908486860242955, 'c': 0.2995981283031974}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...