Кросс-таблица панд по индексу фрейма данных - PullRequest
0 голосов
/ 23 апреля 2019

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

ID                  UserID
999974708546523127  AU896
999974708546523127  ZZ999
999974708546520000  ZZ999

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

Data = pd.read_csv('path.csv', 
        sep=';', names=['ID', 'UserID', 'Info1', 'Info2'], error_bad_lines=False, 
        encoding='latin-1', dtype='category')

df = pd.crosstab(Data.UserID, Data.ID)

Однако, поскольку у меня ~ 5 миллионов строк и хэш активности идентификатора настолько сложен, вычисление занимает слишком много времени или не завершается вообще. Использование dtype = 'category' уже значительно сократило время чтения CSV-файла.

Ожидаемая выходная корреляционная матрица

Index  AU896  ZZ999
AU896    1     0.5
ZZ999   0.5     1

Я не могу изменить ни хеш, ни UserID, чтобы уменьшить использование памяти.

Эта операция занимает 6 и 3 секунды для Info1 и Info2.

Может быть, есть более эффективная операция, чтобы сделать это с пандами или даже с dask?

Спасибо за помощь!

1 Ответ

0 голосов
/ 24 апреля 2019

Не совсем уверен насчет варианта использования.Так как вы не показали, что делать со столбцом info1 или info2.Итак, я приведу общий пример.

import pandas as pd
import io

data_string = '''ID,UserID,info1
999974708546523127,AU896,35
999974708546523127,ZZ999,45
999974708546520000,ZZ999,13
999974708546520000,AU896,13
999974708546523128,AU896,45
999974708546523128,ZZ999,12
999974708546520001,ZZ999,36
999974708546520001,AU896,37'''

df = pd.read_csv(io.StringIO(data_string))

# create a wide form of data from long
wide_df = df.pivot(index="ID", columns="UserID", values="info1").reset_index()
# build the correlation metrics from the wide form of data
corr_df = wide_df[["AU896", "ZZ999"]].corr()
...