Найти тему
Властелин машин

Агрегирование данных с Python

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

В демонстрационных целях будем использовать набор объявлений о продажах квартир в Республике Северная Осетия-Алания, имеющий следующий вид:

-2

Разобьем сведения об общей площади как рассказывалось в предыдущей статье на группы, различающихся в 5 кв.м., начиная от 10. А затем проиндексируем записи группой площади, к которой они относятся и временем публикации:

# устанавливаем date_time в качестве индекса
df = df.set_index([
'date_time'])
# преобразуем в подневный период (отбрасываем время)
df = df.to_period(
'D')
# формируем список границ площадей и создаем столбец, задающий для каждой квартиры полуинтервал площадей, к которому она относится
sqs = np.hstack([np.arange(10,140,5),np.array([1000])])
df[
'sq_grs'] = pd.cut(df['total_square'],sqs)
sq_grps2int = {item:i for i, item in enumerate(df[
'sq_grs'].unique())}
# заменяем полуинтервалы целыми числами для простоты работы и адресации данных
df[
'sq_grs'] = df['sq_grs'].map(sq_grps2int)
df=df.reset_index()
# задаем индекс из двух столбцов для каждой записи
df = df.set_index([
'date_time', 'sq_grs'])

В результате получаем таблицу следующего вида:

-3

Значения столбца sq_grs соответствуют полуинтервалам диапазонов площадей:

-4

Теперь можно выполнить операции группирования по индексу и вывести для каждого столбца, например, среднее арифметическое:

df_grs = df.groupby(level=[0,1]).mean()

В результате получим:

-5

Здесь мы провели группирование по двум уровням индекса. Однако можно было бы это сделать и другим путем:
df_c = df_c.set_index([
'date_time'])
df_c = df_c.to_period(
'D')
sqs = np.hstack([np.arange(10,140,5),np.array([1000])])
df_c[
'sq_grs'] = pd.cut(df_c['total_square'],sqs)
df_c= df_c.reset_index()
df_c = df_c.groupby([
'date_time','sq_grs']).mean()
df_c = df_c[df_c[
'cost'].notnull()]

Отличием этого подхода является группировка не по индексу, а по значениям столбцов, после которой они заносятся в индекс.