Более эффективный способ создания нового столбца в кадре данных, который использует фильтрацию на основе строк, но избегPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Более эффективный способ создания нового столбца в кадре данных, который использует фильтрацию на основе строк, но избег

Сообщение Anonymous »

У меня есть упрощенная функция, представленная ниже, но которую я использую для создания нового столбца в существующем фрейме данных. Прямо сейчас я использую iterrows, но я пробовал использовать .apply при фильтрации по уникальным группам «Год» и «Неделя» (нет, их нельзя преобразовать в даты по причинам), но это не сильно ускорило работу. Есть идеи по использованию векторизованных функций для более эффективного выполнения этой задачи?
Примеры версий:
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»