2017-06-18 101 views
0

基本上,我將三個指數的價格彙總以確定:平均值,標準偏差以及上限/下限。到現在爲止還挺好。但是,現在我還想找到最低的確定價格,它仍然> =計算出的下限。創建熊貓數據透視表時存儲所有值

我的第一個想法是使用np.min來找到最低的價格 - >這顯然忽視了下限,並沒有用。現在我試圖存儲數據透視表標識的所有值,以找到仍然> =下限的價格。有任何想法嗎?

pivot = pd.pivot_table(temp, index=['A','B','C'],values=['price'], aggfunc=[np.mean,np.std],fill_value=0) 

pivot['lower_limit'] = pivot['mean'] - 2 * pivot['std'] 
pivot['upper_limit'] = pivot['mean'] + 2 * pivot['std'] 

回答

1

首先,合併pivoted[lower_limit]temp。因此,對於temp中的每個price還有一個lower_limit值。

temp = pd.merge(temp, pivoted['lower_limit'].reset_index(), on=ABC) 

然後就可以限制你注意那些行中temp的量,price是> = lower_limit

result = temp.loc[temp['price'] >= temp['lower_limit']].groupby(ABC)['price'].min() 

temp.loc[temp['price'] >= temp['lower_limit']] 

期望的結果可通過計算groupby/min中找到


例如,

import numpy as np 
import pandas as pd 

np.random.seed(2017) 
N = 1000 
ABC = list('ABC') 
temp = pd.DataFrame(np.random.randint(2, size=(N,3)), columns=ABC) 
temp['price'] = np.random.random(N) 
pivoted = pd.pivot_table(temp, index=['A','B','C'],values=['price'], 
         aggfunc=[np.mean,np.std],fill_value=0) 
pivoted['lower_limit'] = pivoted['mean'] - 2 * pivoted['std'] 
pivoted['upper_limit'] = pivoted['mean'] + 2 * pivoted['std'] 

temp = pd.merge(temp, pivoted['lower_limit'].reset_index(), on=ABC) 
result = temp.loc[temp['price'] >= temp['lower_limit']].groupby(ABC)['price'].min() 
print(result) 

產量

A B C 
0 0 0 0.003628 
     1 0.000132 
    1 0 0.005833 
     1 0.000159 
1 0 0 0.006203 
     1 0.000536 
    1 0 0.001745 
     1 0.025713 
+0

驚人!這似乎工作正是我想要爲你的例子 - 不是爲了我的。我得到以下錯誤:'*之後的類型對象參數必須是可迭代的,而不是itertools.imap'可能是因爲A,B,C中的值是日期對象? – Lula

+0

'A','B','C'中的日期對象不會導致這個問題,但是一些迭代可能會導致這個問題。 (請參閱https://stackoverflow.com/q/31166814/190597。)如果這與您的情況看起來並不相似,請發佈'temp.head()。reset_index()。to_dict('list')'。這將向我們展示前幾行'temp'的明確表示。如果我們很幸運,它會讓我們重現你所看到的錯誤。 – unutbu

+0

我錯了 - 您發佈的示例在'A','B'和'C'中重現了不可迭代的 值的錯誤。我在猜測發生錯誤是因爲temp的'A'列的dtype是'datetime64 [ns,UTC]',而'pivoted'的'A'索引 等級是'DatetimeIndex'。無論如何,有一個簡單的解決方法:使用 pivoted ['lower_limit']。reset_index()'而不是使用 'pivoted ['lower_limit']。to_frame()'。我編輯了上面的代碼以顯示我的意思。 'reset_index'會將'A','B','C'索引級別移回到列中。因此合併操作將在 相同的dtypes之間。 – unutbu