Python: 实现数据可视化分析系统

后端基于Python 开源的 Web 框架 Flask,前端页面采用 LayUI 框架以及 Echarts 图表,数据库为sqlite。系统的功能模块分为数据采集和存储模块、数据处理和分析模块、可视化展示模块和系统管理模块。情感分析方面使用LDA等主题建模技术,结合领域特定词汇进行优化。有可视化大屏。

实现的结果如图所示:

项目工程目录:

具体实现步骤:

一、app.py 后端核心代码

# app.py 后端核心代码
from flask import Flask, render_template, jsonify
import sqlite3
from collections import defaultdict
import jieba
import re

app = Flask(__name__)

# 自定义情感词典(示例)
sentiment_words = {
    '好': 'positive', '不错': 'positive', '推荐': 'positive',
    '差': 'negative', '难吃': 'negative', '投诉': 'negative'
}

# 数据库连接
def get_db():
    conn = sqlite3.connect('reviews.db')
    conn.row_factory = sqlite3.Row
    return conn

# 情感分析函数
def analyze_sentiment(text):
    positive = negative = 0
    words = jieba.lcut(text)
    for word in words:
        if word in sentiment_words:
            if sentiment_words[word] == 'positive':
                positive += 1
            else:
                negative += 1
    if positive > negative:
        return 'positive'
    elif negative > positive:
        return 'negative'
    else:
        return 'neutral'

# 路由定义
@app.route('/')
def dashboard():
    return render_template('dashboard.html')

# 情感分布数据接口
@app.route('/api/sentiment')
def sentiment_data():
    conn = get_db()
    cursor = conn.cursor()
    cursor.execute('SELECT sentiment, COUNT(*) FROM reviews GROUP BY sentiment')
    data = {row[0]: row[1] for row in cursor.fetchall()}
    conn.close()
    return jsonify(data)

# 评分分布接口
@app.route('/api/score_dist')
def score_dist():
    conn = get_db()
    cursor = conn.execute('''
        SELECT score, COUNT(*) as count 
        FROM reviews 
        GROUP BY score ORDER BY score
    ''')
    result = [{'score': row[0], 'count': row[1]} for row in cursor]
    conn.close()
    return jsonify(result)

# 分类统计接口
@app.route('/api/category_stats')
def category_stats():
    conn = get_db()
    cursor = conn.execute('''
        SELECT category, COUNT(*) as count, AVG(score) as avg_score 
        FROM reviews 
        GROUP BY category
    ''')
    result = [{
        'category': row[0],
        'count': row[1],
        'avg_score': round(row[2], 1)
    } for row in cursor]
    conn.close()
    return jsonify(result)

# 关键词提取接口
@app.route('/api/keywords/<type>')
def keywords(type):
    conn = get_db()
    cursor = conn.execute('SELECT content FROM reviews')
    texts = [row[0] for row in cursor.fetchall()]
    
    # 关键词提取逻辑
    keywords = []
    pattern = re.compile(r'服务|态度|热情' if type == 'service' else r'味道|口感|食材')
    for text in texts:
        words = jieba.lcut(text)
        keywords.extend([w for w in words if pattern.search(w)])
    
    # 统计词频
    freq = defaultdict(int)
    for word in keywords:
        freq[word] += 1
    return jsonify([{'name': k, 'value': v} for k, v in freq.items()])

if __name__ == '__main__':
    app.run(debug=True)

二、前端代码

<!-- templates/dashboard.html 前端页面 -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>数据可视化分析系统</title>
    <link rel="stylesheet" href="/static/layui/css/layui.css">
    <script src="/static/echarts.min.js"></script>
    <script src="/static/layui/layui.js"></script>
</head>
<body>
<div class="layui-container">
    <!-- 情感分布 -->
    <div class="layui-row">
        <div class="layui-col-md6">
            <div id="sentimentChart" style="height:400px"></div>
        </div>
        <div class="layui-col-md6">
            <div id="scoreChart" style="height:400px"></div>
        </div>
    </div>

    <!-- 分类统计 -->
    <div class="layui-row">
        <div id="categoryChart" style="height:400px"></div>
    </div>

    <!-- 关键词云 -->
    <div class="layui-row">
        <div class="layui-col-md6">
            <div id="serviceWordcloud" style="height:300px"></div>
        </div>
        <div class="layui-col-md6">
            <div id="tasteWordcloud" style="height:300px"></div>
        </div>
    </div>
</div>

<script>
layui.use(function(){
    const $ = layui.$;
    
    // 情感分布饼图
    const sentimentChart = echarts.init(document.getElementById('sentimentChart'));
    $.get('/api/sentiment', function(data){
        sentimentChart.setOption({
            title: { text: '评论情感分布' },
            series: [{
                type: 'pie',
                data: Object.entries(data).map(([name, value]) => ({name, value}))
            }]
        });
    });

    // 评分分布直方图
    const scoreChart = echarts.init(document.getElementById('scoreChart'));
    $.get('/api/score_dist', function(data){
        scoreChart.setOption({
            title: { text: '评分分布' },
            xAxis: { data: data.map(d => d.score) },
            yAxis: { type: 'value' },
            series: [{
                type: 'bar',
                data: data.map(d => d.count)
            }]
        });
    });

    // 分类统计柱状图
    const categoryChart = echarts.init(document.getElementById('categoryChart'));
    $.get('/api/category_stats', function(data){
        categoryChart.setOption({
            title: { text: '店铺分类统计' },
            tooltip: { trigger: 'axis' },
            xAxis: { data: data.map(d => d.category) },
            yAxis: [{ type: 'value', name: '评论量' }],
            series: [{
                name: '评论量',
                type: 'bar',
                data: data.map(d => d.count)
            }]
        });
    });

    // 服务态度词云
    const serviceWC = echarts.init(document.getElementById('serviceWordcloud'));
    $.get('/api/keywords/service', function(data){
        serviceWC.setOption({
            title: { text: '服务态度关键词' },
            series: [{
                type: 'wordCloud',
                data: data
            }]
        });
    });

    // 菜品口味词云
    const tasteWC = echarts.init(document.getElementById('tasteWordcloud'));
    $.get('/api/keywords/taste', function(data){
        tasteWC.setOption({
            title: { text: '菜品口味关键词' },
            series: [{
                type: 'wordCloud',
                data: data
            }]
        });
    });
});
</script>
</body>
</html>

三、系统运行说明:

  1. 需要安装的依赖:

bash

pip install flask jieba
  1. 目录结构:

├── app.py
├── templates
│   └── dashboard.html
└── static├── layui│   ├── css│   └── js└── echarts.min.js

四、创建DB,插入数据:

import sqlite3
from flask import jsonify#insert data to DB.
def get_db():conn = sqlite3.connect('reviews.db')cursor = conn.cursor()# 创建表create_table_sql = """CREATE TABLE IF NOT EXISTS reviews (id INTEGER PRIMARY KEY,content TEXT,score INTEGER,category TEXT,region TEXT,sentiment TEXT);"""cursor.execute(create_table_sql)conn.commit()  # 提交事务# 插入一些示例数据insert_data_sql = """INSERT INTO reviews (id,content, score, category, region, sentiment)VALUES (1,'这家店的环境非常好,服务也很周到,菜品味道更是一流!', 5, '中餐', '北京', '正面'),(2,'菜品口味太一般了,没什么特色,价格还贵。', 2, '西餐', '上海', '负面');"""cursor.execute(insert_data_sql)conn.commit()  # 提交事务cursor.execute('SELECT sentiment, COUNT(*) FROM reviews GROUP BY sentiment')data = {row[0]: row[1] for row in cursor.fetchall()}print("这是output: "+jsonify(data))conn.row_factory = sqlite3.Rowreturn conn
def main():conn = get_db()cursor = conn.cursor()print("这是主函数的内容。")if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习总结(3)

数据批量的概念 通常来说&#xff0c;深度学习中所有数据张量的第一个轴&#xff08;也就是轴0&#xff0c;因为索引从0开始&#xff09;都是样本轴[samples axis&#xff0c;有时也叫样本维度&#xff08;samples dimension&#xff09;​]​。深度学习模型不会一次性处理整个…

微软庆祝它成立整整50周年

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【操作系统(Linux)】——通过案例学习父子进程的线程异步性

本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的&#xff1a; 创建父子进程&#xff0c;观察父子进程执行的顺序&#xff0c;了解进程执行的异步行为 源代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include…

系统性能核心指标:QPS、TPS、RT、并发量详解

系统性能核心指标&#xff1a;QPS、TPS、RT、并发量详解 1. 引言 在分布式系统、高并发架构设计中&#xff0c;QPS、TPS、RT、并发量 等指标是衡量系统性能的关键。本文深入解析这些术语的定义、计算方法、关联性及优化策略&#xff0c;帮助开发者更好地进行系统性能评估与调…

PortswiggerLab:Exploiting a mass assignment vulnerability

实验目标 To solve the lab, find and exploit a mass assignment vulnerability to buy a Lightweight l33t Leather Jacket. You can log in to your own account using the following credentials: wiener:peter. 官方WP In Burps browser, log in to the application using…

卡尔曼滤波器的工作原理

原文: https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/ 1 概述 你可以对某个动态系统有不确定信息的任何地方使用卡尔曼滤波器&#xff0c;并且对系统下一步的状态做出有根据的猜测。即使出现混乱的现实状态&#xff0c;卡尔曼滤波器都会给出一个合理的结果。…

PDFtk

如果下载的pdf文件有秘钥的话&#xff0c;使用下面linux命令去掉秘钥&#xff1a; pdftk 纳税记录.pdf input_pw 261021 output 纳税记录_output.pdf将多个单页pdf合并为一个pdf的linux命令: pdftk 自然人电子税务局1.pdf 自然人电子税务局2.pdf 自然人电子税务局3.pdf 自然人…

Openlayers:海量图形渲染之WebGL渲染

最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类&#xff0c;可以实现渲染海量的点&#xff0c;之后我又了解到利用WebGLVectorLayer类可以渲…

替换jeecg图标

替换jeecg图标 ant-design-vue-jeecg/src/components/tools/Logo.vue <!-- <img v-else src"~/assets/logo.svg" alt"logo">-->

Codeforces Round 970 (Div. 3)题解

题目地址 https://codeforces.com/contest/2008 锐评 本次D3的前四题还是比较简单的&#xff0c;没啥难度区分&#xff0c;基本上差不多&#xff0c;属于手速题。E的码量比F大一些&#xff0c;实现略显复杂一些。G的数学思维较明显&#xff0c;如果很久没有训练这个知识点&a…

操作系统:线程间同步之事件集

事件集是线程间同步的机制之一&#xff0c;一个事件集可以包含多个事件&#xff0c;利用事件集可以完成一对多、多对多的线程间同步。 目录 一、事件集举例说明 二、事件集工作机制 三、RT-Thread为实例说明 四、事件集的应用场合 一、事件集举例说明 以坐公交车为例&…

基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本钻孔数据管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java语言、Hadoop、数据可视化技术进行编写&#xff0c;使用了Spring Boot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户主要功能包括&…

全双工分轨语音数据集:让AI实现无缝对话

清晨&#xff0c;智能音箱根据指令-播放音乐&#xff1b;驾驶途中&#xff0c;车载助手同步处理导航与来电&#xff1b;智能会议工具无缝切换多语种对话……语音交互技术正快速融入生活。然而&#xff0c;用户对于对话体验追求更自然、更流畅&#xff0c;实时理解&#xff0c;动…

Python 网络请求利器:requests 包详解与实战

诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、安装方式三、基本使用1. 发起 GET 请求2. 发起 POST 请求 四、requests请求调用常用参数1. URL2. 数据data3. 请求头 headers4. 参数 params5. 超时时间 timeout6. 文件上传 file&#xff1a;上传纯文本文件流7. jso…

linux入门四:Linux 编译器

一、C 语言编译器 GCC&#xff1a;开启编程之旅 1.1 GCC 安装&#xff1a;一站式工具链 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 下最常用的 C/C 编译器&#xff0c;支持多种编程语言。安装命令&#xff08;适用于 Debian/Ubuntu 系统&#xff09;&…

建筑兔零基础自学记录69|爬虫Requests-2

Requests库初步尝试 #导入requests库 import requests #requests.get读取百度网页 rrequests.get(http://www.baidu.com) #输出读取网页状态 print(r.status_code) #输出网页源代码 print(r.text) HTTP 状态码是三位数字&#xff0c;用于表示 HTTP 请求的结果。常见的状态码有…

Web测试流程及注意点

在Web工程过程中&#xff0c;基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同&#xff0c;它不但需要检查和验证是否按照设计的要求运行&#xff0c;而且还要测试系统在不同用户的浏览器端的显示是否合适。 重要的是&…

基于MATLAB/simulink的信号调制仿真--AM调制

实验内容&#xff1a; 假设y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;调幅系统&#xff0c;请将一个频率为1000HZ的余弦波信号&#xff0c;通过进行AM调制&#xff0c;载波信号频率为20kHZ的余弦波&#xff0c;调制度ma0.…

通信协议详解(十):PSI5 —— 汽车安全传感器的“抗干扰狙击手”

一、PSI5是什么&#xff1f; 一句话秒懂 PSI5就像传感器界的“防弹信使”&#xff1a;在汽车安全系统&#xff08;如气囊&#xff09;中&#xff0c;用两根线同时完成供电数据传输&#xff0c;即便车祸时线路受损&#xff0c;仍能确保关键信号准确送达&#xff01; 基础概念…

数据结构与算法-图论-复习1(单源最短路,全源最短路,最小生成树)

1. 单源最短路 单一边权 BFS 原理&#xff1a;由于边权为单一值&#xff0c;可使用广度优先搜索&#xff08;BFS&#xff09;来求解最短路。BFS 会逐层扩展节点&#xff0c;由于边权相同&#xff0c;第一次到达某个节点时的路径长度就是最短路径长度。 用法&#xff1a;适用…