From 5966b77d6695b5867e83348b33af446caa5d6b61 Mon Sep 17 00:00:00 2001
From: hh <2397241381@qq.com>
Date: Mon, 6 May 2024 18:28:52 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=AD=A6=E4=B9=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
system/start/pom.xml | 22 +-
.../java/org/jeecg/sy/java/Controller.java | 2 +-
.../src/main/java/org/jeecg/yw/analysis.java | 22 -
.../main/java/org/jeecg/yw/java/index.java | 29 +
.../org/jeecg/yw/ml/LinearRegression.java | 42 -
.../java/org/jeecg/yw/spark/analysis.scala | 118 +
.../main/java/org/jeecg/yw/spark/index.java | 59 -
.../main/java/org/jeecg/yw/spark/test.scala | 26 +
.../main/java/org/jeecg/yw/spark/train.scala | 63 +
.../jeecg/yw/spark/青少年膳食营养数据集.csv | 11215 ++++++++++++++++
10 files changed, 11473 insertions(+), 125 deletions(-)
delete mode 100644 system/start/src/main/java/org/jeecg/yw/analysis.java
create mode 100644 system/start/src/main/java/org/jeecg/yw/java/index.java
delete mode 100644 system/start/src/main/java/org/jeecg/yw/ml/LinearRegression.java
create mode 100644 system/start/src/main/java/org/jeecg/yw/spark/analysis.scala
delete mode 100644 system/start/src/main/java/org/jeecg/yw/spark/index.java
create mode 100644 system/start/src/main/java/org/jeecg/yw/spark/test.scala
create mode 100644 system/start/src/main/java/org/jeecg/yw/spark/train.scala
create mode 100644 system/start/src/main/java/org/jeecg/yw/spark/青少年膳食营养数据集.csv
diff --git a/system/start/pom.xml b/system/start/pom.xml
index af51f9e..e34a995 100644
--- a/system/start/pom.xml
+++ b/system/start/pom.xml
@@ -10,7 +10,7 @@
4.0.0
start
-
+
org.apache.spark
@@ -21,6 +21,26 @@
org.apache.spark
spark-sql_2.13
3.2.0
+
+
+ janino
+ org.codehaus.janino
+
+
+ commons-compiler
+ org.codehaus.janino
+
+
+
+
+ janino
+ org.codehaus.janino
+ 3.0.8
+
+
+ commons-compiler
+ org.codehaus.janino
+ 3.0.8
org.apache.spark
diff --git a/system/start/src/main/java/org/jeecg/sy/java/Controller.java b/system/start/src/main/java/org/jeecg/sy/java/Controller.java
index 39eb0a0..9e92844 100644
--- a/system/start/src/main/java/org/jeecg/sy/java/Controller.java
+++ b/system/start/src/main/java/org/jeecg/sy/java/Controller.java
@@ -3,7 +3,6 @@ package org.jeecg.sy.java;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.api.vo.Result;
-import org.jeecg.sy.scala.WeatherPrediction$;
import org.jeecg.sy.temp.analysis$;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.redis.core.RedisTemplate;
@@ -24,6 +23,7 @@ public class Controller {
@Resource
private RedisTemplate redisTemplate;
+ // 爬虫
@RequestMapping("/get")
public Result test1() throws MalformedURLException {
return Result.ok(analysis$.MODULE$.analysis2(getData.getDatas("")));
diff --git a/system/start/src/main/java/org/jeecg/yw/analysis.java b/system/start/src/main/java/org/jeecg/yw/analysis.java
deleted file mode 100644
index e607514..0000000
--- a/system/start/src/main/java/org/jeecg/yw/analysis.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.jeecg.yw;
-
-import com.alibaba.fastjson.JSONObject;
-import org.jeecg.common.api.vo.Result;
-import org.jeecg.yw.ml.LinearRegression;
-import org.jeecg.yw.spark.index;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import java.util.Map;
-
-@RestController
-@RequestMapping("/analysis")
-public class analysis {
- @RequestMapping("/data")
- public Result test(@RequestBody Map map) {
- JSONObject json = new JSONObject();
- json.put("healthScore", index.getScore(map));
- json.put("foodRecommendations", LinearRegression.getResult(map));
- return Result.ok(json);
- }
-}
diff --git a/system/start/src/main/java/org/jeecg/yw/java/index.java b/system/start/src/main/java/org/jeecg/yw/java/index.java
new file mode 100644
index 0000000..31cf004
--- /dev/null
+++ b/system/start/src/main/java/org/jeecg/yw/java/index.java
@@ -0,0 +1,29 @@
+package org.jeecg.yw.java;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.yw.spark.analysis$;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/analysis")
+public class index {
+ @RequestMapping("/data")
+ public Result getData(@RequestBody Map map) {
+ JSONObject json = new JSONObject();
+ json.put("healthScore", analysis$.MODULE$.getScore(map));
+ json.put("foodRecommendations", analysis$.MODULE$.getResult(map));
+ return Result.ok(json);
+ }
+
+ @RequestMapping("/ml")
+ public Result getScore(@RequestBody Map map) {
+ JSONObject json = new JSONObject();
+ json.put("ML", analysis$.MODULE$.getML(map));
+ return Result.ok(json);
+ }
+}
diff --git a/system/start/src/main/java/org/jeecg/yw/ml/LinearRegression.java b/system/start/src/main/java/org/jeecg/yw/ml/LinearRegression.java
deleted file mode 100644
index 2d09ce2..0000000
--- a/system/start/src/main/java/org/jeecg/yw/ml/LinearRegression.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.jeecg.yw.ml;
-
-import com.alibaba.fastjson.JSONObject;
-
-import java.util.Map;
-import java.util.Set;
-
-public class LinearRegression {
- // 获取结果
- public static String getResult(Map map) {
- String result[] = new String[9];
- result[0] = "您的饮食缺少蛋白质,请多吃一些肉类、鱼类、蛋类、奶类等食物";
- result[1] = "您的饮食缺少脂肪,请多吃一些肉类、鱼类、蛋类、奶类等食物";
- result[2] = "您的饮食缺少碳水化合物,请多吃一些米面类食物";
- result[3] = "您的饮食缺少维生素,请多吃一些水果、蔬菜等食物";
- result[4] = "您的饮食缺少矿物质,请多吃一些水果、蔬菜等食物";
- result[5] = "您的饮食缺少纤维,请多吃一些水果、蔬菜等食物";
- result[6] = "您的饮食缺少水,请多喝水";
- result[7] = "您的饮食过多,请适量减少食物摄入";
- result[8] = "您的饮食过油腻,请适量减少食物摄入";
- // 每条结果有30%的概率出现
- Set set = new java.util.HashSet<>();
- // 随机9次,每次都是30%的概率,将结果加入set
- for (int i = 0; i < 9; i++) {
- int random = (int) (Math.random() * 10);
- if (random < 3) {
- set.add(i);
- }
- }
- //拼接结果
- String resultStr = "";
- int j = 0;
- for (int i : set) {
- j++;
- resultStr += j + "." + result[i] + "\n";
- }
-
- return resultStr;
- }
-
-
-}
diff --git a/system/start/src/main/java/org/jeecg/yw/spark/analysis.scala b/system/start/src/main/java/org/jeecg/yw/spark/analysis.scala
new file mode 100644
index 0000000..effadf4
--- /dev/null
+++ b/system/start/src/main/java/org/jeecg/yw/spark/analysis.scala
@@ -0,0 +1,118 @@
+package org.jeecg.yw.spark
+
+import org.apache.spark.ml.PipelineModel
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.types.{StringType, StructField, StructType}
+
+import java.util
+import java.util.{HashSet, Map, Set}
+import scala.collection.convert.ImplicitConversions.{`collection AsScalaIterable`, `map AsScala`}
+
+object analysis {
+
+ import org.apache.spark.sql.Row
+
+ // 机器学习预测
+ def getML(map: Map[String, AnyRef]): Double = {
+ val spark = SparkSession.builder()
+ .appName("Weather Temperature Prediction")
+ .master("local[*]")
+ .getOrCreate()
+
+ // 加载模型
+ val model = PipelineModel.load("hdfs://192.168.192.100:8020/Model")
+
+ // 从map中获取键值对,并创建一个新的DataFrame
+ val row = Row.fromSeq(map.values.toSeq)
+ val df = spark.createDataFrame(
+ spark.sparkContext.parallelize(Seq(row)),
+ StructType(map.keys.toSeq.map(fieldName => StructField(fieldName, StringType)))
+ )
+
+ // 使用模型进行预测
+ val predictions = model.transform(df)
+ predictions.select("prediction").show()
+ spark.stop()
+ val prediction = predictions.select("prediction").collect()(0)(0).toString.toDouble
+ prediction
+ }
+
+ def getScore(map: Map[String, AnyRef]): Double = {
+ val age: Int = map.get("age").toString.toInt
+ val weight: Int = map.get("weight").toString.toInt
+ val sleepTime: Int = map.get("sleepTime").toString.toInt
+ val tableDataObject: AnyRef = map.get("tableData")
+ var Score: Double = 100
+
+ import scala.jdk.CollectionConverters._
+
+ val tableDataList: List[Map[String, AnyRef]] = tableDataObject.asInstanceOf[java.util.ArrayList[java.util.Map[String, AnyRef]]].asScala.toList
+ // 遍历列表
+ for (item <- tableDataList) {
+ val `type`: String = item.get("type").toString
+ val num: Int = item.get("num").toString.toInt
+ if (`type` == ("绿叶蔬菜") || `type` == ("红橙色蔬菜") || `type` == ("土豆") || `type` == ("其他蔬菜类") || `type` == ("薯类") || `type` == ("水果") || `type` == ("大豆制品") || `type` == ("新鲜肉类") || `type` == ("鱼虾或其他海鲜") || `type` == ("蛋类") || `type` == ("奶类")) {
+ Score += 3.25 * (10 + num) / 10
+ }
+ else {
+ Score -= 10.25 * (10 + num) / 10
+ }
+ }
+
+ var temp: Double = 0
+ // 计算年龄
+ Score = (Score * (100 + age - 10) / 100).toInt
+ if (weight > 60) {
+ temp = 60 - weight
+ } else if (weight < 40) {
+ temp = 40 - weight
+ } else {
+ temp = 0
+ }
+ Score = (Score * (100 - temp) / 100).toInt
+ if (sleepTime > 12) {
+ temp = sleepTime - 12
+ } else if (sleepTime < 7) {
+ temp = 7 - sleepTime
+ } else {
+ temp = 0
+ }
+ Score = (Score * (100 + sleepTime - 8) / 100).toInt
+ if (Score > 97) {
+ Score = 97
+ }
+ return Score
+ }
+
+ def getResult(map: util.Map[String, AnyRef]): String = {
+ val result: Array[String] = new Array[String](9)
+ result(0) = "您的饮食缺少蛋白质,请多吃一些肉类、鱼类、蛋类、奶类等食物"
+ result(1) = "您的饮食缺少脂肪,请多吃一些肉类、鱼类、蛋类、奶类等食物"
+ result(2) = "您的饮食缺少碳水化合物,请多吃一些米面类食物"
+ result(3) = "您的饮食缺少维生素,请多吃一些水果、蔬菜等食物"
+ result(4) = "您的饮食缺少矿物质,请多吃一些水果、蔬菜等食物"
+ result(5) = "您的饮食缺少纤维,请多吃一些水果、蔬菜等食物"
+ result(6) = "您的饮食缺少水,请多喝水"
+ result(7) = "您的饮食过多,请适量减少食物摄入"
+ result(8) = "您的饮食过油腻,请适量减少食物摄入"
+ val set: util.Set[Integer] = new util.HashSet[Integer]
+ for (i <- 0 until 9) {
+ val random: Int = (Math.random * 10).toInt
+ if (random < 3) set.add(i)
+ }
+ //拼接结果
+ var resultStr: String = ""
+ var j: Int = 0
+ for (i <- 0 until set.size) {
+ j += 1
+ resultStr += j + "." + result(i) + "\n"
+ }
+ resultStr
+ }
+
+ def getRecord(): Double = {
+ // 一个70-90的随机数
+ val random: Double = (Math.random * 10).toInt
+ random
+ }
+}
diff --git a/system/start/src/main/java/org/jeecg/yw/spark/index.java b/system/start/src/main/java/org/jeecg/yw/spark/index.java
deleted file mode 100644
index 5d63879..0000000
--- a/system/start/src/main/java/org/jeecg/yw/spark/index.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.jeecg.yw.spark;
-
-import com.alibaba.fastjson.JSONObject;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class index {
- // 获取分数
- public static double getScore(Map map) {
- // 值分为age,weight,sleepTime,tableData(是一个json数组)
- //计算规则如下,满分为100,其中年龄只做一个浮动值,从7-18岁,算法为总分*(100+岁数-10)%,即十岁以上的总分会比较高
- //体重,每减少1kg,总分减少1%,每增加1kg,总分增加1%,便准体重为
- //睡眠时间,每减少1小时,总分减少1%,每增加1小时,总分增加1%,便准睡眠时间为8小时
- //获取年龄,体重,睡眠时间
- int age = Integer.parseInt(map.get("age").toString());
- int weight = Integer.parseInt(map.get("weight").toString());
- int sleepTime = Integer.parseInt(map.get("sleepTime").toString());
- // 检查tableData是否是List类型
- Object tableDataObject = map.get("tableData");
- String tableData = map.get("tableData").toString();
- // 将tableData转为map
- //遍历循环json数组
- // 好的
- // 绿叶蔬菜 红橙色蔬菜 土豆 其他蔬菜类 薯类
- // 水果 大豆制品 新鲜肉类 鱼虾或其他海鲜 蛋类 奶类
- // 坏的
- // 方便面西式快餐 加糖饮料 加糖或盐的零食和甜点 油炸食品 加工肉类
- // 一共有16个字段,数据结构为[{type=绿叶蔬菜, num=1},.. 其中数字为1-5
- // 计算方式为基础分数为100,每个好的食物加N*(1.X)分,每个坏的食物减N*(1.X)分 其中X是num,N是100/16=6.25
- double Score = 100;
- if (tableDataObject instanceof List) {
- List