计算机毕业设计-基于Python+Django的农产品价格数据分析与预测的可视化系统项目开发实战(附源码+论文)
本文介绍了一个基于机器学习的农产品价格预测系统,采用Python的Django框架开发,结合Scrapy数据采集、Spark数据处理和MySQL数据库存储。系统功能包括数据采集、清洗、特征工程及价格预测,支持用户注册登录和价格走势查询。核心代码展示了用户认证、数据处理等模块的实现。系统通过多源数据整合与机器学习算法,为农产品市场提供精准的价格分析与预测支持。
大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。
精彩专栏推荐👇🏻👇🏻👇🏻
开发环境
开发语言:Python
框架:django
Python版本:python3.7.7
数据库:mysql 5.7
数据库工具:Navicat11
开发软件:PyCharm
浏览器:谷歌浏览器
演示视频
django基于机器学习的农产品价格数据分析与预测
论文目录
【如需全文请按文末获取联系】

一、项目简介
系统采用Scrapy框架进行数据采集,从惠农网等平台抓取蔬菜、水产品等农产品的价格信息,并利用Spark进行高效数据处理与分析。通过Python语言结合机器学习算法,实现对农产品价格的精准预测。系统前端基于Django框架构建,提供用户友好的交互界面,后端采用MySQL数据库存储数据,确保信息的安全与高效检索。用户可通过系统实时查看农产品价格走势,管理个人账号信息,并进行价格预测查询,为农业生产与销售提供有力支持。
二、系统设计
2.1软件功能模块设计
构图是系统的体系结构,体系结构是体系结构体系的重要组成部分。系统的总体结构设计如图4.1所示。
2.2数据库设计
该系统的整体E-R实体属性如图4.7所示。
三、系统项目部分截图
3.1数据采集功能模块
识别并整合政府统计部门、市场研究机构、电商平台、社交媒体等多方数据源,确保数据的全面性和多样性。利用各数据源提供的API接口,通过编程方式自动化获取数据。采用Python的Scrapy、BeautifulSoup等库,编写爬虫程序,从网页中抓取数据。
使用MySQL、PostgreSQL等关系型数据库的客户端库,连接并查询数据库中的数据。
在采集过程中,对数据进行初步校验,如格式检查、范围检查等,确保数据的准确性和一致性。采用关系型数据库或非关系型数据库存储采集到的数据,同时定期备份数据,确保数据的安全性和可恢复性。数据采集结果如图所示5.1所示:
3.2数据清洗功能模块
对采集到的数据进行深度清洗,确保数据的准确性和一致性。利用线性插值、拉格朗日插值等技术填补缺失值。基于已有数据建立回归模型,预测并填补缺失值。使用机器学习模型(如KNN、随机森林等)预测并填补缺失值。利用3σ原则、箱线图等统计方法检测异常值。使用孤立森林、DBSCAN等算法检测并处理异常值。通过唯一标识符或数据内容的比对,删除数据集中的重复记录。使用MinMaxScaler、StandardScaler等技术对数据进行标准化或归一化处理。数据清洗结果如图所示5.2所示:
3.3特征工程功能模块
从原始数据中提取出对农产品价格预测有重要影响的特征,提高模型的预测性能。利用相关系数、互信息等统计指标筛选特征。使用递归特征消除、Lasso回归等算法筛选特征。结合农产品市场的实际情况和领域知识,人工选择关键特征。使用主成分分析PCA、线性判别分析LDA等降维技术提取特征。利用TF-IDF、词向量等技术从文本数据中提取特征。使用卷积神经网络CNN等技术从图像数据中提取特征(适用于农产品图像识别等场景)。特征工程结果如图所示5.3所示:
四、部分核心代码
#coding:utf-8
import base64, copy, logging, os, sys, time, xlrd, json, datetime, configparser
from django.http import JsonResponse
from django.apps import apps
import numbers
from django.db.models.aggregates import Count,Sum
from django.db.models import Case, When, IntegerField, F
from django.forms import model_to_dict
import requests
from util.CustomJSONEncoder import CustomJsonEncoder
from .models import vegetableinfo
from util.codes import *
from util.auth import Auth
from util.common import Common
import util.message as mes
from django.db import connection
import random
from django.core.mail import send_mail
from django.conf import settings
from django.shortcuts import redirect
from django.db.models import Q
from util.baidubce_api import BaiDuBce
from .config_model import config
def vegetableinfo_register(request):
if request.method in ["POST", "GET"]:
msg = {'code': normal_code, "msg": mes.normal_code}
req_dict = request.session.get("req_dict")
req_dict['mima'] = Common.desEncode(Common, req_dict.get('mima'))
error = vegetableinfo.createbyreq(vegetableinfo, vegetableinfo, req_dict)
if error is Exception:
msg['code'] = crud_error_code
msg['msg'] = "用户已存在,请勿重复注册!"
else:
msg['data'] = error
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_login(request):
if request.method in ["POST", "GET"]:
msg = {'code': normal_code, "msg": mes.normal_code}
req_dict = request.session.get("req_dict")
req_dict['password'] = Common.desEncode(Common, req_dict.get('password'))
datas = vegetableinfo.getbyparams(vegetableinfo, vegetableinfo, req_dict)
if not datas:
msg['code'] = password_error_code
msg['msg'] = mes.password_error_code
return JsonResponse(msg, encoder=CustomJsonEncoder)
try:
__sfsh__= vegetableinfo.__sfsh__
except:
__sfsh__=None
if __sfsh__=='是':
if datas[0].get('sfsh')!='是':
msg['code']=other_code
msg['msg'] = "账号已锁定,请联系管理员审核!"
return JsonResponse(msg, encoder=CustomJsonEncoder)
req_dict['id'] = datas[0].get('id')
return Auth.authenticate(Auth, vegetableinfo, req_dict)
def vegetableinfo_logout(request):
if request.method in ["POST", "GET"]:
msg = {
"msg": "登出成功",
"code": 0
}
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_resetPass(request):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code}
req_dict = request.session.get("req_dict")
columns= vegetableinfo.getallcolumn( vegetableinfo, vegetableinfo)
try:
__loginUserColumn__= vegetableinfo.__loginUserColumn__
except:
__loginUserColumn__=None
username=req_dict.get(list(req_dict.keys())[0])
if __loginUserColumn__:
username_str=__loginUserColumn__
else:
username_str=username
if 'mima' in columns:
password_str='mima'
else:
password_str='password'
init_pwd = '123456'
init_pwd = Common.desEncode(Common, init_pwd)
recordsParam = {}
recordsParam[username_str] = req_dict.get("username")
records=vegetableinfo.getbyparams(vegetableinfo, vegetableinfo, recordsParam)
if len(records)<1:
msg['code'] = 400
msg['msg'] = '用户不存在'
return JsonResponse(msg, encoder=CustomJsonEncoder)
eval('''vegetableinfo.objects.filter({}='{}').update({}='{}')'''.format(username_str,username,password_str,init_pwd))
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_session(request):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code,"msg": mes.normal_code, "data": {}}
req_dict={"id":request.session.get('params').get("id")}
msg['data'] = vegetableinfo.getbyparams(vegetableinfo, vegetableinfo, req_dict)[0]
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_default(request):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code,"msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
req_dict.update({"isdefault":"是"})
data=vegetableinfo.getbyparams(vegetableinfo, vegetableinfo, req_dict)
if len(data)>0:
msg['data'] = data[0]
else:
msg['data'] = {}
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_page(request):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}
req_dict = request.session.get("req_dict")
global vegetableinfo
#获取全部列名
columns= vegetableinfo.getallcolumn( vegetableinfo, vegetableinfo)
if "vipread" in req_dict and "vipread" not in columns:
del req_dict["vipread"]
#当前登录用户所在表
tablename = request.session.get("tablename")
'''__authSeparate__此属性为真,params添加userid,后台只查询个人数据'''
try:
__authSeparate__=vegetableinfo.__authSeparate__
except:
__authSeparate__=None
if __authSeparate__=="是":
tablename=request.session.get("tablename")
if tablename!="users" and 'userid' in columns and 'userid' not in req_dict:
try:
req_dict['userid']=request.session.get("params").get("id")
except:
pass
#当项目属性hasMessage为”是”,生成系统自动生成留言板的表messages,同时该表的表属性hasMessage也被设置为”是”,字段包括userid(用户id),username(用户名),content(留言内容),reply(回复)
#接口page需要区分权限,普通用户查看自己的留言和回复记录,管理员查看所有的留言和回复记录
try:
__hasMessage__=vegetableinfo.__hasMessage__
except:
__hasMessage__=None
if __hasMessage__=="是":
tablename=request.session.get("tablename")
if tablename!="users":
req_dict["userid"]=request.session.get("params").get("id")
# 判断当前表的表属性isAdmin,为真则是管理员表
# 当表属性isAdmin=”是”,刷出来的用户表也是管理员,即page和list可以查看所有人的考试记录(同时应用于其他表)
__isAdmin__ = None
allModels = apps.get_app_config('main').get_models()
for m in allModels:
if m.__tablename__==tablename:
try:
__isAdmin__ = m.__isAdmin__
except:
__isAdmin__ = None
break
# 当前表也是有管理员权限的表
if __isAdmin__ == "是" and 'vegetableinfo' != 'forum' :
if req_dict.get("userid") and 'vegetableinfo' != 'chat' and 'vegetableinfo' != 'examrecord':
del req_dict["userid"]
else:
if tablename!="users" and tablename!="jdfnl" and 'vegetableinfo'[:7]!='discuss' and "userid" in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo):
req_dict["userid"] = request.session.get("params").get("id")
#当列属性authTable有值(某个用户表)[该列的列名必须和该用户表的登陆字段名一致],则对应的表有个隐藏属性authTable为”是”,那么该用户查看该表信息时,只能查看自己的
try:
__authTables__=vegetableinfo.__authTables__
except:
__authTables__=None
if __authTables__!=None and __authTables__!={} and __isAdmin__ == "是":
for authColumn,authTable in __authTables__.items():
if authTable==tablename:
params = request.session.get("params")
req_dict[authColumn]=params.get(authColumn)
username=params.get(authColumn)
break
q = Q()
msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \
msg['data']['pageSize'] =vegetableinfo.page(vegetableinfo, vegetableinfo, req_dict, request, q)
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_autoSort(request):
'''
.智能推荐功能(表属性:[intelRecom(是/否)],新增clicktime[前端不显示该字段]字段(调用info/detail接口的时候更新),按clicktime排序查询)
主要信息列表(如商品列表,新闻列表)中使用,显示最近点击的或最新添加的5条记录就行
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}
req_dict = request.session.get("req_dict")
if "clicknum" in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo):
req_dict['sort']='clicknum'
elif "browseduration" in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo):
req_dict['sort']='browseduration'
else:
req_dict['sort']='clicktime'
req_dict['order']='desc'
msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \
msg['data']['pageSize'] = vegetableinfo.page(vegetableinfo,vegetableinfo, req_dict)
return JsonResponse(msg, encoder=CustomJsonEncoder)
#分类列表
def vegetableinfo_lists(request):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data":[]}
msg['data'],_,_,_,_ = vegetableinfo.page(vegetableinfo, vegetableinfo, {})
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_query(request):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
try:
query_result = vegetableinfo.objects.filter(**request.session.get("req_dict")).values()
msg['data'] = query_result[0]
except Exception as e:
msg['code'] = crud_error_code
msg['msg'] = f"发生错误:{e}"
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_list(request):
'''
前台分页
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}
req_dict = request.session.get("req_dict")
#获取全部列名
columns= vegetableinfo.getallcolumn( vegetableinfo, vegetableinfo)
if "vipread" in req_dict and "vipread" not in columns:
del req_dict["vipread"]
#表属性[foreEndList]前台list:和后台默认的list列表页相似,只是摆在前台,否:指没有此页,是:表示有此页(不需要登陆即可查看),前要登:表示有此页且需要登陆后才能查看
try:
__foreEndList__=vegetableinfo.__foreEndList__
except:
__foreEndList__=None
try:
__foreEndListAuth__=vegetableinfo.__foreEndListAuth__
except:
__foreEndListAuth__=None
#authSeparate
try:
__authSeparate__=vegetableinfo.__authSeparate__
except:
__authSeparate__=None
if __foreEndListAuth__ =="是" and __authSeparate__=="是":
tablename=request.session.get("tablename")
if tablename!="users" and request.session.get("params") is not None:
req_dict['userid']=request.session.get("params").get("id")
tablename = request.session.get("tablename")
if tablename == "users" and req_dict.get("userid") != None:#判断是否存在userid列名
del req_dict["userid"]
else:
__isAdmin__ = None
allModels = apps.get_app_config('main').get_models()
for m in allModels:
if m.__tablename__==tablename:
try:
__isAdmin__ = m.__isAdmin__
except:
__isAdmin__ = None
break
if __isAdmin__ == "是":
if req_dict.get("userid"):
# del req_dict["userid"]
pass
else:
#非管理员权限的表,判断当前表字段名是否有userid
if "userid" in columns:
try:
pass
except:
pass
#当列属性authTable有值(某个用户表)[该列的列名必须和该用户表的登陆字段名一致],则对应的表有个隐藏属性authTable为”是”,那么该用户查看该表信息时,只能查看自己的
try:
__authTables__=vegetableinfo.__authTables__
except:
__authTables__=None
if __authTables__!=None and __authTables__!={} and __foreEndListAuth__=="是":
for authColumn,authTable in __authTables__.items():
if authTable==tablename:
try:
del req_dict['userid']
except:
pass
params = request.session.get("params")
req_dict[authColumn]=params.get(authColumn)
username=params.get(authColumn)
break
if vegetableinfo.__tablename__[:7]=="discuss":
try:
del req_dict['userid']
except:
pass
q = Q()
msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \
msg['data']['pageSize'] = vegetableinfo.page(vegetableinfo, vegetableinfo, req_dict, request, q)
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_save(request):
'''
后台新增
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
if 'clicktime' in req_dict.keys():
del req_dict['clicktime']
tablename=request.session.get("tablename")
__isAdmin__ = None
allModels = apps.get_app_config('main').get_models()
for m in allModels:
if m.__tablename__==tablename:
try:
__isAdmin__ = m.__isAdmin__
except:
__isAdmin__ = None
break
#获取全部列名
columns= vegetableinfo.getallcolumn( vegetableinfo, vegetableinfo)
if tablename!='users' and req_dict.get("userid")!=None and 'userid' in columns and __isAdmin__!='是':
params=request.session.get("params")
req_dict['userid']=params.get('id')
if 'addtime' in req_dict.keys():
del req_dict['addtime']
idOrErr= vegetableinfo.createbyreq(vegetableinfo,vegetableinfo, req_dict)
if idOrErr is Exception:
msg['code'] = crud_error_code
msg['msg'] = idOrErr
else:
msg['data'] = idOrErr
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_add(request):
'''
前台新增
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
tablename=request.session.get("tablename")
#获取全部列名
columns= vegetableinfo.getallcolumn( vegetableinfo, vegetableinfo)
try:
__authSeparate__=vegetableinfo.__authSeparate__
except:
__authSeparate__=None
if __authSeparate__=="是":
tablename=request.session.get("tablename")
if tablename!="users" and 'userid' in columns:
try:
req_dict['userid']=request.session.get("params").get("id")
except:
pass
try:
__foreEndListAuth__=vegetableinfo.__foreEndListAuth__
except:
__foreEndListAuth__=None
if __foreEndListAuth__ and __foreEndListAuth__!="否":
tablename=request.session.get("tablename")
if tablename!="users":
req_dict['userid']=request.session.get("params").get("id")
if 'addtime' in req_dict.keys():
del req_dict['addtime']
error= vegetableinfo.createbyreq(vegetableinfo,vegetableinfo, req_dict)
if error is Exception:
msg['code'] = crud_error_code
msg['msg'] = error
else:
msg['data'] = error
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_thumbsup(request,id_):
'''
点赞:表属性thumbsUp[是/否],刷表新增thumbsupnum赞和crazilynum踩字段,
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
id_=int(id_)
type_=int(req_dict.get("type",0))
rets=vegetableinfo.getbyid(vegetableinfo,vegetableinfo,id_)
update_dict={
"id":id_,
}
if type_==1:#赞
update_dict["thumbsupnum"]=int(rets[0].get('thumbsupnum'))+1
elif type_==2:#踩
update_dict["crazilynum"]=int(rets[0].get('crazilynum'))+1
error = vegetableinfo.updatebyparams(vegetableinfo,vegetableinfo, update_dict)
if error!=None:
msg['code'] = crud_error_code
msg['msg'] = error
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_info(request,id_):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
data = vegetableinfo.getbyid(vegetableinfo,vegetableinfo, int(id_))
if len(data)>0:
msg['data']=data[0]
if msg['data'].__contains__("reversetime"):
if isinstance(msg['data']['reversetime'], datetime.datetime):
msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")
else:
if msg['data']['reversetime'] != None:
reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')
msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")
#浏览点击次数
try:
__browseClick__= vegetableinfo.__browseClick__
except:
__browseClick__=None
if __browseClick__=="是" and "clicknum" in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo):
try:
clicknum=int(data[0].get("clicknum",0))+1
except:
clicknum=0+1
click_dict={"id":int(id_),"clicknum":clicknum,"clicktime":datetime.datetime.now()}
ret=vegetableinfo.updatebyparams(vegetableinfo,vegetableinfo,click_dict)
if ret!=None:
msg['code'] = crud_error_code
msg['msg'] = ret
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_detail(request,id_):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
data =vegetableinfo.getbyid(vegetableinfo,vegetableinfo, int(id_))
if len(data)>0:
msg['data']=data[0]
if msg['data'].__contains__("reversetime"):
if isinstance(msg['data']['reversetime'], datetime.datetime):
msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")
else:
if msg['data']['reversetime'] != None:
reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')
msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")
#浏览点击次数
try:
__browseClick__= vegetableinfo.__browseClick__
except:
__browseClick__=None
if __browseClick__=="是" and "clicknum" in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo):
try:
clicknum=int(data[0].get("clicknum",0))+1
except:
clicknum=0+1
click_dict={"id":int(id_),"clicknum":clicknum,"clicktime":datetime.datetime.now()}
ret=vegetableinfo.updatebyparams(vegetableinfo,vegetableinfo,click_dict)
if ret!=None:
msg['code'] = crud_error_code
msg['msg'] = ret
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_update(request):
'''
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
if 'clicktime' in req_dict.keys() and req_dict['clicktime']=="None":
del req_dict['clicktime']
if req_dict.get("mima") and "mima" not in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo) :
del req_dict["mima"]
if req_dict.get("password") and "password" not in vegetableinfo.getallcolumn(vegetableinfo,vegetableinfo) :
del req_dict["password"]
try:
del req_dict["clicknum"]
except:
pass
error = vegetableinfo.updatebyparams(vegetableinfo, vegetableinfo, req_dict)
if error!=None:
msg['code'] = crud_error_code
msg['msg'] = error
return JsonResponse(msg)
def vegetableinfo_delete(request):
'''
批量删除
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
req_dict = request.session.get("req_dict")
error=vegetableinfo.deletes(vegetableinfo,
vegetableinfo,
req_dict.get("ids")
)
if error!=None:
msg['code'] = crud_error_code
msg['msg'] = error
return JsonResponse(msg)
def vegetableinfo_vote(request,id_):
'''
浏览点击次数(表属性[browseClick:是/否],点击字段(clicknum),调用info/detail接口的时候后端自动+1)、投票功能(表属性[vote:是/否],投票字段(votenum),调用vote接口后端votenum+1)
统计商品或新闻的点击次数;提供新闻的投票功能
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": mes.normal_code}
data= vegetableinfo.getbyid(vegetableinfo, vegetableinfo, int(id_))
for i in data:
votenum=i.get('votenum')
if votenum!=None:
params={"id":int(id_),"votenum":votenum+1}
error=vegetableinfo.updatebyparams(vegetableinfo,vegetableinfo,params)
if error!=None:
msg['code'] = crud_error_code
msg['msg'] = error
return JsonResponse(msg)
def vegetableinfo_importExcel(request):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": {}}
excel_file = request.FILES.get("file", "")
if excel_file.size > 100 * 1024 * 1024: # 限制为 100MB
msg['code'] = 400
msg["msg"] = '文件大小不能超过100MB'
return JsonResponse(msg)
file_type = excel_file.name.split('.')[1]
if file_type in ['xlsx', 'xls']:
data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())
table = data.sheets()[0]
rows = table.nrows
try:
for row in range(1, rows):
row_values = table.row_values(row)
req_dict = {}
vegetableinfo.createbyreq(vegetableinfo, vegetableinfo, req_dict)
except:
pass
else:
msg = {
"msg": "文件类型错误",
"code": 500
}
return JsonResponse(msg)
def vegetableinfo_autoSort2(request):
return JsonResponse({"code": 0, "msg": '', "data":{}})
def vegetableinfo_count(request):
'''
总数接口
'''
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": {}}
req_dict = request.session.get("req_dict")
where = ' where 1 = 1 '
for key in req_dict:
if req_dict[key] != None:
where = where + " and key like '{0}'".format(req_dict[key])
sql = "SELECT count(*) AS count FROM vegetableinfo {0}".format(where)
count = 0
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
count = online_dict['count']
msg['data'] = count
return JsonResponse(msg, encoder=CustomJsonEncoder)
# (按值统计)时间统计类型
def vegetableinfo_value(request, xColumnName, yColumnName, timeStatType):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": {}}
#获取hadoop分析后的数据文件
date_type = ""
if timeStatType == '日':
date_type = "date"
if timeStatType == '月':
date_type = "month"
if timeStatType == '季':
date_type = "quarter"
if timeStatType == '年':
date_type = "year"
json_filename = f'vegetableinfo_value{xColumnName}{yColumnName}{date_type}.json'
if os.path.exists(json_filename) == True:
with open(json_filename, encoding='utf-8') as f:
msg['data'] = json.load(f)
else:
where = ' where 1 = 1 '
sql = ''
if timeStatType == '日':
sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d')".format(xColumnName, yColumnName, where, '%Y-%m-%d')
if timeStatType == '月':
sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y-%m')".format(xColumnName, yColumnName, where, '%Y-%m')
if timeStatType == '季':
sql = "SELECT CONCAT(YEAR(MIN({0})), '-Q', QUARTER(MIN({0}))) AS {0}, SUM({1}) AS total FROM orders {2} GROUP BY YEAR({0}), QUARTER({0})".format(xColumnName, yColumnName, where)
if timeStatType == '年':
sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y')".format(xColumnName, yColumnName, where, '%Y')
L = []
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
for key in online_dict:
if 'datetime.datetime' in str(type(online_dict[key])):
online_dict[key] = online_dict[key].strftime(
"%Y-%m-%d %H:%M:%S")
else:
pass
L.append(online_dict)
msg['data'] = L
req_dict = request.session.get("req_dict")
if "order" in req_dict:
order = req_dict["order"]
if order == "desc":
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'],reverse=True)
else:
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'])
if "limit" in req_dict and int(req_dict["limit"]) < len(L):
msg['data'] = msg['data'][:int(req_dict["limit"])]
return JsonResponse(msg, encoder=CustomJsonEncoder)
# 按值统计
def vegetableinfo_o_value(request, xColumnName, yColumnName):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": {}}
#获取hadoop分析后的数据文件
json_filename = f'vegetableinfo_value{xColumnName}{yColumnName}.json'
if os.path.exists(json_filename) == True:
with open(json_filename, encoding='utf-8') as f:
msg['data'] = json.load(f)
else:
where = ' where 1 = 1 '
sql = "SELECT {0}, ROUND(sum({1}),2) AS total FROM vegetableinfo {2} GROUP BY {0}".format(xColumnName, yColumnName, where)
L = []
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
for key in online_dict:
if 'datetime.datetime' in str(type(online_dict[key])):
online_dict[key] = online_dict[key].strftime(
"%Y-%m-%d %H:%M:%S")
else:
pass
L.append(online_dict)
msg['data'] = L
req_dict = request.session.get("req_dict")
if "order" in req_dict:
order = req_dict["order"]
if order == "desc":
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'],reverse=True)
else:
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'])
if "limit" in req_dict and int(req_dict["limit"]) < len(L):
msg['data'] = msg['data'][:int(req_dict["limit"])]
return JsonResponse(msg, encoder=CustomJsonEncoder)
# (按值统计)时间统计类型(多)
def vegetableinfo_valueMul(request, xColumnName, timeStatType):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": []}
req_dict = request.session.get("req_dict")
#获取hadoop分析后的数据文件
date_type = ""
if timeStatType == '日':
date_type = "date"
if timeStatType == '月':
date_type = "month"
if timeStatType == '季':
date_type = "quarter"
if timeStatType == '年':
date_type = "year"
#获取hadoop分析后的数据文件
json_filename = f'vegetableinfo_value{xColumnName}{yColumnNameMul.replace(",","")}{date_type}.json'
if os.path.exists(json_filename) == True:
with open(json_filename, encoding='utf-8') as f:
msg['data'] = json.load(f)
else:
where = ' where 1 = 1 '
for item in req_dict['yColumnNameMul'].split(','):
sql = ''
if timeStatType == '日':
sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d') LIMIT 10".format(xColumnName, item, where, '%Y-%m-%d')
if timeStatType == '月':
sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y-%m') LIMIT 10".format(xColumnName, item, where, '%Y-%m')
if timeStatType == '季':
sql = "SELECT CONCAT(YEAR(MIN({0})), '-Q', QUARTER(MIN({0}))) {0}, sum({1}) total FROM vegetableinfo {2} GROUP BY YEAR({0}), QUARTER({0}) LIMIT 10".format(xColumnName, item, where)
if timeStatType == '年':
sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, ROUND(sum({1}),2) total FROM vegetableinfo {2} GROUP BY DATE_FORMAT({0}, '%Y') LIMIT 10".format(xColumnName, item, where, '%Y')
L = []
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
for key in online_dict:
if 'datetime.datetime' in str(type(online_dict[key])):
online_dict[key] = online_dict[key].strftime(
"%Y-%m-%d %H:%M:%S")
else:
pass
L.append(online_dict)
msg['data'].append(L)
return JsonResponse(msg, encoder=CustomJsonEncoder)
# (按值统计(多))
def vegetableinfo_o_valueMul(request, xColumnName):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": []}
req_dict = request.session.get("req_dict")
#获取hadoop分析后的数据文件
json_filename = f'vegetableinfo_value{xColumnName}{yColumnNameMul.replace(",","")}.json'
if os.path.exists(json_filename) == True:
with open(json_filename, encoding='utf-8') as f:
msg['data'] = json.load(f)
else:
where = ' where 1 = 1 '
for item in req_dict['yColumnNameMul'].split(','):
sql = "SELECT {0}, ROUND(sum({1}),2) AS total FROM vegetableinfo {2} GROUP BY {0} LIMIT 10".format(xColumnName, item, where)
L = []
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
for key in online_dict:
if 'datetime.datetime' in str(type(online_dict[key])):
online_dict[key] = online_dict[key].strftime(
"%Y-%m-%d %H:%M:%S")
else:
pass
L.append(online_dict)
msg['data'].append(L)
return JsonResponse(msg, encoder=CustomJsonEncoder)
def vegetableinfo_group(request, columnName):
if request.method in ["POST", "GET"]:
msg = {"code": normal_code, "msg": "成功", "data": {}}
#获取hadoop分析后的数据文件
json_filename = f'vegetableinfo_group{columnName}.json'
if os.path.exists(json_filename) == True:
with open(json_filename, encoding='utf-8') as f:
msg['data'] = json.load(f)
else:
where = ' where 1 = 1 '
sql = "SELECT COUNT(*) AS total, " + columnName + " FROM vegetableinfo " + where + " GROUP BY " + columnName
L = []
cursor = connection.cursor()
cursor.execute(sql)
desc = cursor.description
data_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]
for online_dict in data_dict:
for key in online_dict:
if 'datetime.datetime' in str(type(online_dict[key])):
online_dict[key] = online_dict[key].strftime("%Y-%m-%d")
else:
pass
L.append(online_dict)
msg['data'] = L
req_dict = request.session.get("req_dict")
if "order" in req_dict:
order = req_dict["order"]
if order == "desc":
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'],reverse=True)
else:
msg['data'] = sorted((x for x in msg['data'] if x['total'] is not None),key=lambda x: x['total'])
if "limit" in req_dict and int(req_dict["limit"]) < len(L):
msg['data'] = msg['data'][:int(req_dict["limit"])]
return JsonResponse(msg, encoder=CustomJsonEncoder)
获取源码或论文
如需对应的论文或源码,以及其他定制需求,也可以下方微信联系我。
更多推荐
所有评论(0)