Вы должны разбить эту проблему на несколько подзадач, если вы действительно хотите узнать, как ее решить. Это поможет вам стать отличным программистом, а также позволит вам брать кусочки различных ответов о переполнении стека. Кроме того, вы также должны избегать пробелов в именах столбцов
Вот как я бы это сделал, но могут быть более быстрые способы сделать это
Сначала вы должны отсортировать кадр данных по дате, убедитесь, чточто ваши данные отформатированы правильно. Вы можете использовать приведенный ниже код, чтобы обеспечить правильную сортировку. Сначала он проверяет, что столбец имеет правильный формат, а затем сортирует на основе Customer_Name, чтобы сгруппировать их, а затем сортирует по датам для организации проектов
df['End_Date'] =pd.to_datetime(df["End_Date"])
df = df.sort_values(["Customer_Name", "End_Date"])
Затем вычисляет среднее значение для каждой компании на основепредыдущий показатель успеха. Для этого вам нужно рассчитать скользящее среднее в пандах. Это можно сделать с помощью цикла, но обычно в Pandas есть более быстрый способ сделать это.
df.groupby("Customer_Name").Success.expanding().mean()
Это будет генерировать текущее среднее значение каждого порядкового номера Customer_Name. Полный код здесь ниже. Вы должны попытаться взглянуть на каждую из подзадач, которые я создал, и посмотреть, сможете ли вы улучшить решения или, возможно, добавить больше подзадач, которые могут вам понадобиться.
df['End_Date'] =pd.to_datetime(df["End_Date"])
df = df.sort_values(["Customer_Name", "End_Date"])
df["Historic_Success"] = df.groupby("Customer_Name")
.Success
.expanding()
.mean()
.values
Надеюсь, что ответит на ваш вопрос. Если вы хотите отсортировать фрейм данных обратно в формат, в котором он был, вы можете отсортировать по индексу, поскольку я не переиндексировал фрейм данных в моем коде.
Редактировать: Чтобы избежать первого успеха в историческом успехе, вы можете добавить ввод «2» в расширяющую функцию.
df["Historic_Success"] = df.groupby("Customer_Name")
.Success
.expanding(2)
.mean()
.values
Но это все равно будет включать в себя показатель успешности текущего проекта в среднем. Это будет означать, что исторический показатель успеха проекта 1 будет означать средний уровень успеха проекта 1 и проекта 2.
Чтобы избежать этого, лучше всего избегать использования приведенного ниже кода.
df["Historic_Success"] = df.groupby("Customer_Name").Success.shift(1)
df.Historic_Success = df.groupby("Customer_Name")
.Historic_Success
.expanding()
.mean()
.values
Здесь, после того, как вы упорядочили данные по именам и датам клиентов, вы смещаете данные успеха на 1. Затем вы запускаете ту же строку кода для смещенных данных.