Java 分位点(分位值)计算方式
java 分位点(分位值)计算
有一个需求
给出一段时间的pb(平均市净率),然后选择这段时间的某一天,计算这天的分位值.
很简单的一个数理统计学科的问题,对于毕业多年的学渣还是有必要记录以下相关问题的计算方法.
例如:
取最近1.1-1.10号的pb分别是(1,1,2,2,3,3,4,4,5,5),我传入1.1号
那么返回我值是:0%,如果传入1.10号返回100%
那么怎么建立数学模型呢?
注:分位值说明:
pn为n分位值。表示被调查群体中有n%的数据小于此数值。n的大小反应市场的不同水平,通常使用p10、p25、p50、p75、p90来表示市场的不同水平。
- 10分位值:表示有10%的数据小于此数值,反映市场的低端水平。
- 25分位值:表示有25%的数据小于此数值,反映市场的较低端水平。
- 50分位值:表示有50%的数据小于此数值,反映市场的中等水平。
- 75分位值:表示有75%的数据小于此数值,反映市场的较高端水平。
- 90分位值:表示有90%的数据小于此数值,反映市场的高端水平。
例:求下例一组数据的25分位,50分位,75分位值:
a=【65 23 55 78 98 54 88 90 33 48 91 84】
解:
方法一:
1、先把上面12个数按从小到大排序
1 23
2 33
3 48
4 54
5 55
6 65
7 78
8 84
9 88
10 90
11 91
12 98
2、12个数有11个间隔,每个四分位间11/4=2.75个数
3、
① 计算25分位:
第1个四分位数为上面12个数中的第1+2.75=3.75个数
指第3个数对应的值48及第3个数与第4个数之间的0.75位置处,即:48+(0.75)*(54-48)=52.5 (52.5为25分位值)。
② 计算50分位:
第2个四分位数为上面12个数中的第1+2.752=6.5个数
指第6个数对应的值65及第6个数与第7个数之间的0.5位置处,即:65+(0.5)(78-65)=71.5 (71.5为50分位值)。
【中位值也可以用一种很简单的方法计算,按从小到大排列后:
若数组中数的个数为奇数,则最中间那个数对应的值则为中位值;
若数组中数的个数为偶数,则取中间两个数值的平均值则为中位值,如上78+65)/2=71.5】
③ 计算75分位:
第3个四分位数为上面12个数中的第1+2.753=9.
指第9个数对应的值88及第9个数与第10个数之间的0.25位置处,即:88+(0.25)(90-88)=88.5 (88.5为75分位值)。
【将1到100分为10等分,则有10个10分位,用以上的方法可计算10分位值和90分位值。(以上实例的p10=34.5,p90=90.9)】
下面用java 代码实现
相关方法
private static double getpercentile(list<double> datalist, double p) { int n = datalist.size(); datalist.sort(new comparator<double>() { //从小到大排序 @override public int compare(double o1, double o2) { if(o1 == null || o2== null){ return 0; } return o1.compareto(o2); } }); double px = p*(n-1); int i = (int)java.lang.math.floor(px); double g = px - i; if(g==0){ return datalist.get(i); }else{ return (1-g)*datalist.get(i)+g*datalist.get(i+1); } }
测试接口
@requestmapping("calcpercentile") @responsebody public r calcpercentile(@param("per") double per){ double[] arrs = {2,4,5,1,3,3,4,1,2,5}; list<double> doublelist = new arraylist<>(); for (double currarr : arrs) { doublelist.add(currarr); } double percentile = getpercentile(doublelist, per); return r.ok().message("查询服务数据"); }
正常输出
输入1也就是100%,正常输出5.0,输入0.5,输出3.0
完成需求
上面的分析是,知道百分位,求百分位对应的数值? 而我们的需求是利用样本时间里面的某个值,求对应的百分位是多少?经过查阅很多资料没有找到相关公式,当然有大佬知道可以提示一下.总归问题还是要解决的. 这边使用的解决方案是,把样本数据分成100个点,求每个百分位对应的数值,然后与样本中的目标数据一 一对比,求其最接近的那个数.就间接取到了目标数据的百分位值
核心代码
java 求百分位数
说明一下
百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。
java代码
public static double percentile(double[] data,double p){ int n = data.length; arrays.sort(data); double px = p*(n-1); int i = (int)java.lang.math.floor(px); double g = px - i; if(g==0){ return data[i]; }else{ return (1-g)*data[i]+g*data[i+1]; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
下一篇: python序列(八)列表推导式实列
推荐阅读
-
java 给数值添加千分位。
-
java 两个int类型的数据相除并输出百分号保留两位有效数字
-
编程初学者入门7_公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。(复习冒泡排序+C、Java中局部变量不赋值不能使用))
-
Python数据分析:异常值检验的两种方法 -- Z 分数 & 上下分位点(放入自写库,一行代码快速实现)
-
-2 多项式求值 (15 分) 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑ i=0 n (a[i]×x i ) 在x点的值。 函数接口
-
java 给数值添加千分位。
-
Python 分布与并行 三分钟内精确计算π超过2万位
-
C# Unity计算不规则多边形中心点、重心点、点位最小值
-
JAVA数字千分位和小数点的现实代码(处理金额问题)
-
Java 分位点(分位值)计算方式