2012-12-26 17 views
5

Poszukuję dobrego sposobu na przechowywanie i używanie warunkowych prawdopodobieństw w pythonie.Mnożenie tensora prawdopodobieństwa za pomocą pandas.DataFrame

Zastanawiam się, czy użyć ramki danych pandas. Jeśli warunkowe prawdopodobieństwa jakiegoś XP(X=A|P1=1, P2=1) = 0.2, P(X=B|P1=2, P2=1) = 0.9 itd, chciałbym użyć dataframe

  A B 
P1 P2   
1 1 0.2 0.8 
    2 0.5 0.5 
2 1 0.9 0.1 
    2 0.9 0.1 

i podane marginalnych prawdopodobieństw P1 i P2 jako Series

1 0.4 
2 0.6 
Name: P1 

1 0.7 
2 0.3 
Name: P2 

Chciałbym, by otrzymać Seria marginalnych prawdopodobieństw X, czyli seria

A 0.602 
B 0.398 
Name: X 

mogę dostać to, co chcę przez

X = sum(
    sum(
     X.xs(i, level="P1")*P1[i] 
     for i in P1.index 
     ).xs(j)*P2[j] 
    for j in P2.index 
    ) 
X.name="X" 

ale nie jest łatwo uogólnić na większą zależności, asymetria pomiędzy pierwszym xs z level a drugi bez wygląda dziwnie i jak zwykle przy pracy z pandas I Jestem pewien, że istnieje lepsze rozwiązanie, wykorzystujące jego sztuczki i metody.

Czy jest to dobre narzędzie do tego, czy powinienem reprezentować moje dane w inny sposób i jaki jest najlepszy sposób wykonania tych obliczeń, który jest w istocie indeksowany tensor produktu, w pandas?

Odpowiedz

0

Jednym ze sposobów na wektorowanie jest dostęp do wartości z serii P1 i P2 poprzez indeksowanie za pomocą tablicy etykiet.

In [20]: df = X.reset_index() 

In [21]: mP1 = P1[df.P1].values 

In [22]: mP2 = P2[df.P2].values 

In [23]: mP1 
Out[23]: array([ 0.4, 0.4, 0.6, 0.6]) 

In [24]: mP2 
Out[24]: array([ 0.7, 0.3, 0.7, 0.3]) 

In [25]: mp = mP1 * mP2 

In [26]: mp 
Out[26]: array([ 0.28, 0.12, 0.42, 0.18]) 

In [27]: X.mul(mp, axis=0) 
Out[27]: 
     A  B 
P1 P2    
1 1 0.056 0.224 
    2 0.060 0.060 
2 1 0.378 0.042 
    2 0.162 0.018 

In [28]: X.mul(mp, axis=0).sum() 
Out[28]: 
A 0.656 
B 0.344 

In [29]: sum(
    sum(
    X.xs(i, level="P1")*P1[i] 
    for i in P1.index 
    ).xs(j)*P2[j] 
    for j in P2.index 
    ) 
Out[29]: 
A 0.656 
B 0.344 

(Alternatywnie, dostęp do wartości w MultiIndex bez zerowania wskaźnika w sposób następujący.)

In [38]: P1[X.index.get_level_values("P1")].values 
Out[38]: array([ 0.4, 0.4, 0.6, 0.6]) 
Powiązane problemy