Скользящее среднее за последние 3 года для номера той же недели Python Pandas
Я нахожу среднее значение эквивалентных недель, когда есть данные, например, 201932, используя среднее значение данных за 201632, 201732 и 201832. Пример: 2019 - это год, а 32 - номер недели.
Например, при поиске для Франции - год 201901 следует взять среднее значение выручки 201801,201701,201601 только для Франции (при наличии данных) и заполнить результат в другом новом столбце для каждой строки, представленной во фрейме данных.
примерный набор данных
Обратите внимание, что для каждой страны существует несколько стран, и данные варьируются от 2016 до 2019 в неделю, как указано в данных выборки.
Пожалуйста, помогите в коде Python Pandas для этой проблемы. Спасибо заранее
2 ответа
import pandas as pd
import datetime as datetime
df['Calender Week'] = pd.to_datetime(df['Calender Week'] + '-0', format = '%Y%W-%w')
df.groupby([df['C'], df['Calender Week'].dt.week])['Revenue'].mean()
Это делает то, что вы хотите. Сначала вы должны изменить столбец "Неделя календаря" на datetime. В конвертации мне пришлось добавить '-0', чтобы конвертировать правильно. Все, что он делает - это решает, начинается ли неделя в воскресенье или понедельник, что в нашем случае не имеет значения.
Во второй строке мы используем groupby. Мы группируем по стране и фактической календарной неделе (от 1 до 52), как представлено .dt.week
, Мы смотрим на столбец Доход и, наконец, берем среднее значение.
Результат из моих случайно созданных тестовых данных выглядит следующим образом:
C Calender Week
France 50 16.50
51 25.00
52 30.00
USA 50 14.00
51 13.25
52 30.50
Обобщенный пример, не протестированный полностью, вы можете обновить в соответствии с вашими потребностями, пожалуйста, простите за синтаксические ошибки / ошибки компиляции
# 1 load your data here
myYearlyWeekAvgList = [[Calendar, WkNumber, France, 0, 201538], [....]]
# 2 initialize variables here
totalSum = 0
movingAves = 0 # track total for that yr
myYear = currentYear # input, for e.g. 2018
# 3 start totals & averages here
for i, x in enumerate(myYearlyWeekAvgList, 1):
T = x[i] # get each row
if x == currentYear # for e.g. if yr is 2018, then sum value
totalSum.append(T[3]) # your revenue in 3rd col I guess
moving_ave = totalSum/i # your average for that col