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.pswp.cn/bicheng/76235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76235.shtml
英文地址,請注明出處:http://en.pswp.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;適用…