Wie kann man in Pandas mehrere statistische Verteilungen über alle möglichen Wertekombinationen in einer Spalte ausführePython

Python-Programme
Anonymous
 Wie kann man in Pandas mehrere statistische Verteilungen über alle möglichen Wertekombinationen in einer Spalte ausführe

Post by Anonymous »

Ich versuche, Bins für einen großen Datensatz zu erstellen, sodass die Teilmenge der Daten in jedem Bin gut einer Exponentialverteilung entspricht. Die Grundstruktur der Daten sieht so aus, jedoch mit ~1000 Einzeleinträgen:

Code: Select all

Location = ['CIL', 'BUR', 'SNA', 'PRT'] #a 3-letter code for each unique location data is recorded
TpD = [2.0, 6.5, 32.0, 2.86] #the average number of times per day an event occurs at that location (the independent variable)
Output = [3685, 58492, 285938, 10491] #the total recorded output produced by those events over a year (the dependent variable)

d=pd.DataFrame({'Location':Location, 'TpD':TpD, 'Output':Output})
Für jeden TpD-Wert A möchte ich Folgendes tun:
  • kumulative empirische und exponentielle Verteilungen über den Bereich von A bis zu allen TpD-Werten >A berechnen
  • die K-S-Statistik für diese beiden Verteilungen berechnen
  • wählen Sie den TpD-Wert B aus, der die kleinste K-S-Statistik für den TpD-Wert A erzeugt.
  • erstellen Sie eine neue Spalte im DataFrame, die den Wert B in derselben Zeile/diesem Index wie Wert A auflistet
Ich kann die ersten drei Schritte für den ersten Bin mit dem folgenden Skript ausführen:

Code: Select all

KSS = []
for a in d.TpD_Avg:
Rng = stat.ecdf(d[d['TpD_Avg'].between(0,a)].Output).cdf.quantiles
Emp = stat.ecdf(d[d['TpD_Avg'].between(0,a)].Output).cdf.probabilities
Exp = stat.expon.cdf(Rng, 0, Rng.mean())
KSS.append(stat.kstest(Emp,Exp).statistic)
d['KSS'] = KSS
d.KSS.min()
Allerdings habe ich Probleme mit dem letzten Schritt, den gleichen Prozess für die verbleibenden Bins zu wiederholen. Meine Intuition schlägt vor, eine Methode zu erstellen und sie auf jeden Wert in TpD_Avg anzuwenden, aber ich schaffe es scheinbar nicht, den Inhalt der Methode zum Laufen zu bringen. Ich habe das folgende Skript ausprobiert:

Code: Select all

for a in d.TpD_Avg:

test = pd.DataFrame()
test['TpD_Avg'] = d['TpD_Avg'].drop_duplicates().sort_values(ascending=True).reset_index(drop=True)
KSS = []
bins = []

for b in test.TpD_Avg:
Rng = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.quantiles
Emp = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.probabilities
Exp = stat.expon.cdf(Rng, 0, Rng.mean())
KSS.append(stat.kstest(Emp,Exp).statistic)

test['KSS'] = KSS
bins.append(test[test.KSS.min()].TpD_Avg)

d['bins'] = bins
...aber das erzeugt sowohl eine Stichprobengrößenwarnung für die drei Zeilen, die die Verteilungen generieren und einen Schlüsselfehler in der letzten Zeile.
Einerseits wäre es schön, wenn ich die spezifischen Fehler in diesem Skript beheben könnte, damit ich weiß, was ich falsch mache. Andererseits muss es sicherlich eine Möglichkeit geben, dies zu tun, für die keine for-Schleifen erforderlich sind. Aus Verzweiflung griff ich auf For-Schleifen zurück, nachdem ich allein mit Pandas wahrscheinlich ein Dutzend verschiedener Befehlssätze erfolglos ausprobiert hatte, bevor ich die ersten drei Schritte, wie im zweiten Codeblock gezeigt, durchführte. Für Vorschläge zu beiden Ansätzen wäre ich dankbar.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post