Я довольно новичок в программировании и ищу более питонный способ реализации некоторого кода. Вот фиктивные данные:
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B'], 10000),
'Sub-Category':np.random.choice( ['X','Y','Z'], 10000),
'Sub-Category-2':np.random.choice( ['G','F','I'], 10000),
'Product':np.random.choice( ['Product 1','Product 2','Product 3'], 10000),
'Units_Sold':np.random.randint(1,100, size=(10000)),
'Dollars_Sold':np.random.randint(100,1000, size=10000),
'Customer':np.random.choice(pd.util.testing.rands_array(10,25,dtype='str'),10000),
'Date':np.random.choice( pd.date_range('1/1/2016','12/31/2018',
freq='D'), 10000)})
У меня много таких транзакционных данных, которые я использую для различных групповых операций. Мое текущее решение состоит в том, чтобы создать мастер-группу следующим образом:
master = df.groupby(['Customer','Category','Sub-Category','Product',pd.Grouper(key='Date',freq='A')])['Units_Sold'].sum()\
.unstack()
Оттуда я выполняю различные групповые операции, используя функцию .groupby (level =), чтобы собирать информацию так, как я ищу. Я обычно делаю резюме на каждом уровне. Кроме того, я создаю промежуточные итоги на каждом уровне, используя некоторые варианты приведенного ниже кода.
y = master.groupby(level=[0,1,2]).sum()
y.index = pd.MultiIndex.from_arrays([
y.index.get_level_values(0),
y.index.get_level_values(1),
y.index.get_level_values(2) + ' Total',
len(y.index)*['']
])
y1 = master.groupby(level=[0,1]).sum()
y1.index = pd.MultiIndex.from_arrays([
y1.index.get_level_values(0),
y1.index.get_level_values(1)+ ' Total',
len(y1.index)*[''],
len(y1.index)*['']
])
y2 = master.groupby(level=[0]).sum()
y2.index = pd.MultiIndex.from_arrays([
y2.index.get_level_values(0)+ ' Total',
len(y2.index)*[''],
len(y2.index)*[''],
len(y2.index)*['']
])
pd.concat([master,y,y1,y2]).sort_index()\
.assign(Diff = lambda x: x.iloc[:,-1] - x.iloc[:,-2])\
.assign(Diff_Perc = lambda x: (x.iloc[:,-2] / x.iloc[:,-3])- 1)\
.dropna(how='all')\
Это всего лишь пример - я могу выполнять то же упражнение, но выполнять групповые упражнения в другом порядке. Например - затем я могу захотеть сгруппировать по «Категория», «Продукт», затем «Клиент», поэтому мне нужно будет сделать:
master.groupby (уровень = [1,3,0) .sum ()
Тогда мне придется повторить все упражнение для промежуточных итогов, как указано выше. Я также часто меняю период времени - может быть конец года конкретным месяцем, год - датой, квартал и т. Д.
Из того, что я уже изучил в программировании (что является минимальным, ясно!), Вы должны искать возможность писать функцию каждый раз, когда повторяете код. Очевидно, в этом примере я повторяю код снова и снова.
Есть ли способ построить функцию, в которой вы можете предоставлять уровни для Groupby вместе с временными рамками, все это при создании функции для подведения итогов для каждого уровня?
Заранее спасибо за любые указания по этому вопросу. Это очень высоко ценится.