En supposant qu'il existe des données de journal qui ont des valeurs hiérarchiquement comme des clés telles que l'utilisateur, l'élément comme indiqué ci-dessous (Ci-après, l'élément utilisateur doit être lu selon le cas)
>>> df = pd.DataFrame([['user1','item1',5],['user1','item2',4],['user2','item2',5],['user2','item3',6],['user3','item4',3]], columns=['username','itemname','rate'])
>>> df
username itemname rate
0 user1 item1 5
1 user1 item2 4
2 user2 item2 5
3 user2 item3 6
4 user3 item4 3
Si vous voulez le convertir au format matriciel, vous pouvez écrire en pandas comme suit.
>>> df.groupby(['itemname', 'username']).mean().unstack(fill_value=0).values
array([[5, 0, 0],
[4, 5, 0],
[0, 6, 0],
[0, 0, 3]])
Lorsque ce processus est effectué par des pandas comme décrit ci-dessus, il est nécessaire de conserver toutes les données cibles en tant que DataFrame, et s'il s'agit de données à grande échelle, le processus lui-même entraînera une erreur de mémoire. De plus, si les données elles-mêmes ne tiennent pas déjà dans la mémoire, il est nécessaire de diviser les données dans la mémoire et de les lire, mais il y a un problème qui ne peut pas être fait.
Par conséquent, la motivation pour cette fois est d'effectuer le processus de conversion ci-dessus autre que les pandas.
C'était une histoire de conversion de chaque clé en index et de conservation de chaque valeur et de ces index sous forme de liste.
Convertissez chaque valeur de clé avec le codage d'étiquette comme indiqué ci-dessous.
>>> from sklearn.preprocessing import LabelEncoder
>>> le_username = LabelEncoder()
>>> le_itemname = LabelEncoder()
>>> df['username'] = le_username.fit_transform(df['username'])
>>> df['itemname'] = le_username.fit_transform(df['itemname'])
>>> df
username itemname rate
0 0 0 5
1 0 1 4
2 1 1 5
3 1 2 6
4 2 3 3
Afin de contenir les données sous la forme de quel élément numérique de quel numéro l'utilisateur a quelle valeur, chaque valeur est récupérée sous forme de liste comme suit.
>>> row = df['itemname'].values.tolist()
>>> col = df['username'].values.tolist()
>>> value = df['rate'].values.tolist()
>>> row
[0, 1, 1, 2, 3]
>>> col
[0, 0, 1, 1, 2]
>>> value
[5, 4, 5, 6, 3]
Si vous souhaitez diviser les données et les lire, étendez la liste ici.
Convertissez la liste ci-dessus en une matrice creuse.
>>> from scipy.sparse import coo_matrix
>>> matrix = coo_matrix((value, (row, col)))
>>> matrix
<4x3 sparse matrix of type '<class 'numpy.int64'>' with 5 stored elements in COOrdinate format>
Lorsqu'il a été rendu dense, il est devenu comme suit, et la matrice souhaitée a été obtenue.
>>> matrix.toarray()
array([[5, 0, 0],
[4, 5, 0],
[0, 6, 0],
[0, 0, 3]])
Recommended Posts