Средневзвешенное значение в pandas DataFrame с определенным условием

Я хочу динамически создавать экспоненциально убывающую скользящую среднюю, которая придает больший вес недавним измерениям. Например, если у меня есть 5 запросов, и эти 5 запросов являются результатом последних 4 недель, я хочу динамически создать экспоненциальное среднее значение, используя эти 4 недели (строка 1). Тем не менее, если эти 5 запросов являются результатом 4 недель, но некоторые из недель присутствуют более одного раза, то я хочу каким-то образом изменить экспоненциальное среднее, чтобы не рассматривать повторяющиеся недели как отдельные недели и назначать неправильные веса. Мои измерения в неделях. Пример dataFrame:

id requests day_of_week hour   weeks 
1    5        3       21   [1,2,3,4] 
2    5        3.      22   [2,2,3,4]

Expected output:
id requests day_of_week hour   weeks   output   
1    0        3       21   [1,2,3,4]   see_function
2    5        3.      22   [2,2,3,4]   see_function

I am defining the weighted mean function as follows:
# lambda function to compute the weighted mean:
r = 0.5
a = 1.0
wm = lambda x: np.average(x, weights=[a * r ** i for i in range(len(x))].reverse())

df['output'] = df['weeks'].apply(wm, axis=1)

Тем не менее, то, что я делаю, неправильно, так как каждую неделю (дублированную или нет) обрабатывает одно и то же. Я пытаюсь найти умное решение, которое может различать, повторяются ли недели, и, таким образом, не распределять вымышленные веса.

Опубликованное мною средневзвешенное значение предполагает постоянный период полураспада, который зависит только от продолжительности измерений и не принимает во внимание то, что я хочу. Предполагая, что количество недель равно {2: 2, 3: 1, 4: 1}, тогда я бы каким-то образом использовал частоты появления, чтобы настроить свое средневзвешенное значение, чтобы уделять больше внимания последним, чем это уже делается.


person azal    schedule 18.01.2021    source источник


Ответы (1)


Если вы хотите избавиться от дубликатов из списка недель, вы можете сделать что-то, как показано ниже, и добавить новый столбец в свой фрейм данных и cal. вы взвесили средн. Сверху.

df = pd.DataFrame({'id':[1,4],'weeks':[[1,2,3,4],[2,2,3,4]]})
df['DistinctWeeks']=df['weeks'].apply(lambda x : list(set(x)))

Вывод:

введите описание изображения здесь

person Divyaansh Bajpai    schedule 18.01.2021
comment
спасибо за ответ, но я не этого хочу :) - person azal; 18.01.2021