Erstellen einer Matrix ergibt einen Fehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fischer-klaus3
User
Beiträge: 27
Registriert: Donnerstag 17. September 2020, 08:07

Hallo,

ich bin gerade dabei eine Sprächlichkeitsmatrix zu erstellen. Leider erhalte ich einen Fehler. Woran liegt dieser und wie verbessere ich es?
Zunächst entferne ich alle User die weniger als 2 Produkte haben. Anschließend splitte ich mit 0,1% in Train und Test den Dataframe auf. Und diese gesplitten Dataframes gebe ich danach in die Matrix Generierung und hier tritt auch der Fehler auf.

Code: Alles auswählen

import numpy as np
import pandas as pd
import scipy.sparse as sp

d = {'userid': [0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5],
     'itemid': [715, 845, 98, 12324, 85, 715, 2112, 85, 2112, 852, 102, 85, 2112, 852, 98, 652]}
df = pd.DataFrame(data=d)
print(df)

def remove_purchase_cleanded(df, value):
    return df[df['userid'].map(df['userid'].value_counts()) > value].reset_index(drop=True)

df_new = remove_purchase_cleanded(df, 2)   
print(df_new) 

def splitter(df, split):
    indices = np.random.permutation(len(df))
    test_size = int(len(df) * split)
    test_indices = indices[:test_size]
    train_indices = indices[test_size:]
    return df.iloc[train_indices], df.iloc[test_indices]


def generate_matrix(df_main, dataframe):
    mat = sp.dok_matrix((df_main.shape[0], len(df_main['itemid'].unique())), dtype=np.float32)
    for userid, itemid in zip(dataframe['userid'], dataframe['itemid']):
        mat[userid, itemid] = 1.0 # here is the error

train, test = splitter(df_new, 0.1)

train = train.sort_values(by=['userid']).reset_index(drop=True)
test = test.sort_values(by=['userid']).reset_index(drop=True)
print(train)
print(test)

train_mat = generate_matrix(df_new, train) # here is the error

test_mat = generate_matrix(df_new, test)

# The error
IndexError: column index (98) out of range
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Werte in userid und itemid haben nichts mit der Länge dieser Vektoren zu tun.
Statt len brauchst Du max.
Antworten