У меня есть следующий набор данных: df
groupby.sum() разреженная матрица в пандах или SciPy: ищу производительность
import numpy.random
import pandas
cat = pandas.Series(numpy.random.random_integers(0,400,1000000))
ids = pandas.Series(numpy.random.random_integers(0,10000,1000000))
team = pandas.Series(numpy.random.random_integers(0,1,1000000))
df = pandas.concat([ids,cat,team],axis=1)
df.columns = ['ids','cat','team']
Обрати внимание, что есть только 400 различные категории в cat
колонки. Соответственно, я хочу подготовить набор данных для классификации машинного обучения, т. Е. Создать один столбец для каждого отдельного значения категории от 0 до 400, а для каждой строки - записать 1, если идентификатор имеет соответствующую категорию, а 0 в противном случае. Моя цель состоит в то, чтобы сделать GroupBy ids
и просуммировать 1 для каждой категории колонке следующим образом:
df2 = pandas.get_dummies(df['cat'], sparse=True)
df2['ids'] = df['ids']
df3 = df2.groupby('ids').sum()
Моя проблема заключается в том, что groupby.sum()
очень и очень долго, слишком долго (более 30 минут). Поэтому мне нужна другая стратегия, чтобы сделать мои расчеты. Вот вторая попытка.
from sklearn import preprocessing
import numpy
text_encoder = preprocessing.OneHotEncoder(dtype=numpy.int)
X = text_encoder.fit_transform(df.drop(['team','ids'],axis=1).values).astype(int)
Но тогда, X
является разреженным SciPy матрица. Здесь у меня есть два варианта: либо найти способ groupby.sum()
эффективно на этой редкой SciPy матрицы, или преобразовать его в реальную матрицу Numpy с .toarray()
следующим образом:
X = X.toarray()
df2 = pandas.DataFrame(X)
df2['ids'] = df['ids']
df3 = df2.groupby('ids').sum()
Сейчас проблема заключается в том, что много памяти теряется из-за .toarray()
. И groupby.sum()
, безусловно, занимает много памяти.
Так что мой вопрос: есть ли умный способ решить мою проблему, используя SPARSE MATRIX с ЭФФЕКТИВНЫМ ВРЕМЕНИ для groupby.sum()
?
Это просто пример? Моя версия панд должна быть старой, поэтому я не могу добавить разреженный аргумент при создании df2 с помощью get_dummies(). Но тогда 'df3 = df2.groupby ('ids'). Sum()' очень быстрая, хотя на самом деле она занимает довольно много памяти (c. 6Go). Если groupby работает медленнее с sparse_matrix .. решение может состоять в том, чтобы избежать этого, сортируя данные по идентификаторам, находя, где каждый id запускается и останавливается, а затем просто .sum (0) на срезах разреженной матрицы – etna
Просто для того, чтобы развернуть бит , сортировка будет 'df.sort ('ids', inplace = True)' и 'df.groupby ('ids'). size()' расскажет вам, сколько строк нарезки для каждого последующего 'id' в вашем разреженном матрица. Нарезка должна работать классическим способом, например. 'X [0:95,:]. Sum (0)', если имеется 95 строк, т. Е. Характеристики для первого id. – etna
Вы изучали редкие документы pandas? http://pandas.pydata.org/pandas-docs/dev/sparse.html – hpaulj