[PYTHON] Conversion matricielle d'économie de mémoire des données de journal

Chose que tu veux faire

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]])

problème

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.

Méthode

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.

Conversion d'index

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

liste

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.

Convertir en matrice

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

Conversion matricielle d'économie de mémoire des données de journal
Conversion d'économie de mémoire des données de journal en quantité de caractéristiques de catégorie séquentielle en tenant compte des séries temporelles
Conversion des données de temps en notation 25 heures
Visualisez les données d'exportation du journal Piyo
Pré-traitement des données préfectorales
Sélection des données de mesure
Distribution des valeurs propres de la matrice laplacienne
Visualisation des données par préfecture
Transformée de Fourier des données brutes
Estimation moyenne des données plafonnées
Conversion de type de données d'image [Python]
À propos de la gestion des données d'Anvil-App-Server
Prédiction de probabilité de données déséquilibrées
Informations sur la carte de base à l'aide de la conversion Geotiff Python des données numériques d'élévation
Fichier journal de sortie avec Job (Notebook) de Cloud Pak for Data