按照百分比取出数据的去极值方法
去极值的方法,可以用均值加n倍的方差,来过滤,也可以用中位数加上下范围来过滤。如聚宽就提供了winsorize和winsorize_med等方法。
但我总觉得不合心意,第一,这个过程本来就是需要不断调整参数的,最好能够按照一定步长来取数据,逐条显示取出数据的数量,占比,方差等。此外,参数最好指定数据的百分比,用户只要指定百分比,就能够获得相应的数据。基于此,设计了一个函数。
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天的成交量分析,看看效果
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传递进去就可以了,默认以中位数为中心,中位数到上下限的最大距离为参考,以指定步长为上下界,取出数据。
可以看出,按80%取出的数据,比原始数据要更加集中,中心点也更加合理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2017-08-27 Flask传递中文URL时的问题
2010-08-27 反复
2006-08-27 克服惰性,多尝试
2005-08-27 Excel