Я запускаю некоторые модели в Python с подмножеством данных по категориям.Более быстрый способ удаления неиспользуемых категорий в пандах?
Для использования в памяти и предварительной обработки все категориальные переменные сохраняются как тип данных категории.
Для каждого уровня категориальной переменной в столбце «группа за» я запускаю регрессию, где мне нужно сбросить все свои категориальные переменные на те, которые присутствуют в этом подмножестве.
В настоящее время я делаю это с использованием .cat.remove_unused_categories()
, что занимает почти 50% от моего общего времени выполнения. На данный момент худшим нарушителем является моя колонка группировки, другие не занимают столько времени (как я полагаю, не так много уровней для снижения).
Вот упрощенный пример:
import itertools
import pandas as pd
#generate some fake data
alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
keywords = [''.join(i) for i in itertools.product(alphabets, repeat = 2)]
z = pd.DataFrame({'x':keywords})
#convert to category datatype
z.x = z.x.astype('category')
#groupby
z = z.groupby('x')
#loop over groups
for i in z.groups:
x = z.get_group(i)
x.x = x.x.cat.remove_unused_categories()
#run my fancy model here
На моем ноутбуке, это занимает около 20 секунд. для этого небольшого примера мы можем преобразовать в str, а затем вернуться в категорию для ускорения, но мои реальные данные имеют не менее 300 строк на группу.
Можно ли ускорить этот цикл? Я пробовал использовать x.x = x.x.cat.set_categories(i)
, который занимает аналогичное время, и x.x.cat.categories = i
, который запрашивает столько же категорий, сколько я начал.
вы можете попробовать это: 'х = z.get_group (I) .astype ({ 'х': 'ул'}). Astype ({ 'х':» category '}) 'и удалите эту строку:' xx = xxcat.remove_unused_categories() '? интересно, будет ли это быстрее ... – MaxU
ускоряет этот пример, но мои реальные данные имеют 3-400 строк по группе, а в этом случае преобразование строк медленнее. – jeremycg