2012-12-26 17 views
5

का उपयोग कर गुणन मैं एक अच्छा तरीका है की दुकान और अजगर में सशर्त संभावनाओं का उपयोग करने के लिए देख रहा हूँ।संभावना टेन्सर pandas.DataFrame

मैं एक pandas dataframe का उपयोग कर के बारे में सोच रहा हूँ। कुछ X की सशर्त संभावनाओं P(X=A|P1=1, P2=1) = 0.2, P(X=B|P1=2, P2=1) = 0.9 आदि कर रहे हैं, मैं 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 

का उपयोग करें और सीरीज के रूप में P1 और P2 के सीमांत संभावनाओं को देखते हुए हैं

1 0.4 
2 0.6 
Name: P1 

1 0.7 
2 0.3 
Name: P2 

मैं प्राप्त करने के लिए चाहते हैं X की सीमांत संभावनाओं की श्रृंखला, यानी श्रृंखला

A 0.602 
B 0.398 
Name: X 
,210

मैं क्या मैं द्वारा

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" 

चाहते हैं, लेकिन यह आसानी से और अधिक निर्भरता के लिए generalizable नहीं है प्राप्त कर सकते हैं, पहले xslevel साथ और दूसरा एक के बिना के बीच विषमता अजीब लग रहा है और हमेशा की तरह जब pandas के साथ काम कर मैं बहुत यकीन है कि एक बेहतर समाधान है कि वहाँ यह चाल और तरीकों का उपयोग कर रहा हूँ।

pandas इसके लिए एक अच्छा उपकरण है, क्या मुझे अपने डेटा को किसी अन्य तरीके से प्रस्तुत करना चाहिए, और यह गणना करने के लिए सबसे अच्छा तरीका क्या है, जो अनिवार्य रूप से एक अनुक्रमित टेंसर उत्पाद है, pandas में?

उत्तर

0

एक तरह से vectorize करने के लिए लेबल की एक सरणी के साथ का अनुक्रमण द्वारा सीरीज P1 और P2 में मानों तक पहुंच है।

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 

(वैकल्पिक रूप से, सूचकांक को रीसेट इस प्रकार के बिना एक MultiIndex के मूल्यों का उपयोग।)

In [38]: P1[X.index.get_level_values("P1")].values 
Out[38]: array([ 0.4, 0.4, 0.6, 0.6]) 
संबंधित मुद्दे