Примеры версий:
input_df =
Год
< th>Неделя
Компания
2024
4
A
2023
18
А
2023
10
Б
< /tbody>
historical_df =
Год
Неделя
Компания
Объем
2024
2
А
43
2023
16
А
< td>32
2023
12
B
67
ЛОГИКА
Для каждой строки в input_df:
-Фильтровать исторический_df по годам, неделям и компаниям, чтобы расчет основывался только на исторических данных каждой компании. по году и неделе этой строки.
-Отсортируйте исторические данные, чтобы использовать .head() для извлечения данных за 16 последних недель (только до года и недели текущей строки).
-Используйте эти (до) 16-недельные данные об объеме для расчета коэффициента изменчивости (st.dev/mean)
-Сохраните это значение в списке
-Используйте список для создания нового столбца в input_df
Код: Выделить всё
def add_variability(input_df, historical_df):
variability_calcs = []
for index, row in input_df.iterrows():
filtered_historical_df = historical_df[
((historical_df['Year'] < row['Year']) |
((historical_df['Year'] == row['Year']) & (historical_df['Week'] < row['Week']))) &
(historical_df['Company'] == row['Company'])
]
filtered_historical_df = filtered_historical_df.sort_values(by=['Year', 'Week'], ascending=False)
recent_weeks = filtered_historical_df.head(16)
if recent_weeks.shape[0] > 1:
if recent_weeks['Volume'].mean() != 0:
cv = recent_weeks['Volume'].std() / recent_weeks['Volume'].mean()
else:
cv = None
else:
cv = None
variability_calcs.append(cv)
input_df['Variability'] = variability_calcs
return input_df
input_df =
Год
Неделя
Компания
Вариативность
2024
4
A
0,334
2023
18
А
0,242
2023
10
B
0,455
Подробнее здесь: https://stackoverflow.com/questions/789 ... ed-filteri