diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/screen/impl/PartyMemberLeadServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/screen/impl/PartyMemberLeadServiceImpl.java index b1cecb92bb..79868496d1 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/screen/impl/PartyMemberLeadServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/screen/impl/PartyMemberLeadServiceImpl.java @@ -77,7 +77,7 @@ public class PartyMemberLeadServiceImpl implements PartyMemberLeadService { * @date 2020/8/20 6:06 下午 */ public String getRatio(Double d){ - BigDecimal bigDecimal = new BigDecimal(d * NumConstant.ONE_HUNDRED); + BigDecimal bigDecimal = new BigDecimal(d); return bigDecimal.setScale(NumConstant.TWO, BigDecimal.ROUND_HALF_UP).toPlainString().concat(ScreenConstant.RATIO); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java index 01258d0f45..d919b2470f 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java @@ -22,7 +22,7 @@ public class DoubleScoreCalculator extends ScoreCalculator { this.minScore = minScore; this.maxScore = maxScore; this.correlation = correlation; - this.prepare(); + this.prepare4SourceArray(); } public DoubleScoreCalculator(List sourceArray, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { @@ -30,7 +30,28 @@ public class DoubleScoreCalculator extends ScoreCalculator { this.minScore = minScore; this.maxScore = maxScore; this.correlation = correlation; - this.prepare(); + this.prepare4SourceArray(); + } + + /** + * 初始化基于边界值的整数分值计算 + * @param minSourceValue 左边界值 + * @param maxSourceValue 右边界值 + * @param minScore 分值区间的左边界 + * @param maxScore 分值区间的右边界 + * @param correlation 相关性 + */ + public DoubleScoreCalculator(Double minSourceValue, Double maxSourceValue, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { + BigDecimal minSourceValueBD = new BigDecimal(minSourceValue); + BigDecimal maxSourceValueBD = new BigDecimal(maxSourceValue); + + this.minScore = minScore; + this.maxScore = maxScore; + this.minValue = minSourceValueBD; + this.maxValue = maxSourceValueBD; + this.correlation = correlation; + prepare4BoundaryValue(); + System.out.println("最小值:"+minScore+";最大值:"+maxScore); } @Override diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java index 98f837ab7e..2114eee59e 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java @@ -10,9 +10,9 @@ import java.util.List; public class IntegerScoreCalculator extends ScoreCalculator { /** - * 初始化整数分值计算 + * 初始化基于原数组的整数分值计算 * ☆☆☆ 务必在该构造方法最后调用父类的prepare()方法 ☆☆☆ - * @param sourceArray 数据所在的数组 + * @param sourceArray 源数据完整数组 * @param minScore 分值区间的左边界 * @param maxScore 分值区间的右边界 * @param correlation 相关性 @@ -22,17 +22,44 @@ public class IntegerScoreCalculator extends ScoreCalculator { this.minScore = minScore; this.maxScore = maxScore; this.correlation = correlation; - this.prepare(); + prepare4SourceArray(); System.out.println("最小值:"+minScore+";最大值:"+maxScore); - } + /** + * 初始化基于原数组的整数分值计算 + * @param sourceList 源数据完整列表 + * @param minScore 分值区间的左边界 + * @param maxScore 分值区间的右边界 + * @param correlation 相关性 + */ public IntegerScoreCalculator(List sourceList, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { this.sourceArrary = sourceList.toArray(); this.minScore = minScore; this.maxScore = maxScore; this.correlation = correlation; - this.prepare(); + prepare4SourceArray(); + System.out.println("最小值:"+minScore+";最大值:"+maxScore); + } + + /** + * 初始化基于边界值的整数分值计算 + * @param minSourceValue 左边界值 + * @param maxSourceValue 右边界值 + * @param minScore 分值区间的左边界 + * @param maxScore 分值区间的右边界 + * @param correlation 相关性 + */ + public IntegerScoreCalculator(Integer minSourceValue, Integer maxSourceValue, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { + BigDecimal minSourceValueBD = new BigDecimal(minSourceValue); + BigDecimal maxSourceValueBD = new BigDecimal(maxSourceValue); + + this.minScore = minScore; + this.maxScore = maxScore; + this.minValue = minSourceValueBD; + this.maxValue = maxSourceValueBD; + this.correlation = correlation; + prepare4BoundaryValue(); System.out.println("最小值:"+minScore+";最大值:"+maxScore); } diff --git a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java index 48692e92ce..0acb52daae 100644 --- a/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java +++ b/epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java @@ -1,5 +1,7 @@ package com.epmet.support.normalizing; +import lombok.Data; + import java.math.BigDecimal; import java.math.MathContext; import java.util.Arrays; @@ -11,23 +13,40 @@ import java.util.stream.Collectors; * ☆☆☆ 如果需要保持传入的数组元素顺序不变,请在实现类的构造方法中将传入数组进行克隆 ☆☆☆ * @param 数据类型泛型 */ +@Data public abstract class ScoreCalculator { + /** + * 源数据的数组 + */ protected T[] sourceArrary; + /** + * 最大最小分 + */ protected BigDecimal minScore; protected BigDecimal maxScore; + /** + * 相关性 + */ protected Correlation correlation; - private BigDecimal maxValue; - private BigDecimal minValue; + /** + * 系数 + */ private BigDecimal coefficient; /** - * 计算准备 + * 最大最小值 */ - protected void prepare() { + protected BigDecimal maxValue; + protected BigDecimal minValue; + + /** + * 计算准备(基于sourceArray方式的) + */ + public void prepare4SourceArray() { // 校验数组 if (!validSourceArray(sourceArrary)) { throw new RuntimeException("入参数组错误:请设置非空数组"); @@ -37,7 +56,14 @@ public abstract class ScoreCalculator { minValue = getMinFromSourceArray(); //计算系数 System.out.println("最小值:"+minScore+";最大值:"+maxScore); - coefficient = getCoefficient(minValue, maxValue); + coefficient = calcuteCoefficient(minValue, maxValue); + } + + /** + * 计算准备(基于边界值的) + */ + public void prepare4BoundaryValue() { + coefficient = calcuteCoefficient(minValue, maxValue); } /** @@ -50,10 +76,6 @@ public abstract class ScoreCalculator { throw new RuntimeException("入参数组错误:请设置sourceValue"); } - if (!Arrays.asList(sourceArrary).contains(sourceValue)) { - throw new RuntimeException("请确认要计算的数组在数组中存在"); - } - if (correlation == Correlation.POSITIVE) { // 正相关 BigDecimal x = coefficient.multiply(convertValue2BigDecimal(sourceValue).subtract(minValue)); @@ -95,6 +117,8 @@ public abstract class ScoreCalculator { return scores; } + //---------------------批量------------------------- + /** * 批量归一算法,返回List * @param sourceValues @@ -147,7 +171,7 @@ public abstract class ScoreCalculator { * 计算系数 * @return */ - protected BigDecimal getCoefficient(BigDecimal min, BigDecimal max) { + protected BigDecimal calcuteCoefficient(BigDecimal min, BigDecimal max) { BigDecimal fenmu = max.subtract(min); if (fenmu.toString().equals("0"))return new BigDecimal(0); BigDecimal fenzi = maxScore.subtract(minScore); diff --git a/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/normalizing/DemoScoreCal.java b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/normalizing/DemoScoreCal.java new file mode 100644 index 0000000000..14ebc4685c --- /dev/null +++ b/epmet-module/data-statistical/data-statistical-server/src/test/java/com/epmet/stats/test/normalizing/DemoScoreCal.java @@ -0,0 +1,66 @@ +package com.epmet.stats.test.normalizing; + +import com.epmet.support.normalizing.Correlation; +import com.epmet.support.normalizing.DoubleScoreCalculator; +import com.epmet.support.normalizing.IntegerScoreCalculator; +import com.epmet.support.normalizing.ScoreCalculator; + +import java.math.BigDecimal; +import java.util.Arrays; + +public class DemoScoreCal { + + public static void main(String[] args) { + //demoInteger(); + demoIntegerPartical(); + //demoDouble(); + } + + /** + * 整数类型,完整源数据列表的归一算法 + */ + public static void demoInteger() { + Integer[] iArray = {4,8,1,3,2}; + BigDecimal minScore = new BigDecimal(5); + BigDecimal maxScore = new BigDecimal(10); + + ScoreCalculator sc = new IntegerScoreCalculator(iArray, minScore, maxScore, Correlation.NEGATIVE); + BigDecimal[] scores = sc.normalize(iArray); + Arrays.stream(scores).forEach(s -> System.out.println(s)); + } + + /** + * 整数类型,基于边界值的部分列表的的归一算法 + */ + public static void demoIntegerPartical() { + Integer[] iArray = {4,1,2}; + BigDecimal minScore = new BigDecimal(5); + BigDecimal maxScore = new BigDecimal(10); + + ScoreCalculator sc = new IntegerScoreCalculator(1, 8 ,minScore, maxScore, Correlation.NEGATIVE); + BigDecimal[] scores = sc.normalize(iArray);// 此处也可以直接使用list参数的重载方法,计算阶段没有任何区别,区别在于new IntegerScoreCalculator()阶段 + Arrays.stream(scores).forEach(s -> System.out.println(s)); + } + + /** + * double类型归一算法 + */ + public static void demoDouble() { + Double[] iArray = {1.9,8.9,1.0,3.0,2.0}; + BigDecimal minScore = new BigDecimal(5); + BigDecimal maxScore = new BigDecimal(10); + + ScoreCalculator sc = new DoubleScoreCalculator(iArray, minScore, maxScore, Correlation.POSITIVE); + BigDecimal normalize = sc.normalize(3.0); + System.out.println(normalize); + + /** + * 同一组数据内,只有被计算值变了的话,不需要重新new对象,直接重复调用即可 + */ + BigDecimal normalize2 = sc.normalize(2.0); + System.out.println(normalize2); + } + + + +}