当前位置:   article > 正文

【Python原创毕设|课设】基于Flask(机器学习)的农作物产量预测与可视化分析系统(xgboost)-文末附下载方式以及往届优秀论文,原创项目其他均为抄袭_农产品 品质 可视化 预测

农产品 品质 可视化 预测

一、项目简介

基于Flask的农作物产量预测分析与可视化系统,旨在帮助农民和相关从业者更好地预测农作物产量,以优化农业生产。该系统主要包括四个功能模块。

首先,农作物数据可视化模块利用Echarts、Ajax、Flask、PyMysql技术实现了可视化展示农作物产量相关数据的功能。

其次,产量预测模块使用pandas、numpy等技术,通过对气象和农作物产量关系数据集的分析和训练,实现了对农作物产量的预测功能。该模块可以对当前或未来某一时间段的农作物产量进行预测,并提供预测结果的可视化展示。

然后,用户登录与用户注册模块使用layui、Flask、PyMysql技术实现了用户登录和注册功能。用户可以通过登录系统后,利用该系统提供的预测和可视化功能,更好地规划和管理自己的农业生产。

最后,数据管理模块使用layui、Flask、PyMysql技术,实现了用户管理、公告管理和农作物数据管理等功能。系统管理员可以通过后台界面对用户信息、公告信息和农作物数据进行管理和维护,保证系统的正常运行和信息安全。

本系统的实现对农业生产的优化具有积极的意义。通过对气象和农作物产量关系数据的分析和训练,该系统可以帮助用户更好地了解不同作物产量随时间变化的趋势和规律,提高农作物的产量和品质,促进农业生产的可持续发展。

二、开发环境

开发环境版本/工具
PYTHON3.6.8
开发工具PyCharm
操作系统Windows 10
内存要求8GB 以上
浏览器Firefox (推荐)、Google Chrome (推荐)、Edge
数据库MySQL 8.0 (推荐)
数据库工具Navicat Premium 15 (推荐)
项目框架FLASK

三、项目技术

后端:Flask、sklearn、PyMySQL、MySQL、urllib

前端:Jinja2、Jquery、Ajax、layui

四、功能结构

农作物产量大屏数据可视化模块:通过ECharts实现数据可视化,展示农作物产量的趋势、关联因素等。

机器学习预测农作物产量模型构建与训练:使用Scikit-learn、Pandas、NumPy构建机器学习模型,对农作物产量进行预测(数据集来自阿里云AI竞赛课题)。

用户登录与注册:通过Flask、PyMySQL、LAYUI实现用户登录和注册功能。

系统后台管理模块

  • 用户模块:管理用户信息,权限等。

  • 公告模块:发布和管理系统相关公告信息。

  • 农作物数据管理模块:存储和管理与农作物产量预测相关的数据集。

  • 预测可视化后台交互:提供用户与预测数据的交互界面,使用Ajax请求后端数据接口展示数据可视化结果。

请添加图片描述

五、运行截图

首页可视化:
在这里插入图片描述

登录页面:
在这里插入图片描述

注册页面:
在这里插入图片描述

后台管理首页:
在这里插入图片描述

用户管理:
在这里插入图片描述

公告管理:
在这里插入图片描述

产量数据管理:
在这里插入图片描述

气象数据管理:
在这里插入图片描述

产量预测管理:
在这里插入图片描述

六、功能实现

*模型构建*

def model(X_data,y_label,testst,prediction):
  """
  模型搭建
  """
  global params_xgb  #模型参数,设置全局变量便于调参
  n_splits = 25
  res = []
  kf = KFold(n_splits = n_splits, shuffle=True, random_state=520)
  for i, (train_index, test_index) in enumerate(kf.split(X_data)):
    print('第{}次训练...'.format(i+1))
    train_data = X_data.iloc[train_index]
    train_label = y_label.iloc[train_index]
    valid_data = X_data.iloc[test_index]
    valid_label = y_label.iloc[test_index]
    xgb_train = xgb.DMatrix(train_data, label=train_label)
    xgb_valid = xgb.DMatrix(valid_data, valid_label)
    evallist = [(xgb_valid, 'eval'), (xgb_train, 'train')]
    cgb_model = xgb.train(params_xgb, xgb_train, num_boost_round=500 , evals=evallist, verbose_eval=500, early_stopping_rounds=300, feval=myFeval)
    valid = cgb_model.predict(xgb_valid, ntree_limit=cgb_model.best_ntree_limit)
    valid_score = mean_squared_error(valid_label,valid)*0.5
    if valid_score > 0.01:
      \#验证集分数不好的模型丢弃
      continue
    xgb_test = xgb.DMatrix(testst)
    preds = cgb_model.predict(xgb_test, ntree_limit=cgb_model.best_ntree_limit)
    res.append(preds)
    print("\n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

训练模型

if __name__ == "__main__":
  deal_loss()
  change()
  change_week()
  params_xgb = {
    'booster': 'gbtree',
    'objective': 'reg:squarederror',
    'eval_metric': 'rmse',  # 对于回归问题,默认值是rmse,对于分类问题,默认值是error
    'gamma': 0.1,   #损失下降多少才分裂
    'max_depth': 4,
    'lambda': 1.2,   #控制模型复杂度的权重值的L2曾泽化参数,参数越大越不容易过拟合
    'subsample': 0.9,  #随机采样的训练样本
    'colsample_bytree': 0.9,   #生成树时特征采样比例
    'min_child_weight': 3,  # 6
    'silent': 0,   #信息输出设置成1则没有信息输出
    'eta': 0.12,  #类似学习率
    'seed': 1000,
    'nthread': 9,
  }

  X_data,y_label,testst,prediction = get_data()
  model(X_data,y_label,testst,prediction)
  df = pd.read_csv("result.csv",encoding="gbk")
  df["区县id"] =  df["columns"].apply(arr)
  df1 = pd.read_csv(path+"train_rice.csv",encoding="gbk")
  d = df1[["区县id","2017年晚稻"]]
  la = pd.merge(df,d,on="区县id")
  score = mean_squared_error(la["pre_xgboost"],la["2017年晚稻"])*0.5
  print(score)
  s = la[["区县id","pre_xgboost"]]
  s.to_csv('x_prediction.csv', index=False,encoding='gbk',header=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

可视化核心业务

# 获取各个区县3年产量
def get_times_selling():
 sqlManager = SQLManager()
 sql = "SELECT round(SUM(early2015 + late2015 + early2016 + late2016 + early2017 + late2017), 2) as `value`, county as number, '产量分析' as name FROM `output` GROUP BY county, `name`;"
 res = sqlManager.get_list(sql)
 return res

# 近半年日照时常统计
def get_months_sun():
 times = ['2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12']  # 半年
 data = []
 sqlManager = SQLManager()
 sql = "SELECT ROUND(avg(sun_time),2) as `value`  FROM `weather` where date_format(rec_time,'%%Y-%%m')=%s;"
 for t in times:
   res = sqlManager.get_one(sql, t)
   if not res or not res['value']:
     res['value'] = 0
   data.append({"time": t, "value": float(res['value']), "name": "近半年日照时常统计"})
 return data

# 近半年高低温统计
def get_months_temp():
 times = ['2018-07', '2018-08', '2018-09', '2018-10', '2018-11', '2018-12']  # 半年
 data_max = []
 data_min = []
 sqlManager = SQLManager()
 sql = "SELECT ROUND(avg(temp_max),2) as `value1` ,ROUND(avg(temp_min),2) as `value2`  FROM `weather` where date_format(rec_time,'%%Y-%%m')=%s;"
 for t in times:
   res = sqlManager.get_one(sql, t)
   if not res or not res['value1']:
     res['value1'] = 0
   if not res or not res['value2']:
     res['value2'] = 0
   data_max.append(float(res['value1']))
   data_min.append(float(res['value2']))
 return {'time': times, 'max': data_max, 'min': data_min}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

七、数据库设计

数据库:agricultural_analysis

表名:notice

字段名称数据类型是否必填注释
idint(11)
titlevarchar(255)公告标题
contentlongtext公告内容
user_namevarchar(50)发布人
create_timedatetime发布时间

表名:output

字段名称数据类型是否必填注释
idint(11)产量
countyvarchar(20)县区
early2015double(12,8)2015早稻
early2016double(12,8)2016早稻
early2017double(12,8)2017早稻
late2015double(12,8)2015晚稻
late2016double(12,8)2016晚稻
late2017double(12,8)2017晚稻

表名:user

字段名称数据类型是否必填注释
idint(11)
namevarchar(255)用户名称(供应商名称)
accountvarchar(255)用户账号
passwordvarchar(255)用户密码
companyvarchar(255)企业名称
mailvarchar(255)邮箱
typeint(11)0管理员,1普通用户
statusint(11)0禁用1启用

表名:weather

字段名称数据类型是否必填注释
idint(11)
countyvarchar(20)区县
rec_timedate记录日期
sun_timedouble(10,2)日照时数(单位:h)
winddouble(10,2)日平均风速(单位:m/s)
raindouble(10,2)日降水量(mm)
temp_maxdouble(10,2)日最高温度(单位:℃)
temp_mindouble(10,2)日最低温度(单位:℃)
temp_avedouble(10,2)日平均温度(单位:℃)
humiditydouble(10,2)日相对湿度(单位:%)
hpadouble(10,2)日平均气压(单位:hPa)

八、源码获取

源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/157737
推荐阅读
相关标签
  

闽ICP备14008679号