Средневзвешенная оценка для RollingGroupby - PullRequest
0 голосов
/ 06 июня 2018

Я хочу рассчитать средневзвешенное значение для объекта RollingGroupby.К сожалению, я получил ошибку:

only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Это мой код:

np.random.seed(9999)
df = pd.DataFrame(np.random.random(20).reshape(10, 2), columns = ['val1', 'val2'])
df['id'] = np.repeat([1, 2], 5)
df['wt'] = [1, 2] * 5

def weighted_average(data, value, weight):
    return np.average(data[value], weights = data[weight], axis = 0)

dfwavg = df.groupby('id')[['val1', 'wt']]\
        .rolling(window=2, min_periods=1)\
        .apply(weighted_average, 'wt')

Кто-нибудь знает, в чем проблема?Спасибо.

EDIT

Было бы замечательно, если бы решение использовало существующую структуру (с group.by.rolling.apply).Другими словами, лучшим вариантом может быть вложение измененной функции в apply().

1 Ответ

0 голосов
/ 07 июня 2018

Как это?

pd.concat([(x.val1*x.wt).rolling(window=2,min_periods=1).sum()/x.wt.rolling(window=2,min_periods=1).sum() for _,x in df.groupby('id')])
Out[592]: 
0    0.823389
1    0.295437
2    0.072459
3    0.333050
4    0.445683
5    0.913049
6    0.704820
7    0.317114
8    0.325059
9    0.179366
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...