Среднее значение для кадра данных Pandas для каждой строки по датам - PullRequest
2 голосов
/ 03 октября 2019

В фрейме данных pandas с данными проекта (входная таблица) я пытаюсь вычислить историческое среднее значение «Успех» для каждой строки. Условия:

  1. Рассматривать только проекты с тем же «Заказчиком», что и в рассчитанной строке.
  2. Рассматривать только проекты с «Конечной датой» до «Начальной даты» проекта. в вычисляемой строке
  3. Если не было проекта, который уже завершился с конкретным заказчиком, следует вернуть бланк

Любая помощь очень ценится, так как я не знаю, с чего начатьспасибо.

Таблица ввода

Project ID    Start Date    End Date    Success Customer Name
8403986       3/13/2015     9/9/2015    0.396   ENGINEERING INC
92083597      6/20/2016     12/24/2016  0.3     ENGINEERING INC
13979865      3/18/2019     5/5/2019    0.2004  ENGINEERING INC
93106418      1/22/2017     11/6/2017   0.374   MANAGEMENT CORP
3658851       8/5/2018      12/17/2018  0.5002  SERVICES INC
116547576     10/31/2015    12/30/2015  0.478   MANAGEMENT CORP
4164070       10/2/2018     10/12/2018  0.5     ENGINEERING INC
49701600      12/23/2017    10/1/2018   0.226   MANAGEMENT CORP
6235002       9/27/2016     4/25/2017   0.542   MANAGEMENT CORP
54113980      10/27/2015    1/2/2016    0.344   ENGINEERING INC
104596325     7/3/2015      2/17/2016   0.455   MANAGEMENT CORP 
69580391      8/9/2016      1/10/2017   0.39    ENGINEERING INC
111382294     1/13/2017     10/18/2017  0.299   SERVICES INC
7904360       12/12/2015    3/16/2016   0.281   MANAGEMENT CORP
117003225     5/5/2017      5/12/2017   0.2868  SERVICES INC
99819795      10/9/2015     1/14/2016   0.356   ENGINEERING INC
122919691     1/16/2016     10/24/2016  0.474   SERVICES INC

Таблица вывода

Project ID    Start Date    End Date    Success Customer Name    Historic Success
8403986       3/13/2015     9/9/2015    0.396   ENGINEERING INC  
92083597      6/20/2016     12/24/2016  0.3     ENGINEERING INC  0.365
13979865      3/18/2019     5/5/2019    0.2004  ENGINEERING INC  0.381
93106418      1/22/2017     11/6/2017   0.374   MANAGEMENT CORP  0.405
3658851       8/5/2018      12/17/2018  0.5002  SERVICES INC     0.353
116547576     10/31/2015    12/30/2015  0.478   MANAGEMENT CORP  
4164070       10/2/2018     10/12/2018  0.5     ENGINEERING INC  0.357
49701600      12/23/2017    10/1/2018   0.226   MANAGEMENT CORP  0.439
6235002       9/27/2016     4/25/2017   0.542   MANAGEMENT CORP  0.405
54113980      10/27/2015    1/2/2016    0.344   ENGINEERING INC  0.396
104596325     7/3/2015      2/17/2016   0.455   MANAGEMENT CORP  
69580391      8/9/2016      1/10/2017   0.39    ENGINEERING INC  0.365
111382294     1/13/2017     10/18/2017  0.299   SERVICES INC     0.474
7904360       12/12/2015    3/16/2016   0.281   MANAGEMENT CORP  
117003225     5/5/2017      5/12/2017   0.2868  SERVICES INC     0.474
99819795      10/9/2015     1/14/2016   0.356   ENGINEERING INC  0.396
122919691     1/16/2016     10/24/2016  0.474   SERVICES INC     

например, проект '92083597' с 'Engineering INC' с 'Дата начала'= 6/20/2016

Условие 1: рассматриваются только строки с «Заказчиком» = Engineering INC *

Project ID    Start Date    End Date    Success Customer Name    
8403986       3/13/2015     9/9/2015    0.396   ENGINEERING INC  
92083597      6/20/2016     12/24/2016  0.3     ENGINEERING INC  
13979865      3/18/2019     5/5/2019    0.2004  ENGINEERING INC  
4164070       10/2/2018     10/12/2018  0.5     ENGINEERING INC  
54113980      10/27/2015    1/2/2016    0.344   ENGINEERING INC  
69580391      8/9/2016      1/10/2017   0.39    ENGINEERING INC  
99819795      10/9/2015     1/14/2016   0.356   ENGINEERING INC  

Условие 2: Только строки с «Датой окончания» до 6/ 20/2016 считаются

Project ID    Start Date    End Date    Success Customer Name    
8403986       3/13/2015     9/9/2015    0.396   ENGINEERING INC  
54113980      10/27/2015    1/2/2016    0.344   ENGINEERING INC  
99819795      10/9/2015     1/14/2016   0.356   ENGINEERING INC  

Среднее значение из оставшихся трех строк (0,369 + 0,344 + 0,356) / 3 равно 0,365 . Это будет возвращено и является "Историческим успехом""для строкового проекта '92083597'. Если после первого или второго условия не осталось проектовпусто возвращается.

1 Ответ

2 голосов
/ 03 октября 2019

Вы должны разбить эту проблему на несколько подзадач, если вы действительно хотите узнать, как ее решить. Это поможет вам стать отличным программистом, а также позволит вам брать кусочки различных ответов о переполнении стека. Кроме того, вы также должны избегать пробелов в именах столбцов

Вот как я бы это сделал, но могут быть более быстрые способы сделать это

Сначала вы должны отсортировать кадр данных по дате, убедитесь, чточто ваши данные отформатированы правильно. Вы можете использовать приведенный ниже код, чтобы обеспечить правильную сортировку. Сначала он проверяет, что столбец имеет правильный формат, а затем сортирует на основе 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. Затем вы запускаете ту же строку кода для смещенных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...