按照百分比取出數據的去極值方法

去極值的方法,能夠用均值加n倍的方差,來過濾,也能夠用中位數加上下範圍來過濾。如聚寬就提供了winsorize和winsorize_med等方法。python

但我總以爲不合心意,第一,這個過程原本就是須要不斷調整參數的,最好可以按照必定步長來取數據,逐條顯示取出數據的數量,佔比,方差等。此外,參數最好指定數據的百分比,用戶只要指定百分比,就可以得到相應的數據。基於此,設計了一個函數。函數

from pandas import Series, DataFrame
from jqfactor import winsorize_med
def data_dist(data,step=0.1,maxstep=1,outratio=0.9): #以中位數爲中心,數據的分佈
    print("數據分佈,以中位數爲中心,默認步長0.1,經過step參數指定,max指定最大step,outratio指定輸出百分比(0.9)")
    med=data[0].median()
    d=max(data[0].max()-med,med-data[0].min())  #最大幅度
    f=step    
    out=None
    while(f<maxstep):
        d2=data[(data[0]<med+f*d) & (data[0]>med-f*d)]
        print("%.2f %.2f%% %d var:%.2f"%(f,len(d2)*100.0/len(data),len(d2),d2[0].std()/med))
        if len(d2)*1.0/len(data)>=outratio and out is None:
            out=d2.copy(deep=False)
        f+=step
    return out

這個方法融交互和獲取數據於一體,能夠一邊交互測試,一邊設定參數,很python!測試

取廣晟有色1000天的成交量分析,看看效果spa

arr=get_bars("600259.XSHG", count=1000, unit='1d',fields=['date', 'high','low','volume'],end_dt="2018-12-31")
vol=DataFrame(arr["volume"])
o=data_dist(vol,step=0.01,maxstep=0.5,outratio=0.8)
vol.plot()
o.plot()
print("%d"%(vol.median()))
print("%d"%(vol.mean()))
print("%d"%(o.mean()))

把dataframe傳遞進去就能夠了,默認以中位數爲中心,中位數到上下限的最大距離爲參考,以指定步長爲上下界,取出數據。設計

image

能夠看出,按80%取出的數據,比原始數據要更加集中,中心點也更加合理blog

image

相關文章
相關標籤/搜索