Групповые панды применяются с мультииндексными проблемами производительности - PullRequest
0 голосов
/ 07 июня 2018
import pandas as pd
import numpy as np
from collections import OrderedDict
import gc
import datetime



df = pd.DataFrame(np.random.rand(10000000, 5), columns=['A', 'B', 'C', 'D', 'E'])
df['A'] = 0.25*((df['A']/0.25).astype(int))
df['B'] = 0.25*((df['B']/0.25).astype(int))
df['A']=df['A'].astype(str)
df['B']=df['B'].astype(str)

df['ix1'] = df['A']
df['ix2'] = df['B']


df['A1']=df['A'].astype('category')
df['B1']=df['B'].astype('category')
gc.collect()

Вопрос 1: групповые и применяемые функции занимают больше времени, чем dataframe.count, делая то же самое.Как мне оптимизировать здесь?

это занимает ~ 17 секунд

df.groupby(['A', 'B']).apply(genSummary)

это занимает всего 3 секунды

df.groupby(['A', 'B']).count()

Вопрос 2: Мне нужно применить пользовательские функции кгрупповые объекты.После установки мультииндекса группировка по строке медленнее, чем без индекса ...

enter image description here

def genSummary(group):
    return pd.Series(OrderedDict([('Counts', np.count_nonzero(group['C'])),
                                  ('Sum', np.sum(group['D'])),
                                  ('Wavg', np.ma.average(group['E'], weights=group['C'])),
                                  ('Wavg', np.ma.average(group['E']*(group['C']>0.5), weights=group['C']*(group['C']>0))),
                                  ])
                     )

1 группировка по строке занимает ~ 8,1 секунды

df.groupby(['A', 'B']).apply(genSummary)

2 группировка по категориям занимает ~ 6,3 секунды

df.groupby(['A1', 'B1']).apply(genSummary)

df.sort_values(['ix1', 'ix2'], inplace=True)
gc.collect()
df.set_index(['ix1', 'ix2'], inplace=True)
gc.collect()

3 установка мультииндекса, группировка по строке занимает ~ 7,2 секунды

df.groupby(['A', 'B']).apply(genSummary)

4 установка мультииндекса, группировка по индексузанимает ~ 5.секунд

df.groupby(level=[0,1]).apply(genSummary)

5 установить мультииндекс, группировка по категориям занимает ~ 4,6 секунды

df.groupby(['A1', 'B1']).apply(genSummary)

df = df.reset_index()
gc.collect()

6 reset_index, группировка по категориям занимает ~ 4,9 секунд

df.groupby(['A1', 'B1']).apply(genSummary)

7reset_index, группировка по строке занимает ~ 6,2 секунды

df.groupby(['A', 'B']).apply(genSummary)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...