Floats in einem Array in ordinale Zahlen umwandeln

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
MLneue
User
Beiträge: 2
Registriert: Samstag 16. März 2019, 20:18

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:

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]
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!
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Reicht nicht einfach * N zu nehmen, und dann in integer zu wandeln? Aus 0.3 wird dann 2*0.3 == 0.6, also 0. Aus 0.6 * 2 = 1.2 eben 1. Der Wert 1.0 muss ggf sonder behandelt werden, oder du sagst halt alles > 0, das reicht dann.

Und genauso für deine anderen Fälle. 0.3 * 7 = 2.1. Also 2.
MLneue
User
Beiträge: 2
Registriert: Samstag 16. März 2019, 20:18

__deets__ hat geschrieben: Sonntag 17. März 2019, 01:16 Reicht nicht einfach * N zu nehmen, und dann in integer zu wandeln? Aus 0.3 wird dann 2*0.3 == 0.6, also 0. Aus 0.6 * 2 = 1.2 eben 1. Der Wert 1.0 muss ggf sonder behandelt werden, oder du sagst halt alles > 0, das reicht dann.

Und genauso für deine anderen Fälle. 0.3 * 7 = 2.1. Also 2.
Danke für deine Antwort!
Ich verstehe die Lösung jetzt auf Anhieb nicht. Meine Werte liegen meistens zwischen -2 und +2 und die möchte ich dann in entweder 2, 5 oder 7 Gruppen aufteilen. Wenn mein Wert bei 1,5 liegt und ich nur 0 oder 1 herausbekommen möchte, dann würde ich durch die o.g. Methode dann 3 herausbekommen oder? Das wäre dann ja nicht zielführend.
Ich habe das Gefühl, dass die Lösung recht einfach ist, aber irgendwie bekomme ich es nicht auf die Kette... Aber es war schon ein neuer Ansatz für mich, also danke schonmal.
Antworten