分享一套【优质Python源码】基于Python的农产品可视化系统(Django+echarts)

11 阅读6分钟

大家好,我是python222_小锋老师,分享一套优质的基于Python的农产品可视化系统(Django+echarts)  。  

5.jpg

项目简介

本研究提出了一种基于Python的农产品可视化系统,结合Django框架和ECharts库,旨在为农产品数据的展示和分析提供便捷、高效的解决方案。系统通过Django框架构建后端服务,使用ECharts实现前端数据可视化展示,能够直观地呈现农产品的产量、销售情况、价格波动等多维度数据。通过数据处理与图表绘制相结合,用户可以实时查看农产品相关信息,并进行趋势分析、对比分析等操作,从而为农业生产决策、市场分析等提供数据支持。此外,系统还具有良好的扩展性,能够根据实际需求灵活添加新的功能模块,如数据导入导出、用户管理等。实验结果表明,该系统在提高农产品数据管理效率、优化决策支持系统等方面具有显著优势,具有较高的应用价值和推广前景。

源码下载

链接: pan.baidu.com/s/1z6dKxAr-…

提取码: 1234

相关截图

2.jpg

3.jpg

9.jpg 4.jpg

6.jpg

7.jpg

8.jpg

核心代码

import json
import os
import sqlite3
from collections import Counter
from datetime import datetime

import jieba
import pandas as pd
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from statsmodels.tsa.arima.model import ARIMA

from app.models import User
import mysql.connector


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


def register(request):
    if request.method == "GET":
        return render(request, 'register.html')

    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        if password != password2:
            error_msg = '两次密码不一致'
            return render(request, 'register.html', context={'error_msg': error_msg})

        try:
            avatar = 'avatars/img.png'
            user = User.objects.create_user(username=username, password=password, avatar=avatar)
            # 如果注册成功,将用户状态保持
            auth.login(request, user)
            # 将用户重定向到首页
            return redirect(reverse('login'))

        except:
            return render(request, 'register.html', {'register_errmsg': '注册失败'})


def login(request):
    if request.method == "GET":
        return render(request, 'login.html')

    if request.method == 'POST':
        # 验证表单数据
        username = request.POST['username']
        password = request.POST['password']
        login_type = request.POST.get('login_type', 'frontend')
        # 认证用户
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            if user.is_active:
                # 登录用户并跳转到相应页面
                auth.login(request, user)
                if login_type == 'admin':
                    return redirect('admin:index')
                else:
                    return redirect('index')
        else:
            error_msg = '用户名或密码错误'
            return render(request, 'login.html', context={'error_msg': error_msg})


def logout(request):
    auth.logout(request)
    return redirect('login')  # 重定向到登录


def query_database(query, args=()):


    conn = mysql.connector.connect(
        host="127.0.0.1",
        user="root",
        password="123456",
        database="shop_view_django"
    )


    #  原始如下
    # conn = sqlite3.connect(BASE_DIR + '/db.sqlite3')


    cursor = conn.cursor()
    cursor.execute(query, args)


    result = cursor.fetchall()
    headers = [i[0] for i in cursor.description]
    conn.commit()
    conn.close()

    data = [headers] + list(result)
    df = pd.DataFrame(data[1:], columns=data[0])
    # print(df)
    return df


@login_required
def home(request):
    return redirect('index')


@login_required
def index(request):
    return render(request, 'index.html')


@login_required
def info(request):
    query1 = 'select * from 淘宝数据'

    df1 = query_database(query1)

    rows1 = df1.values

    return render(request, 'info.html', locals())


@login_required
def ciyun(request):
    query1 = 'select * from 淘宝数据'


    df1 = query_database(query1)


    def cy(df):
        # 词云图数据处理
        titles = df['标题'].tolist()
        # 加载停用词表
        stopwords = set()
        with open(BASE_DIR + r'./app/StopWords.txt', 'r', encoding='utf-8') as f:
            for line in f:
                stopwords.add(line.strip())
        # 将数据进行分词并计算词频
        words = []
        for item in titles:
            if item:
                words += jieba.lcut(item.replace(' ', ''))
        word_counts = Counter([w for w in words if w not in stopwords])
        # 获取词频最高的词汇
        top20_words = word_counts.most_common()
        words_data = []
        for word in top20_words:
            words_data.append({'name': word[0], 'value': word[1]})
        return words_data

    word1 = cy(df1)

    return render(request, 'ciyun.html', locals())


@login_required
def jiage(request):
    query1 = 'select * from 淘宝数据'


    df1 = query_database(query1)


    def cy(df):
        # 商品价格区间分布
        data_res = [[], [], [], [], [], [], [], [], [], []]
        for data in df['价格'].values.tolist():
            print(data)
            if data <= 10:
                data_res[0].append(data)
            if 10 < data <= 20:
                data_res[1].append(data)
            if 20 < data <= 30:
                data_res[2].append(data)
            if 30 < data <= 40:
                data_res[3].append(data)
            if 40 < data <= 50:
                data_res[4].append(data)
            if 50 < data <= 60:
                data_res[6].append(data)
            if 60 < data <= 70:
                data_res[7].append(data)
            if 70 < data <= 80:
                data_res[8].append(data)
            if 80 < data:
                data_res[9].append(data)
        data_col = [f'商品价格0~10元',
                    f'商品价格10~20元',
                    f'商品价格20~30元',
                    f'商品价格30~40元',
                    f'商品价格40~50元',
                    f'商品价格50~60元',
                    f'商品价格60~70元',
                    f'商品价格70~80元',
                    f'商品价格80元以上的', ]
        data_num = [len(i) for i in data_res]
        data_price_interval = []
        for key, value in zip(data_col, data_num):
            data_price_interval.append({'name': key, 'value': value})
        return data_price_interval

    word1 = cy(df1)

    return render(request, 'jiage.html', locals())


@login_required
def xiaoliang(request):
    query1 = 'select * from 淘宝数据'

    df1 = query_database(query1)

    def cy(sales_df):
        # 商品销量分布情况
        data_dict = {}
        for i in sales_df:
            print(i)
            key = i[0]
            value = '0'
            if i[1]:
                value = str(i[1]).replace('万', '0000').replace('+', '').replace('评价', '').replace('.', '')
            if data_dict.get(key):
                data_dict[key] += int(value)
            else:
                data_dict[key] = int(value)

        sales_data = []
        sales_key = []
        for key, value in data_dict.items():
            sales_key.append(key)
            sales_data.append({'name': key, 'value': value})

        return sales_key, sales_data

    sales_key1, sales_data1 = cy(df1[['word', '销量']].values.tolist())

    return render(request, 'xiaoliang.html', locals())


@login_required
def map(request):
    query1 = 'select * from 淘宝数据'

    df1 = query_database(query1)

    # 地图销量数据处理
    addr = df1[['发货地', '销量']]
    addr_data = addr.groupby('发货地')['销量'].sum()
    map_data = []
    addr_dict = {}
    for key, value in addr_data.to_dict().items():
        key = key.split(' ')[0]
        if addr_dict.get(key):
            addr_dict[key] += value
        else:
            addr_dict[key] = value
    for key, value in addr_dict.items():
        map_data.append({'name': key, 'value': value})

    return render(request, 'map.html', locals())


@login_required
def map2(request):
    query1 = 'select * from 淘宝数据'

    df1 = query_database(query1)

    # 地图销量数据处理
    addr = df1['发货地'].value_counts()
    map_data = []
    addr_dict = {}
    for key, value in addr.to_dict().items():
        key = key.split(' ')[0]
        if addr_dict.get(key):
            addr_dict[key] += value
        else:
            addr_dict[key] = value
    for key, value in addr_dict.items():
        map_data.append({'name': key, 'value': value})

    return render(request, 'map2.html', locals())


@login_required
def jgxl(request):
    query1 = 'select * from 淘宝数据'

    df1 = query_database(query1)

    df1 = df1[['价格', '销量']]
    # 按价格升序排序
    df1 = df1.sort_values(by=['价格'])
    # 使用布尔索引选择需要删除的行
    rows_to_drop = df1['销量'] < 100
    # 使用 drop() 方法删除行
    df1 = df1.drop(df1[rows_to_drop].index)
    df1_data = [df1['价格'].tolist(), df1['销量'].tolist()]


    return render(request, 'jgxl.html', locals())


# ARIMA 时序预测模型   【销量预测】
@login_required
def predict(request):

    def arima_model_train_eval(history):
        # 构造 ARIMA 模型
        model = ARIMA(history, order=(1, 1, 1))
        # 基于历史数据训练
        model_fit = model.fit()
        # 预测接下来的3个时间步的值
        output = model_fit.forecast(steps=3)
        yhat = output
        return yhat

    query1 = 'select * from 预测数据'

    df = query_database(query1)
    df = df[['名称', '2022/10月销量', '2022/11月销量', '2022/12月销量', '2023/01月销量', '2023/02月销量', '2023/03月销量']]
    df = df.groupby('名称').sum()
    df = df.reset_index()
    print(df)
    year_data = ['2022/10月销量', '2022/11月销量', '2022/12月销量', '2023/01月销量', '2023/02月销量', '2023/03月销量', '2023/04月销量',
                 '2023/05月销量', '2023/06月销量']
    data = df.iloc[:, 1:].values.tolist()
    bingxiang = data[0] + arima_model_train_eval(data[0]).tolist()
    xiyiji = data[1] + arima_model_train_eval(data[1]).tolist()
    dianshi = data[2] + arima_model_train_eval(data[2]).tolist()

    return render(request, 'predict.html', locals())


@login_required
def userInfo(request):
    return render(request, 'user_info.html')


@login_required
def userUpdateInfo(request):
    if request.method == 'POST':
        try:
            user = request.user
            user.username = request.POST.get('fullName')
            user.gender = request.POST.get('gender')
            user.phone_number = request.POST.get('company')
            birthday = datetime.strptime(request.POST.get('birthday'), '%Y-%m-%d')
            user.birthday = birthday
            if request.FILES.get('profileImage'):
                user.avatar = request.FILES['profileImage']

            user.save()
            return JsonResponse({'code': 200, 'errmsg': '修改成功!!!'})
        except Exception as e:
            print(e)
            return JsonResponse({'code': 403, 'errmsg': '用户名已被使用'})


@login_required
def userUpdatePwd(request):
    if request.method == 'POST':
        password = request.POST.get('password')
        new_password = request.POST.get('newpassword')
        renew_password = request.POST.get('renewpassword')

        # 检查旧密码是否正确
        if not request.user.check_password(password):
            return JsonResponse({'code': 403, 'errmsg': '旧密码不正确!!!'})

        # 检查新密码和确认密码是否匹配
        if new_password != renew_password:
            return JsonResponse({'code': 403, 'errmsg': '新密码和确认密码不匹配!!!'})

        # 更新密码
        user = request.user
        user.set_password(new_password)
        user.save()
        return JsonResponse({'code': 200, 'errmsg': '密码已成功更新!!!'})