2017-11-03 2 views
0

meine Frage ist:Python: Berechnen Sie Mittelwert und sd der Normalverteilung in intervall

ich ein Intervall/mehrere Intervalle haben, können sagen:

[0;0.3] [0.3;0,8] [0.8;1]

In jedem Intervall I eine Normalverteilung haben , Probenahme mit truncnorm() and .rvs().

So habe ich mehrere "Normalverteilungen" auf der X-Achse.

Aber die Truncnorm-Methode erwartet den Mittelwert und die sd der Verteilung innerhalb des Intervalls. Wie kann ich den Mittelwert und die sd eines bestimmten Intervalls in Python berechnen ???

numpy.mean() f.e. scheint nicht zu funktionieren. Und ich bekomme seltsame Ergebnisse, also denke ich, dass mein Mittelwert/sd falsch berechnet wird, bevor ich die truncnorm ausführe.

Danke Jungs

* Edit: Für andere Spalten, in denen die Intervalle nicht so klein sind, funktioniert es gut. Gibt es eine Grenze dafür, wie klein das Intervall sein kann? Der Fehler tritt z.B. in einem Intervall von

[0,12; 0,17] -> Wert 0,0937818650369 (out of range) *

Ja sicher. Was ich tun möchte ist: Ich habe ein Intervall, sample mir einen Wert, der zwischen der Grenze dieses Intervalls und einfach in einer Art abgeschnittenen Normalverteilung ist. Ich habe eine zusätzliche Spalte und es sollte den Wert, den ich durch eine Stichprobe in einer anderen Spalte erhalte, schreiben. Zum Beispiel: Intervall [0,2; 0,6] -> Probenwert 0,343433 Ich glaube, ich eine Lösung gefunden:

truncnorm().stats() 

Aber ich weiß nicht, warum, aber für die Parameter gebe ich die

truncnorm() 

Funktion, fast 50% der Werte, die ich erhalte, liegen außerhalb der Grenzen. Was mache ich falsch? Hier

ist der Code (ein kurzer Teil des Codes)

 convert_cat=(name_convert_column,name_convert_column,_tabelle,name_convert_column,_tabelle,_tabelle,name_convert_column) 
    drop_view=(name_convert_column) 
    calculate=(name_convert_column,name_convert_column,name_convert_column,name_convert_column,name_convert_column,_tabelle,name_convert_column,name_convert_column) 
    cur.execute("CREATE VIEW convert_cat_%s (quotient, %s, rnum) AS SELECT (COUNT(*)/(SELECT COUNT(*) FROM %s)) as quotient, %s, row_number() over (order by (COUNT(*)/(SELECT COUNT(*) FROM %s)) desc) as rnum FROM  %s GROUP BY %s ORDER BY quotient desc" %convert_cat) 
    cur.execute("Select b.ID,a.unten,a.oben, a.mean, a.sd FROM(SELECT t3.RNUM, t3.%s, lag(t3.com_Pr,1,0) OVER (order by rnum asc) as unten , t3.com_PR as oben, ((t3.com_PR +(lag(t3.com_Pr,1,0) OVER (order by rnum asc)))/2) as MEAN, ((t3.com_PR-(lag(t3.com_Pr,1,0) OVER (order by rnum asc)))/6) AS SD FROM(SELECT t1.rnum, t1.%s , SUM(t2.quotient) as com_Pr FROM CONVERT_CAT_%s t1 INNER JOIN CONVERT_CAT_%s t2 ON t1.rnum >= t2.rnum group by t1.rnum, t1.%s, t1.quotient ORDER BY RNUM asc) t3) a INNER JOIN %s b ON b.%s = a.%s order by ID asc" %calculate) 
    _content_category = cur.fetchall() 
    add_category_number_column = (_tabelle, name_convert_column) 
    cur.execute("ALTER TABLE %s ADD %s_category NUMBER(15,14)" % add_category_number_column) 
    x=0 
    for ID in _content_category: 
     id = _content_category[0] 
     id_category = [j[0] for j in _content_category] 
     unten_category = [j[1] for j in _content_category] 
     oben_category = [j[2] for j in _content_category] 
     #mean_category = [j[3] for j in _content_category] 
     sd_category = [j[4] for j in _content_category] 
     mean, var = truncnorm.stats(unten_category[x], oben_category[x], moments='mv') 
     # sd = np.sqrt(var) 
     X = get_truncated_normal(mean= mean, sd=sd_category[x], low=unten_category[x], upp=oben_category[x]) 
     update_cells_value = float(X.rvs(1)) 
     category = (_tabelle, name_convert_column,update_cells_value,id_category[x]) 
    cur.execute("UPDATE %s SET %s_category = %s WHERE ID=%s" % category) 

     x += 1 

Ich versuchte, mittleren und sd in der SQL-Abfrage zu berechnen mit

1) ((t3.com_PR +(lag(t3.com_Pr,1,0) OVER (order by rnum asc)))/2) as MEAN 
2) ((t3.com_PR-(lag(t3.com_Pr,1,0) OVER (order by rnum asc)))/6) AS SD 

und mit truncnorm().stats() Funktion. Es scheint, dass, bevor sie mit der Funktion Statistik, sind das Ergebnis werden immer noch schlechter und die Werte noch außerhalb der Reichweite dann ...

+2

Können Sie etwas minimalen Code zu Ihrem Problem teilen? – Sosel

+0

Ich habe :) Es ist in der ersten Post jetzt ... – peterlustig

Antwort

0

Trotz ich Ihr Beispiel nicht ausführen können, ein mögliches Problem:

for ID in _content_category: 
    id = _content_category[0] 
    ... 

Macht besser sein:

for ID in _content_category: 
    id = _content_category[ID] 
    ... 
Verwandte Themen