Обобщение данных за последние 12 месяцев в данных по категориям с использованием Python - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать сводку данных по категориям за последние 12 месяцев (исключая текущий месяц).Я суммировал предыдущие 3 месяца с помощью следующего кода, но делать это в течение 12 месяцев кажется громоздким.Мне интересно, есть ли более эффективный способ динамического разделения данных за последние 12 месяцев.df1 - это полный набор данных, который я загружаю из соединения с БД с помощью SQL-запроса.Я использую .drop (), чтобы вырезать ненужные столбцы данных и оставляю меня только с счетом.

import pandas as pd
import datetime

df1.Start_Date = pd.DatetimeIndex(df1.Start_Date)

today = datetime.date.today()
currentfirst = today.replace(day=1)
thirdMonth = currentfirst - pd.offsets.MonthBegin(3)
secondMonth = currentfirst - pd.offsets.MonthBegin(2)
firstMonth = currentfirst - pd.offsets.MonthBegin(1)

fst_label = firstMonth.strftime('%B')
snd_label = secondMonth.strftime('%B')
thd_label = thirdMonth.strftime('%B')

def monthly_vol(df, label, start_date, end_date):
    """Slices df1 into previous months and sums the volume of each change class."""
    if start_date is not None:
        df = df1[df1.Start_Date >= start_date]
    if end_date is not None:
        df = df[df.Start_Date < end_date]
    df_count = df.groupby('Change Class').count().drop(['Start_Date', 'Risk Level', 'Change Coordinator', 'Change Coordinator Group'], axis=1)
    return df_count

fst_month = monthly_vol(df1, fst_label, firstMonth, currentfirst)
snd_month = monthly_vol(df1, snd_label, secondMonth, firstMonth)
thd_month = monthly_vol(df1, thd_label, thirdMonth, secondMonth)

def month_merge(df1, df2, df3):
    """Merges monthly dataframes together."""
    new_df = pd.merge(df1, df2, left_index=True, right_index=True).merge(df3, left_index=True, right_index=True)
    new_df.columns = [fst_label, snd_label, thd_label]
    print(new_df)
    return new_df

monthly_vol = month_merge(fst_month, snd_month, thd_month)

Это даст вывод:

              May  April  March
Change Class                   
Emergency      36     36     32
Expedited      17     24     35
Normal        182    146    134
Standard      256    210    267

Бонусный вопрос: Этобыло бы неплохо получить среднее значение общего объема для каждой категории в одном и том же кадре данных.Примерно так:

              May  MayAVG  April  AprilAVG   March  MarchAVG
Change Class                   
Emergency      36   7.33   36     8.65       32     6.84
Expedited      17   3.46   24     5.77       35     7.48
Normal        182   37.07  146    35.10      134    28.63
Standard      256   52.14  10     50.48      267    57.05

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 06 июня 2018

Почему бы вам не попробовать словарь?Словарь - это пара ключевых данных.Например: {"3": "Март", "4": "Апрель"}.Поэтому, где бы вы ни находились, вы можете использовать словарь.Заполните эти словари внутри цикла.Смотри ниже.

month_dict = {"3": "March", "2": "April", "1": "May"} 

thirdMonth = currentfirst - pd.offsets.MonthBegin(3)
secondMonth = currentfirst - pd.offsets.MonthBegin(2)
firstMonth = currentfirst - pd.offsets.MonthBegin(1)


label_dict = {}

fst_label = firstMonth.strftime('%B')
snd_label = secondMonth.strftime('%B')
thd_label = thirdMonth.strftime('%B')

vol_month = {}

fst_month = monthly_vol(df1, fst_label, firstMonth, currentfirst)
snd_month = monthly_vol(df1, snd_label, secondMonth, firstMonth)
thd_month = monthly_vol(df1, thd_label, thirdMonth, secondMonth)
...