Seite 1 von 1

Erstellen einer Matrix ergibt einen Fehler

Verfasst: Samstag 12. Dezember 2020, 12:49
von fischer-klaus3
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

Re: Erstellen einer Matrix ergibt einen Fehler

Verfasst: Sonntag 13. Dezember 2020, 13:26
von Sirius3
Die Werte in userid und itemid haben nichts mit der Länge dieser Vektoren zu tun.
Statt len brauchst Du max.