Floats in einem Array in ordinale Zahlen umwandeln
Verfasst: Samstag 16. März 2019, 20:32
Hallo zusammen!
Ich studiere Wirtschaftswissenschaften, bin aber bei meiner Bachelorarbeit in den Bereich Informatik gerutscht. Da habe ich mir versucht etwas Wissen anzueignen, aber an einem Problem beisse ich mir die Zähne aus.
Ich erstelle mithilfe von make_classification von scikitlearn Datasets. Die enthalten Floats in der Matrix X mit den Datensätzen als Zeilen und den Attributen als Spalten. Zusätzlich habe ich die Klassen im Vektor y.
Jetzt ist die Frage, wie ich X so transformieren kann, dass entweder die Hälfte der Werte oder alle Werte ordinal skaliert, also Integers werden. Ich habe es bereits mit np.place versucht, aber das hat nicht funktioniert. Ganz händisch mit IF-Funktionen funktioniert es zwar, aber ich möchte circa 3500 Datasets mit teilweise je 300 000 Datensätzen erzeugen und dafür ist diese Methode zu langsam.
Hinzu kommt, dass ich wählen möchte, welche ordinalen Werte die Spalte annimmt. Und zwar entweder binär, 5 oder 7 Werte für die Lickert-Skalen. Das versuche ich über Quantile zu machen, aber es funktioniert einfach nicht.
Das ist mein abgespeckter Code:
Ich bin leider etwas verzweifelt und Google war bisher nicht mein Freund. Ich kenne mich mit den Fachbegriffen aber auch nicht so aus. Wenn mir jemand helfen könnte wäre ich sehr dankbar!
Ich studiere Wirtschaftswissenschaften, bin aber bei meiner Bachelorarbeit in den Bereich Informatik gerutscht. Da habe ich mir versucht etwas Wissen anzueignen, aber an einem Problem beisse ich mir die Zähne aus.
Ich erstelle mithilfe von make_classification von scikitlearn Datasets. Die enthalten Floats in der Matrix X mit den Datensätzen als Zeilen und den Attributen als Spalten. Zusätzlich habe ich die Klassen im Vektor y.
Jetzt ist die Frage, wie ich X so transformieren kann, dass entweder die Hälfte der Werte oder alle Werte ordinal skaliert, also Integers werden. Ich habe es bereits mit np.place versucht, aber das hat nicht funktioniert. Ganz händisch mit IF-Funktionen funktioniert es zwar, aber ich möchte circa 3500 Datasets mit teilweise je 300 000 Datensätzen erzeugen und dafür ist diese Methode zu langsam.
Hinzu kommt, dass ich wählen möchte, welche ordinalen Werte die Spalte annimmt. Und zwar entweder binär, 5 oder 7 Werte für die Lickert-Skalen. Das versuche ich über Quantile zu machen, aber es funktioniert einfach nicht.
Das ist mein abgespeckter Code:
Code: Alles auswählen
##Werte des erstellten Datasets in ordinalskalierte Werte umwandeln:
#für jede in "auspraegungordinal" definierte Ausprägungsmenge werden
#neue Datasets X erzeugt:
for a in auspraegungenordinal[1:]:
i=1
M=X
#Durchlaufen der ausgewählten Spalten über folgende Schleife:
while i < attribut:
#Vektor der Spalte i aus X bzw. M definieren
alt = M[:, i]
neu = np.zeros_like(alt)
#Jeden Wert in Vektor "neu" durch einen neuen Wert ersetzen
quantnull=np.quantile(alt, 0)
quantfunfzig=np.quantile(alt, 0.5)
quanteinfunftel=np.quantile(alt, 0.2)
quantzweifunftel=np.quantile(alt, 0.4)
quantdreifunftel=np.quantile(alt, 0.6)
quantvierfunftel=np.quantile(alt, 0.8)
quanteinsiebtel=np.quantile(alt, 1/7)
quantzweisiebtel=np.quantile(alt, 2/7)
quantdreisiebtel=np.quantile(alt, 3/7)
quantviersiebtel=np.quantile(alt, 4/7)
quantfunfsiebtel=np.quantile(alt, 5/7)
quantsechssiebtel=np.quantile(alt, 6/7)
quantalle=np.quantile(alt, 1)
#Zähler für den neuen Wert
if a==2:
np.place(neu, alt==np.logical_and(alt>=quantfunfzig, alt<quantalle), 1)
elif a==5:
np.place(neu, alt==np.logical_and(alt>=quantnull, alt<quanteinfunftel), 1)
np.place(neu, alt==np.logical_and(alt>=quanteinfunftel, alt<quantzweifunftel), 2)
np.place(neu, alt==np.logical_and(alt>=quantzweifunftel, alt<quantdreifunftel), 3)
np.place(neu, alt==np.logical_and(alt>=quantdreifunftel, alt<quantvierfunftel), 4)
np.place(neu, alt==np.logical_and(alt>=quantvierfunftel, alt<quantalle), 5)
elif a==7:
np.place(neu, alt==np.logical_and(alt>=quantnull, alt<quanteinsiebtel), 1)
np.place(neu, alt==np.logical_and(alt>=quanteinsiebtel, alt<quantzweisiebtel), 2)
np.place(neu, alt==np.logical_and(alt>=quantzweisiebtel, alt<quantdreisiebtel), 3)
np.place(neu, alt==np.logical_and(alt>=quantdreisiebtel, alt<quantviersiebtel), 4)
np.place(neu, alt==np.logical_and(alt>=quantviersiebtel, alt<quantfunfsiebtel), 5)
np.place(neu, alt==np.logical_and(alt>=quantfunfsiebtel, alt<quantsechssiebtel), 6)
np.place(neu, alt==np.logical_and(alt>=quantsechssiebtel, alt<quantalle), 7)
#Ersetzen der ursprünglichen Spalte in X durch die neue, ordinale Spalte
M[:, i] = neu.astype(int)
#Fortsetzen mit übernächster Spalte, damit 50% der Daten ordinal sortiert werden.
i=int(i+(1/per))
df = df.append({'Stichprobenanzahl': stichprobe,
'Attribute':attribut,
'Klassen':klasse,
'Clusters':cluster,
'Flips':flip,
'Klassenseparation':klassensep,
'Gewicht':gewicht,
'Anteil_ordinal':per,
'Auspraegungen_ordinal':a,
'Anteil_fehlende_Werte':missing,
'Gespeichert_in_Nummer':z
}, ignore_index=True)
D = np.c_[y,M]