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]])
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.
Es ging darum, jeden Schlüssel in einen Index umzuwandeln und jeden Wert und diese Indizes als Liste zu speichern.
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
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.
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