Перекрестная таблица Pandas в индексе фрейма данных

#python #pandas #dask

#python #pandas #dask

Вопрос:

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

 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
  

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

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

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

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

Комментарии:

1. Привет, вы пробовали преобразовать данные с помощью pd.pivot() для создания столбцов для AU896 и ZZ999 , а затем с помощью df[['AU896', 'ZZ999']].corr()

2. Можете ли вы опубликовать пример рабочего кода? Я попробовал pivot, но потерпел неудачу, так как моя попытка была неэффективной.

Ответ №1:

Не совсем уверен в варианте использования. Поскольку вы не показали, что делать со столбцом 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()