Melanjutkan dari modul sebelumnya, Data yang digunakan adalah https://www.kaggle.com/c/rossmann-store-sales/data
Fungsi agregat sederhana seperti sum, count, mean, std, max, min dan lainya dapat dilihat di https://pandas.pydata.org/pandas-docs/stable/reference/groupby.html
Pada modul ini akan dibahas fungsi agregat yang lebih kompleks dengan menggunakan fungsi agg(). Dokumentasi lengkap lihat di https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.agg.html
Dengan fungsi agg() kita bisa melakukan fungsi aggregate yang berbeda untuk kolom yang berbeda. Pada contoh code dibawah melakukan fungsi mean untuk column sales dan count untuk customer.
import pandas as pd
import numpy as np
df = pd.read_csv("train.csv", low_memory=False, parse_dates=["Date"])
df.groupby(["Store", "DayOfWeek"]).agg({"Sales": "mean", "Customers": "count"})
Sales Customers
Store DayOfWeek
1 1 4946.119403 134
2 4650.918519 135
3 4454.474074 135
4 4094.607407 135
5 4516.414815 135
... ... ... ...
... ... ... ...
... ... ... ...
Atau contoh yang lebih kompleks, menampilkan mean, max dan min untuk kolom sales, dan count untuk kolom customers.
df2 = df.groupby(["Store", "DayOfWeek"]).agg({"Sales": ["mean", "max", "min"], "Customers": "count"})
Sales Customers
mean max min count
Store DayOfWeek
1 1 4946.119403 9528 0 134
2 4650.918519 7959 0 135
3 4454.474074 7821 0 135
4 4094.607407 7785 0 135
5 4516.414815 8414 0 135
Anda juga bisa menggunakan fungsi perhitungan sendiri.
mc_uncert = lambda x: np.std(x) / np.sqrt(x.size)
df2 = df.groupby(["Store", "DayOfWeek"]).agg(
{"Sales": [("SalesMean", "mean"), ("SalesUncert", mc_uncert)], "Customers": "count"})
df2.head()
Sales Customers
SalesMean SalesUncert count
Store DayOfWeek
1 1 4946.119403 139.120367 134
2 4650.918519 94.412423 135
3 4454.474074 97.225056 135
4 4094.607407 129.367657 135
5 4516.414815 113.495466 135
Pendekatan dengan fungsi lambda diatas adalah pendekatan obsolete, walaupun berjalan tanpa masalah. Untuk kedepannya, pendekatan dengan named function lebih disarankan oleh Pandas team.
Berikut hasil refactoring dari code diatas. Bagian header Dataframe yang ditampilkan juga lebih rapih.
def mc_uncert2(x):
return np.std(x) / np.sqrt(x.size)
dfg = df.groupby(["Store", "DayOfWeek"])
dfg.agg(
SalesMean=("Sales", "mean"),
SalesUncert=("Sales", mc_uncert2)
).reset_index().head()
Store DayOfWeek SalesMean SalesUncert
0 1 1 4946.119403 139.120367
1 1 2 4650.918519 94.412423
2 1 3 4454.474074 97.225056
3 1 4 4094.607407 129.367657
4 1 5 4516.414815 113.495466