[PYTHON] Speichersparende Matrixkonvertierung von Protokolldaten

Was du machen willst

Angenommen, es gibt Protokolldaten mit hierarchischen Werten als Schlüssel, z. B. Benutzer, Element, wie unten gezeigt (Im Folgenden sollte das Benutzerelement je nach Fall gelesen werden.)

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

Wenn Sie dies in das Matrixformat konvertieren möchten, können Sie wie folgt in Pandas schreiben.

>>> df.groupby(['itemname', 'username']).mean().unstack(fill_value=0).values
array([[5, 0, 0],
       [4, 5, 0],
       [0, 6, 0],
       [0, 0, 3]])

Problem

Wenn dieser Prozess von Pandas wie oben beschrieben ausgeführt wird, müssen alle Zieldaten als DataFrame beibehalten werden. Wenn es sich um umfangreiche Daten handelt, führt der Prozess selbst zu einem Speicherfehler. Wenn die Daten selbst noch nicht in den Speicher passen, müssen die Daten in den Speicher aufgeteilt und gelesen werden. Es besteht jedoch das Problem, dass dies nicht möglich ist.

Daher besteht die Motivation für diese Zeit darin, den oben genannten Konvertierungsprozess außer Pandas durchzuführen.

Methode

Es ging darum, jeden Schlüssel in einen Index umzuwandeln und jeden Wert und diese Indizes als Liste zu speichern.

Indexkonvertierung

Konvertieren Sie jeden Schlüsselwert mit Label Encoding wie unten gezeigt.

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

Aufführen

Um die Daten in Form eines Nummernelements von welchem Nummernbenutzer mit welchem Wert zu speichern, wird jeder Wert im Listenformat wie folgt abgerufen.

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

Wenn Sie die Daten teilen und lesen möchten, erweitern Sie die Liste hier.

In Matrix konvertieren

Konvertieren Sie die obige Liste in eine dünne Matrix.

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

Wenn es dicht gemacht wurde, wurde es wie folgt und die gewünschte Matrix wurde erhalten.

>>> matrix.toarray()
array([[5, 0, 0],
       [4, 5, 0],
       [0, 6, 0],
       [0, 0, 3]])

Recommended Posts

Speichersparende Matrixkonvertierung von Protokolldaten
Speichersparende Konvertierung von Protokolldaten in die Merkmalsmenge der sequentiellen Kategorie unter Berücksichtigung von Zeitreihen
Konvertierung von Zeitdaten in 25-Uhr-Notation
Visualisieren Sie die Exportdaten des Piyo-Protokolls
Vorverarbeitung von Präfekturdaten
Auswahl der Messdaten
Verteilung der Eigenwerte der Laplace-Matrix
Visualisierung von Daten nach Präfektur
Fourier-Transformation von Rohdaten
Durchschnittliche Schätzung der begrenzten Daten
Konvertierung von Bilddatentypen [Python]
Über die Datenverwaltung von Amboss-App-Server
Wahrscheinlichkeitsvorhersage von unausgeglichenen Daten
Basiskarteninformationen mithilfe der Python-Geotiff-Konvertierung numerischer Höhendaten
Protokolldatei mit Job (Notizbuch) von Cloud Pak for Data ausgeben