1、项目介绍
技术栈
采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 Spark 技术进行大数据处理,通过 requests 爬虫从惠农网采集农产品数据,运用线性回归预测算法模型进行价格预测,前端结合 Echarts 可视化库与 HTML 构建页面。
功能模块
· 农产品可视化分析
· 均价前5农产品分析
· 售卖前5农产品分析
· 数据中心
· 农产品预测
· 价格预测折线图
· 选择农产品进行预测
· 后台数据管理
项目介绍
本系统基于 Flask 框架构建农产品数据可视化分析与预测平台,通过 requests 爬虫从惠农网采集农产品价格、市场等数据,利用 Spark 进行数据处理,存入数据库。系统提供各农产品数量与均价折线图、均价前五与售卖前五农产品的柱状图对比分析,以及农产品价格预测功能。基于线性回归模型对历史价格数据进行训练,预测未来价格趋势并以折线图展示。数据中心支持农产品数据的表格化查询与筛选,后台管理模块提供数据的增删改查与批量操作功能。
2、项目界面
(1)农产品可视化分析----各农产品数量折线图、农产品均价分析
该农产品数据可视化分析页面,通过折线图展示不同农产品的数量与均价分布,可直观对比各类农产品的数量和价格差异,支持交互查看数据详情,实现农产品数量与价格的可视化对比分析。
(2)均价前5农产品分析、售卖前5农产品
该农产品数据可视化分析页面,通过柱状图分别展示均价前五和售卖前五的农产品,支持交互查看数据详情,可直观对比不同农产品的价格与销量排名情况,实现农产品价格和销量数据的可视化分析。
(3)数据中心----农产品、价格、市场、日期
该农产品数据可视化分析页面,以表格形式展示农产品的日期、产品、价格及市场信息,提供分页显示、数据搜索与排序功能,方便用户查看和筛选农产品数据。
(4)农产品预测—机器学习
该农产品数据可视化分析页面,提供产品名称筛选功能,以表格和折线图形式展示农产品价格预测数据,可直观呈现价格随日期的变化趋势,实现农产品价格的预测与趋势可视化分析。
(5)价格预测折线图
该农产品数据可视化分析页面,以表格和折线图展示农产品价格预测数据,折线图可直观呈现价格随日期的波动趋势,支持交互查看数据详情,实现农产品价格预测数据的可视化趋势分析。
(6)选择农产品进行预测
该农产品数据可视化分析页面,提供产品名称筛选下拉框,支持选择不同农产品查看价格预测数据,以表格和折线图展示日期与均价,可直观呈现价格随日期的变化趋势,实现农产品价格预测数据的筛选与可视化分析。
(7)后台数据管理
该后台管理系统的数据管理页面,以表格形式展示农产品的日期、产品、价格及市场信息,提供数据搜索、创建、批量操作与单条编辑功能,方便管理员对农产品数据进行管理与维护。
3、项目说明
一、技术栈简要说明
本系统采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 Spark 技术进行大数据处理,通过 requests 爬虫从惠农网采集农产品数据,运用线性回归预测算法模型进行价格预测,前端结合 Echarts 可视化库与 HTML 构建页面。
二、功能模块详细介绍
· 农产品可视化分析
该页面通过折线图展示不同农产品的数量与均价分布,可直观对比各类农产品的数量和价格差异,支持交互查看数据详情,实现农产品数量与价格的可视化对比分析,帮助用户快速了解各农产品的市场表现。
· 均价前5农产品分析
该页面通过柱状图展示均价排名前五的农产品,支持交互查看数据详情,可直观对比不同农产品的价格排名情况,帮助用户识别高价值农产品,实现农产品价格数据的可视化分析。
· 售卖前5农产品分析
该页面通过柱状图展示售卖数量排名前五的农产品,支持交互查看数据详情,可直观对比不同农产品的销量排名情况,帮助用户了解市场热销品类,实现农产品销量数据的可视化分析。
· 数据中心
该页面以表格形式展示农产品的日期、产品、价格及市场信息,提供分页显示、数据搜索与排序功能,方便用户查看和筛选农产品数据,实现农产品信息的集中管理与便捷查询。
· 农产品预测
该页面提供产品名称筛选功能,以表格和折线图形式展示农产品价格预测数据,可直观呈现价格随日期的变化趋势。系统基于线性回归模型对历史价格数据进行训练,预测未来价格,实现农产品价格的预测与趋势可视化分析。
· 价格预测折线图
该页面以表格和折线图展示农产品价格预测数据,折线图可直观呈现价格随日期的波动趋势,支持交互查看数据详情,实现农产品价格预测数据的可视化趋势分析,帮助用户把握未来价格走向。
· 选择农产品进行预测
该页面提供产品名称筛选下拉框,支持选择不同农产品查看价格预测数据,以表格和折线图展示日期与均价,可直观呈现价格随日期的变化趋势,实现农产品价格预测数据的筛选与可视化分析,满足用户个性化查询需求。
· 后台数据管理
该后台管理页面以表格形式展示农产品的日期、产品、价格及市场信息,提供数据搜索、创建、批量操作与单条编辑功能,支持管理员对农产品数据进行增删改查与批量管理,保障数据的准确性和时效性。
三、项目总结
本系统基于 Flask 框架构建农产品数据可视化分析与预测平台,通过 requests 爬虫从惠农网采集农产品价格、市场等数据,利用 Spark 进行大数据处理,存入数据库。系统提供各农产品数量与均价折线图、均价前五与售卖前五农产品的柱状图对比分析,以及农产品价格预测功能。基于线性回归模型对历史价格数据进行训练,预测未来价格趋势并以折线图展示,支持用户选择特定农产品进行价格预测。数据中心支持农产品数据的表格化查询与筛选,后台管理模块提供数据的增删改查与批量操作功能。该系统帮助用户了解农产品市场动态,为农产品买卖提供数据支持与决策参考。
4、核心代码
importrandomfromflaskimportFlask,request,render_template,jsonify,abort,session,redirect,url_forimportosimportmodelsfrommodelsimportappimporttimefromsqlalchemyimportor_,and_importpandasimportdatetimefromflask_securityimportSecurity,SQLAlchemySessionUserDatastore,\ UserMixin,RoleMixin,login_required,auth_token_required,http_auth_required,current_user user_datastore=SQLAlchemySessionUserDatastore(models.db.session,models.User,models.Role)security=Security(app,user_datastore)@app.route('/',methods=['GET','POST'])@app.route('/index',methods=['GET','POST'])defindex():#主页uuid=current_user.is_anonymousifuuid:returnredirect(url_for('logins'))ifrequest.method=='GET':results=models.XinXi.query.all()returnrender_template('index.html',**locals())fromcollectionsimportOrderedDictimportpandasaspdfromsqlalchemyimportor_,and_importdatetimefromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionimportnumpyimporttracebackdefyuce1(name):try:dates=models.XinXi.query.filter(models.XinXi.产品==name).all()date_day=list(set([i.日期foriindates]))date_day.sort()liuliang=[]foriindate_day:record_list=models.XinXi.query.filter(and_(models.XinXi.日期==i,models.XinXi.产品==name)).all()num=0count=0forrecoinrecord_list:num+=reco.价格 count+=1liuliang.append(round(num/count,2))date_day=[str(i).replace('-','')foriindate_day]# 数据集examDict={'日期':date_day,'均价':liuliang}print(examDict)examOrderedDict=OrderedDict(examDict)examDf=pd.DataFrame(examOrderedDict)examDf.head()# exam_x 即为featureexam_x=examDf.loc[:,'日期']# exam_y 即为labelexam_y=examDf.loc[:,'均价']x_train,x_test,y_train,y_test=train_test_split(exam_x,exam_y,train_size=0.8)x_train=x_train.values.reshape(-1,1)x_test=x_test.values.reshape(-1,1)model=LinearRegression()model.fit(x_train,y_train)LinearRegression(copy_X=True,fit_intercept=True,n_jobs=1,normalize=False)rDf=examDf.corr()model.score(x_test,y_test)data1=datetime.datetime.strptime(str(date_day[-3]),'%Y%m%d')li1=[]foriinrange(10):data1=data1+datetime.timedelta(1)li1.append([int(data1.strftime('%Y%m%d'))])li2=numpy.array(li1)y_train_pred=model.predict(li2)li2=[]foriinrange(len(li1)):dicts={}dicts['riqi']=li1[i][0]dicts['junjia']=round(round(abs(y_train_pred[i]),2)+round(random.random(),1),2)li2.append(dicts)returnli2[2:]except:print(traceback.format_exc())return[]defyuce2():dates=models.XinXi.query.all()date_day=list(set([i.日期foriindates]))date_day.sort()liuliang=[]foriindate_day:record_list=models.XinXi.query.filter(models.XinXi.日期==i).all()num=0count=0forrecoinrecord_list:num+=reco.价格 count+=1liuliang.append(round(num/count,2))date_day=[str(i).replace('-','')foriindate_day]# 数据集examDict={'日期':date_day,'均价':liuliang}print(examDict)examOrderedDict=OrderedDict(examDict)examDf=pd.DataFrame(examOrderedDict)examDf.head()# exam_x 即为featureexam_x=examDf.loc[:,'日期']# exam_y 即为labelexam_y=examDf.loc[:,'均价']x_train,x_test,y_train,y_test=train_test_split(exam_x,exam_y,train_size=0.8)x_train=x_train.values.reshape(-1,1)x_test=x_test.values.reshape(-1,1)model=LinearRegression()model.fit(x_train,y_train)LinearRegression(copy_X=True,fit_intercept=True,n_jobs=1,normalize=False)rDf=examDf.corr()model.score(x_test,y_test)data1=datetime.datetime.strptime(str(date_day[-1]),'%Y%m%d')li1=[]foriinrange(10):data1=data1+datetime.timedelta(1)li1.append([int(data1.strftime('%Y%m%d'))])li2=numpy.array(li1)y_train_pred=model.predict(li2)li2=[]foriinrange(len(li1)):dicts={}dicts['riqi']=li1[i][0]dicts['junjia']=round(abs(y_train_pred[i]),2)li2.append(dicts)print(li2)returnli2[2:]@app.route('/yuce',methods=['GET','POST'])defyuce():ifrequest.method=='GET':result=list(set([i.产品foriinmodels.XinXi.query.all()]))returnrender_template('yuce.html',**locals())elifrequest.method=='POST':result=list(set([i.产品foriinmodels.XinXi.query.all()]))name=request.form.get('name')print(name)ifname=='全部产品':datas=yuce2()else:datas=yuce1(name)riqi=[str(i['riqi'])foriindatas]junjia=[i['junjia']foriindatas]print(riqi)print(junjia)returnrender_template('yuce.html',**locals())