Empirische Verteilungsfunktion ohne Schleifen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
frevler
User
Beiträge: 1
Registriert: Dienstag 13. Oktober 2020, 17:06

Hallo zusammen. Ich benötige eine Funktion, die mir zu einem eindimensionalen Datensatz in Form eines Arrays die empirische Verteilungsfunktion wiedergibt.
Da das ganze auf große Datenmengen angewandt werden soll, möchte ich tunlichst auf lange Schleifen verzichten.

Eine Funktion, die mir einen einzelnen Wert der empirische Verteilungsfunktion zurückgibt, habe ich bereits ohne Schleife geschrieben:

Code: Alles auswählen

import numpy as np

def emp_Vfkt(x,x_data):
    return len(x_data[x_data<=x])/len(x_data)
Hiermit könnte man jetzt die einzelnen Werte der Verteilungsfunktion berechnen ... mal ein paar Beispielwerte:

Code: Alles auswählen

data = np.array([1,2,2,2,3,3,4,5,6,7,7,7,7,7,7,8])

emp_Vfkt(1,data)
Out[161]: 0.0625

emp_Vfkt(2,data)
Out[162]: 0.25

emp_Vfkt(3,data)
Out[163]: 0.375

Jetzt möchte ich aber einen Array, der die Werte der Verteilungsfunktion von allen Einträgen des Daten-Arrays enthält. Mit einer Schleife habe ich das wie folgt realisiert:

Code: Alles auswählen

import numpy as np

def emp_Vfkt(x):
    y = []
    for i in x:
        y += [len(x[x<=i])/len(x)]
    return np.array(y)
Hiermit erhalte ich mein gewünschtes Ergebnis:

Code: Alles auswählen

data = np.array([1,2,2,2,3,3,4,5,6,7,7,7,7,7,7,8])

emp_Vfkt(data)
Out[172]: 
array([0.0625, 0.25  , 0.25  , 0.25  , 0.375 , 0.375 , 0.4375, 0.5   ,
       0.5625, 0.9375, 0.9375, 0.9375, 0.9375, 0.9375, 0.9375, 1.    ])
Für große Datenmengen dauert dies allerdings viiiiiieeeel zu lange. Ich glaub auch, dass eine schnelle Lösung im Prinzip recht simpel sein müsste .... gerade frevel ich aber nur rum und hab ein Brett vorm Kopf.

Hoffe mir kann hier jemand weiterhelfen. Viele Grüße :)
Antworten