У меня есть фрейм данных с 3 столбцами.
UserId | ItemId | Rating
(где рейтинг - это рейтинг, который пользователь присвоил элементу. Это np.float16. 2 идентификатора - np.int32)
Как наилучшим образом вычислить корреляции между элементами с помощью панд Python?
Мне нужно сначала повернуть таблицу (в широком формате), а затем применить pd.corr
df = df.pivot(index='UserId', columns='ItemId', values='Rating')
df.corr()
Он работает с небольшими наборами данных, но не с большими.
На этом первом шаге создается большой набор матричных данных, в основном полный отсутствующих значений.Это довольно интенсивно, и я не могу запустить его с большими фреймами данных.
Нет ли более простого способа вычислить корреляции непосредственно в длинном наборе данных, без поворота?
(я посмотрелв pd.groupBy, но это, кажется, только разбивает фрейм данных, а не то, что я ищу.)
РЕДАКТИРОВАТЬ: упрощенные данные и рабочий сводный код
import pandas as pd
import numpy as np
d = {'UserId': [1,2,3, 1,2,3, 1,2,3],
'ItemId': [1,1,1, 2,2,2, 3,3,3],
'Rating': [1.1,4.5,7.1, 5.5,3.1,5.5, 1.1,np.nan,2.2]}
df = pd.DataFrame(data=d)
df = df.astype(dtype={'UserId': np.int32, 'ItemId': np.int32, 'Rating': np.float32})
print(df.info())
pivot = df.pivot(index='UserId', columns='ItemId', values='Rating')
print('')
print(pivot)
corr = pivot.corr()
print('')
print(corr)
РЕДАКТИРОВАНИЕ2: Большой случайныйгенератор данных
def randDf(size = 100):
## MAKE RANDOM DATAFRAME, df =======================
import numpy as np
import pandas as pd
import random
import math
dict_for_df = {}
for i in ('UserId','ItemId','Rating'):
dict_for_df[i] = {}
for j in range(size):
if i=='Rating': val = round( random.random()*5, 1)
else: val = round( random.random() * math.sqrt(size/2) )
dict_for_df[i][j] = val # store in a dict
# print(dict_for_df)
df = pd.DataFrame(dict_for_df) # after the loop convert the dict to a dataframe
# print(df.head())
df = df.astype(dtype={'UserId': np.int32, 'ItemId': np.int32, 'Rating': np.float32})
# df = df.astype(dtype={'UserId': np.int64, 'ItemId': np.int64, 'Rating': np.float64})
## remove doubles -----
df.drop_duplicates(subset=['UserId','ItemId'], keep='first', inplace=True)
## show -----
print(df.info())
print(df.head())
return df
# =======================
df = randDf()