#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()