python农产品价格预测系统 爬虫+线性回归预测算法+Flask框架 大数据毕业设计(源码)✅

184 篇文章 45 订阅
178 篇文章 9 订阅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、项目介绍

技术栈:
python语言、FLASK框架、requests爬虫技术、Echarts可视化、HTML、线性回归预测算法模型
惠农网https://www.cnhnb.com/

农产品价格预测系统在现代农业领域发挥着重要作用,它不仅有助于农民合理安排农作物的种植和销售,还能帮助消费者和经销商做出更明智的购买和库存决策。基于Flask框架、requests爬虫技术、Echarts可视化和线性回归预测算法模型,我们构建了一个农产品价格预测系统,该系统通过web界面提供直观、便捷的服务。

2、项目界面

(1)可视化分析

在这里插入图片描述

(2)可视化分析2

在这里插入图片描述

(3)农产品数据

在这里插入图片描述

(4)价格预测模块—线性回归预测算法模型

在这里插入图片描述

(5)全部产品整体市场预测

在这里插入图片描述

(6)后台数据管理

在这里插入图片描述

3、项目说明

农产品价格预测系统在现代农业领域发挥着重要作用,它不仅有助于农民合理安排农作物的种植和销售,还能帮助消费者和经销商做出更明智的购买和库存决策。基于Flask框架、requests爬虫技术、Echarts可视化和线性回归预测算法模型,我们构建了一个农产品价格预测系统,该系统通过web界面提供直观、便捷的服务。

一、系统概述

农产品价格预测系统旨在利用历史数据对未来价格进行预测。系统通过爬虫技术从惠农网等农业信息网站获取农产品价格数据,并利用数据库进行存储。用户可以通过web界面查询特定产品或多个产品的价格预测结果。

二、核心功能

数据获取与存储:使用requests库编写爬虫脚本,定时从惠农网等网站抓取农产品价格数据,包括产品名称、日期和价格等关键信息,并将数据存储到数据库中。
数据分析与预测:系统利用pandas库对数据库中的数据进行处理,计算每个日期的均价,并使用LinearRegression模型进行训练和预测。对于特定产品(yuce1函数),系统根据用户输入的产品名称查询相关数据并进行预测;对于所有产品(yuce2函数),系统则对所有产品进行均价计算和预测。
Web界面交互:Flask框架用于构建web应用,系统定义了/yuce路由,支持GET和POST请求方法。GET请求返回所有产品名称列表,并渲染yuce.html模板供用户选择产品;POST请求则根据用户提交的产品名称调用相应的预测函数,并将预测结果渲染到模板中展示给用户。
可视化展示:系统使用Echarts库对预测结果进行可视化展示,包括历史价格趋势图、预测价格曲线等,帮助用户更直观地了解价格动态。
三、系统优势

实时性:系统通过爬虫技术实时抓取价格数据,保证了预测结果的准确性和实时性。
灵活性:系统支持对特定产品或所有产品进行价格预测,满足了不同用户的需求。
可视化:通过Echarts库对预测结果进行可视化展示,使得用户更容易理解和接受预测结果。
可扩展性:系统基于Flask框架构建,具有良好的可扩展性,可以方便地添加新的功能和模块。
四、总结

农产品价格预测系统是一个集数据获取、存储、分析、预测和可视化展示于一体的综合性系统。它通过先进的技术手段为用户提供了准确、实时的价格预测服务,为农业生产和农产品贸易提供了有力支持。未来,我们将继续优化和完善系统功能,提高预测精度和用户体验。

4、核心代码


import random

from flask import Flask, request, render_template,jsonify,abort,session,redirect, url_for
import os
import models
from models import app
import time
from sqlalchemy import or_,and_
import pandas
import datetime
from flask_security import Security, 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'])
def index():#主页
    uuid = current_user.is_anonymous
    if uuid:
        return redirect(url_for('logins'))
    if request.method == 'GET':
        results = models.XinXi.query.all()
        return render_template('index.html',**locals())


from collections import OrderedDict
import pandas as pd
from sqlalchemy import or_,and_
import datetime
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import numpy
import traceback
def yuce1(name):
    try:
        dates = models.XinXi.query.filter(models.XinXi.产品 == name).all()
        date_day = list(set([i.日期 for i in dates]))
        date_day.sort()

        liuliang = []
        for i in date_day:
            record_list = models.XinXi.query.filter(and_(models.XinXi.日期 == i,models.XinXi.产品 == name)).all()
            num = 0
            count = 0
            for reco in record_list:
                num += reco.价格
                count += 1
            liuliang.append(round(num / count ,2))

        date_day = [str(i).replace('-', '') for i in date_day]
        # 数据集
        examDict = {
            '日期': date_day,
            '均价': liuliang
        }

        print(examDict)

        examOrderedDict = OrderedDict(examDict)
        examDf = pd.DataFrame(examOrderedDict)
        examDf.head()

        # exam_x 即为feature
        exam_x = examDf.loc[:, '日期']
        # exam_y 即为label
        exam_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 = []
        for i in range(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 = []
        for i in range(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)
        return li2[2:]
    except:
        print(traceback.format_exc())
        return []

def yuce2():
    dates = models.XinXi.query.all()
    date_day = list(set([i.日期 for i in dates]))
    date_day.sort()

    liuliang = []
    for i in date_day:
        record_list = models.XinXi.query.filter(models.XinXi.日期 == i).all()
        num = 0
        count = 0
        for reco in record_list:
            num += reco.价格
            count += 1
        liuliang.append(round(num / count, 2))

    date_day = [str(i).replace('-', '') for i in date_day]
    # 数据集
    examDict = {
        '日期': date_day,
        '均价': liuliang
    }

    print(examDict)

    examOrderedDict = OrderedDict(examDict)
    examDf = pd.DataFrame(examOrderedDict)
    examDf.head()

    # exam_x 即为feature
    exam_x = examDf.loc[:, '日期']
    # exam_y 即为label
    exam_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 = []
    for i in range(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 = []
    for i in range(len(li1)):
        dicts = {}
        dicts['riqi'] = li1[i][0]
        dicts['junjia'] = round(abs(y_train_pred[i]),2)
        li2.append(dicts)
    print(li2)
    return li2[2:]

@app.route('/yuce', methods=['GET', 'POST'])
def yuce():
    if request.method == 'GET':
        result = list(set([i.产品 for i in models.XinXi.query.all()]))
        return render_template('yuce.html',**locals())
    elif request.method == 'POST':
        result = list(set([i.产品 for i in models.XinXi.query.all()]))
        name = request.form.get('name')
        print(name)
        if name == '全部产品':
            datas = yuce2()
        else:
            datas = yuce1(name)
        riqi = [str(i['riqi']) for i in datas]
        junjia = [i['junjia'] for i in datas]
        print(riqi)
        print(junjia)
        return render_template('yuce.html',**locals())

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

  • 29
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值