Создание csr_matrix с унарными / двоичными данными с самого начала - PullRequest
1 голос
/ 09 июля 2019

Я импортирую двоичные данные из SQL в pandas Dataframe, состоящем из столбцов UserId и ItemId. Я использую неявные / двоичные данные, как вы можете видеть в pivot_table ниже.

Dummy data

frame=pd.DataFrame()
frame['Id']=[2134, 23454, 5654, 68768]
frame['ItemId']=[123, 456, 789, 101]

Я знаю, как создать pivot_table в Пандах, используя:

print(frame.groupby(['Id', 'ItemId'], sort=False).size().unstack(fill_value=0))

ItemId  123  456  789  101
Id
2134      1    0    0    0
23454     0    1    0    0
5654      0    0    1    0
68768     0    0    0    1

и преобразовать его в SciPy csr_matrix, но я хочу создать разреженную матрицу с самого начала без необходимости конвертировать из панд df. Причина этого в том, что я получаю ошибку: Unstacked DataFrame is too big, causing int32 overflow, потому что мои исходные данные состоят из 378.777 строк.

Любая помощь очень ценится!

Я пытаюсь сделать то же, что и эти ответы Эффективно создавать разреженные сводные таблицы в пандах?

Но у меня пока нет данных frame['count'].

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Использование 4-й опции для создания матрицы:

Id = [2134, 23454, 5654, 68768]
ItemId = [123, 456, 789, 101]

csrm = csr_matrix(([1]*len(Id), (Id,ItemId)))

Результат:

<68769x790 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in Compressed Sparse Row format>
0 голосов
/ 09 июля 2019

Я предполагаю, что вы можете каким-то образом считывать строки значений данных в отдельные списки в памяти, то есть, как вы делали это в своем примере (имея списки для Id и ItemId).Согласно комментариям к вашему посту, мы также не ожидаем дубликатов.Обратите внимание, что следующие не будут работать , если у вас есть дубликаты!

Представленное решение также вводит (разреженную) матрицу, которая не так плотна, как показано в примере, как мы будем напрямуюиспользуйте значения Id в качестве записей матрицы / строки.

Чтобы передать их конструктору, если вы просматриваете документацию SciPy :

csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])

, где data, row_ind и col_ind удовлетворяют соотношению a[row_ind[k], col_ind[k]] = data[k].

То есть мы можем напрямую передавать списки как индексы в нашу разреженную матрицуследующим образом:

from scipy.sparse import csr_matrix
Id_values = load_values() # gets the list of entries as in the post example
ItemId_values = load_more_values()

sparse_mat = csr_matrix(([1]*len(Id_values), # entries will be filled with ones
                        (Id_values, ItemId_values)), # at those positions
                        shape=(max(Id_values)+1, max(ItemId_values)+1)) # shape is the respective maximum entry of each dimension

Обратите внимание, что это не даст вам никакой сортировки, но вместо этого поместите значения в их соответствующие позиции Id, т.е. первая пара будет удерживаться в позиции (2134, 134) вместо (0, 0)

...