2012-12-26 25 views
5

Tôi đang tìm một cách tốt để lưu trữ và sử dụng xác suất có điều kiện trong python.Xác suất nhân tensor bằng cách sử dụng pandas.DataFrame

Tôi đang nghĩ đến việc sử dụng khung dữ liệu pandas. Nếu xác suất có điều kiện của một số XP(X=A|P1=1, P2=1) = 0.2, P(X=B|P1=2, P2=1) = 0.9 vv, tôi sẽ sử dụng 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 

và đưa ra xác suất biên của P1P2 như Dòng

1 0.4 
2 0.6 
Name: P1 

1 0.7 
2 0.3 
Name: P2 

Tôi muốn để có được những Hàng loạt xác suất biên của X, tức là chuỗi

A 0.602 
B 0.398 
Name: X 
.210

tôi có thể có được những gì tôi muốn bằng cách

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" 

nhưng điều này là không dễ dàng khái quát hóa để phụ thuộc hơn, không đối xứng giữa xs đầu tiên với level và thứ hai mà không trông lạ và như thường lệ khi làm việc với pandas tôi m rất chắc chắn rằng có một giải pháp tốt hơn bằng cách sử dụng thủ thuật và phương pháp của nó.

Có phải là pandas một công cụ tốt cho điều này, và cách tốt nhất để thực hiện phép tính này là sản phẩm tensor được lập chỉ mục, trong pandas?

Trả lời

0

Một cách để vectorize là truy cập các giá trị trong Series P1 và P2 bằng cách lập chỉ mục với một mảng nhãn.

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 

(Cách khác, truy cập vào các giá trị của một MultiIndex mà không đặt lại chỉ mục như sau.)

In [38]: P1[X.index.get_level_values("P1")].values 
Out[38]: array([ 0.4, 0.4, 0.6, 0.6]) 
Các vấn đề liên quan