FEATURED · 精选文章

Flask+ECharts构建数据分析可视化项目:从零到一实战指南

发布时间 / 2026/8/24 4:50:28
来源 / 创域科博编辑部
栏目 / 资讯中心
Flask+ECharts构建数据分析可视化项目:从零到一实战指南 1. 这个项目到底能帮你解决什么问题如果你正在找一份数据分析相关的实习或工作或者你的毕业设计需要一个能体现完整技术栈的实战案例那么这个“泡泡玛特热搜评论数据分析可视化”项目就是一个非常典型的、可以直接放进简历的“敲门砖”项目。它解决的核心问题很明确如何将零散的、非结构化的网络评论数据通过一套完整的流程变成一个可以交互、可以展示洞察的可视化网页应用。这几乎是所有数据分析岗位面试官最想看到的技能闭环数据获取、清洗、分析、可视化、以及最终通过一个Web应用呈现出来。这个项目用到的技术栈非常经典且实用Python3数据分析的绝对主力语言。Flask一个轻量级的Python Web框架非常适合快速构建后端API和数据服务学习成本远低于Django但足以支撑一个完整的数据展示项目。ECharts百度开源的前端可视化库图表类型丰富交互性强文档和社区都非常活跃是数据可视化项目的首选。这个案例的价值不在于分析泡泡玛特这个具体品牌而在于它提供了一个可复用的项目骨架。你完全可以把数据源换成其他电商评论、社交媒体话题、或者你自己的业务数据整个项目的流程和代码结构几乎不用大改。所以无论你是想学习如何将数据分析结果“产品化”还是急需一个能证明自己全栈偏后端能力的项目这个案例都值得你花时间从头到尾跟做一遍。下面我就以一个实际开发者的视角带你拆解这个项目的关键环节和避坑点。2. 动手之前先理清项目架构和准备环境在写第一行代码之前我们必须先想清楚整个项目是怎么跑起来的。一个清晰的架构能帮你避免后期代码混乱、前后端数据对不上的问题。这个项目的典型架构是“前后端松耦合”模式虽然不是严格的前后端分离比如用Vue/React但思想是一致的后端 (Flask)提供数据。它不负责渲染网页而是提供纯净的JSON格式的数据接口API。前端 (HTML ECharts)请求数据并渲染图表。通过JavaScript调用后端API拿到数据然后用ECharts绘制成图表。环境准备清单在你开始之前请确保你的电脑上已经准备好以下东西。我建议先别急着装所有库按需安装更清晰。Python 3.7这是基础。用python --version检查一下。代码编辑器VS Code、PyCharm 都可以选你顺手的。虚拟环境强烈推荐为这个项目创建一个独立的Python环境避免包版本冲突。# 在项目根目录下执行 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate核心Python库在激活的虚拟环境中安装。pip install flask pandas jiebaflask: Web框架。pandas: 数据分析核心用于数据清洗、处理和聚合。jieba: 中文分词库用于对评论进行词频分析。前端资源ECharts不需要用pip安装。我们直接在HTML里通过CDN引入这是最简单的方式。!-- 在HTML文件的head中引入 -- script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script关于数据源原始材料没有提供具体的数据集。在实际操作中你可以通过公开的电商平台评论接口需遵守平台规则、网络爬虫注意合规与频率或直接使用模拟数据来获得“泡泡玛特热搜评论”数据。为了项目能跑通我们可以先创建一个简单的comments.csv文件来模拟数据。comments.csv示例结构id,product_name,comment,rating,comment_time 1,DIMOO星座系列盲盒,“手感太好了抽到了隐藏款”,5,2023-10-01 14:30:00 2,MOLLY的一天,“做工一般有点小瑕疵但造型可爱。”,3,2023-10-02 09:15:00 3,SKULLPANDA密林古堡,“设计绝了细节满满就是有点贵。”,4,2023-10-02 16:45:00 ...更多模拟数据数据字段可以包括评论ID、产品名称、评论内容、评分1-5分、评论时间等。有了这个结构我们的分析方向如评分分布、词云、时间趋势就有了依托。3. 后端开发用Flask搭建数据API后端的工作是“做饭”把生数据raw data加工成前端可以直接“吃”的格式JSON。我们分几步走。3.1 项目目录结构先建立一个清晰的目录这是好习惯。bubble_mart_analysis/ ├── app.py # Flask主程序 ├── data/ │ └── comments.csv # 你的数据文件 ├── templates/ │ └── index.html # 前端页面 └── static/ # 可放CSS、JS等静态文件本项目简单暂不用3.2 编写Flask主程序 (app.py)Flask的核心是定义路由URL和对应的处理函数。我们将创建几个API接口分别提供不同的分析数据。from flask import Flask, render_template, jsonify import pandas as pd import jieba from collections import Counter import json app Flask(__name__) # 1. 加载数据这里假设数据文件在项目根目录 def load_data(): # 实际项目中这里可能是从数据库读取 df pd.read_csv(data/comments.csv, encodingutf-8) # 确保时间列是datetime类型 df[comment_time] pd.to_datetime(df[comment_time]) return df # 2. 首页路由渲染前端页面 app.route(/) def index(): return render_template(index.html) # 3. API接口1提供评分分布数据 app.route(/api/rating_distribution) def get_rating_distribution(): df load_data() # 计算每个评分的数量 rating_counts df[rating].value_counts().sort_index() # 转换成ECharts需要的格式[评分, 数量] data [{value: int(count), name: f{rating}星} for rating, count in rating_counts.items()] return jsonify({data: data}) # 4. API接口2提供评论词云数据 app.route(/api/word_cloud) def get_word_cloud(): df load_data() all_comments .join(df[comment].dropna().astype(str).tolist()) # 使用jieba分词并过滤掉一些无意义的词停用词 words jieba.lcut(all_comments) # 一个简单的停用词列表实际项目中应该更完善 stopwords [的, 了, 和, 是, 就, 都, 而, 及, 与, 在, 对, 我, 有, 很] filtered_words [w for w in words if len(w) 1 and w not in stopwords] # 统计词频 word_counts Counter(filtered_words).most_common(50) # 取前50个高频词 # 转换成ECharts词云需要的格式[{name: 词, value: 频次}, ...] data [{name: word, value: count} for word, count in word_counts] return jsonify({data: data}) # 5. API接口3提供评论时间趋势数据按天聚合 app.route(/api/comment_trend) def get_comment_trend(): df load_data() # 按天聚合评论数量 df[date] df[comment_time].dt.date daily_counts df.groupby(date).size() # 转换成ECharts折线图需要的格式x轴日期列表y轴数量列表 dates [str(date) for date in daily_counts.index] counts daily_counts.values.tolist() return jsonify({dates: dates, counts: counts}) if __name__ __main__: # debugTrue 方便开发时热重载和看错误信息生产环境要关掉 app.run(debugTrue, port5000)关键点解释app.route(‘/api/xxx’)这行代码定义了API的访问地址。前端通过访问http://localhost:5000/api/rating_distribution就能拿到JSON数据。jsonify()Flask提供的函数将Python字典或列表转换成JSON格式的HTTP响应。数据聚合逻辑这是后端数据分析的核心。我们用了pandas的value_counts(),groupby()等方法高效地完成了计数和分组操作。在实际面试中你能清晰讲出这里的数据处理逻辑是很大的加分项。分词处理词云数据生成部分jieba.lcut()进行分词Counter统计词频再过滤掉无意义的“停用词”这是中文文本分析的常规操作。4. 前端开发用ECharts绘制动态图表前端的工作是“摆盘和展示”。我们用HTML搭建一个简单页面然后用JavaScript调用上面写好的API并用ECharts渲染图表。4.1 编写前端页面 (templates/index.html)这个文件是页面的骨架和大脑。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title泡泡玛特热搜评论数据分析/title !-- 引入 ECharts -- script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script !-- 引入 jQuery 方便发起AJAX请求非必须可用原生fetch但jQuery更简洁 -- script srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js/script style body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; } .container { max-width: 1200px; margin: auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } h1 { text-align: center; color: #333; } .chart-container { width: 100%; height: 400px; margin-bottom: 40px; } .row { display: flex; flex-wrap: wrap; justify-content: space-between; } .col { flex: 1; min-width: 300px; margin: 10px; } /style /head body div classcontainer h1泡泡玛特热搜评论数据分析看板/h1 p styletext-align: center; color: #666;基于Flask ECharts构建 | 数据为模拟示例/p div classrow div classcol h3用户评分分布/h3 div idchartRating classchart-container/div /div div classcol h3评论内容词云/h3 div idchartWordCloud classchart-container/div /div /div div classrow div classcol styleflex: 2; min-width: 600px; h3评论数量时间趋势/h3 div idchartTrend classchart-container/div /div /div /div script // 页面加载完成后执行 $(document).ready(function() { // 1. 初始化ECharts实例 var chartRating echarts.init(document.getElementById(chartRating)); var chartWordCloud echarts.init(document.getElementById(chartWordCloud)); var chartTrend echarts.init(document.getElementById(chartTrend)); // 2. 定义各图表的配置项先定义空的等数据回来再填充 var optionRating { title: { text: 评分分布, left: center }, tooltip: { trigger: item }, legend: { orient: vertical, left: left }, series: [{ name: 评分, type: pie, radius: 50%, data: [], // 数据留空从API获取 emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.5) } } }] }; var optionWordCloud { title: { text: 评论高频词, left: center }, tooltip: {}, series: [{ type: wordCloud, shape: circle, sizeRange: [20, 80], // 词语字体大小范围 rotationRange: [-45, 90], gridSize: 8, drawOutOfBound: false, textStyle: { color: function () { return rgb( [ Math.round(Math.random() * 160), Math.round(Math.random() * 160), Math.round(Math.random() * 160) ].join(,) ); } }, data: [] // 数据留空从API获取 }] }; var optionTrend { title: { text: 评论时间趋势, left: center }, tooltip: { trigger: axis }, xAxis: { type: category, data: [] }, // x轴数据留空 yAxis: { type: value }, series: [{ name: 评论数, type: line, smooth: true, data: [], // y轴数据留空 markPoint: { data: [ {type: max, name: 最大值}, {type: min, name: 最小值} ] }, markLine: { data: [ {type: average, name: 平均值} ] } }] }; // 3. 发起AJAX请求获取数据并更新图表 // 3.1 获取评分分布数据 $.getJSON(/api/rating_distribution, function(resp) { optionRating.series[0].data resp.data; // 填充饼图数据 chartRating.setOption(optionRating); }); // 3.2 获取词云数据 $.getJSON(/api/word_cloud, function(resp) { optionWordCloud.series[0].data resp.data; // 填充词云数据 chartWordCloud.setOption(optionWordCloud); }); // 3.3 获取时间趋势数据 $.getJSON(/api/comment_trend, function(resp) { optionTrend.xAxis.data resp.dates; // 填充x轴日期 optionTrend.series[0].data resp.counts; // 填充y轴数量 chartTrend.setOption(optionTrend); }); // 4. 响应窗口大小变化重绘图表 window.onresize function() { chartRating.resize(); chartWordCloud.resize(); chartTrend.resize(); }; }); /script /body /html关键点解释CDN引入通过CDN引入ECharts和jQuery无需本地下载简化部署。图表容器每个图表都需要一个具有明确id和尺寸的div作为容器。ECharts初始化echarts.init(document.getElementById(‘…’))将容器初始化为一个图表实例。配置项 (Option)这是ECharts的核心定义了图表的类型、样式、数据等。我们先把数据部分留空data: []。AJAX异步请求使用$.getJSON()jQuery方法异步调用我们写好的Flask API (/api/xxx)。请求成功后在回调函数function(resp)中将返回的JSON数据resp.data填充到对应图表的配置项里然后通过chart.setOption(option)重绘图表。响应式window.onresize事件监听窗口变化调用chart.resize()使图表自适应新尺寸。5. 运行、验证与排查5.1 启动项目并验证启动Flask后端在项目根目录下确保虚拟环境已激活运行python app.py你应该看到类似输出* Running on http://127.0.0.1:5000/ (Press CTRLC to quit)访问页面打开浏览器访问http://127.0.0.1:5000。如果一切正常你将看到一个包含三个动态图表的页面。饼图展示评分分布词云展示高频词汇折线图展示评论时间趋势。检查数据流打开浏览器的“开发者工具”F12切换到“网络”(Network) 标签页。刷新页面你会看到浏览器自动发起了三个请求到/api/rating_distribution、/api/word_cloud和/api/comment_trend。点击这些请求在“响应”(Response) 标签页里你应该能看到后端返回的纯净JSON数据。这是前后端分离的关键证据也是你面试时可以展示的亮点。5.2 常见问题与排查顺序项目跑不起来图表不显示按这个顺序排查Flask服务启动失败报错ModuleNotFoundError: No module named ‘flask’原因没在虚拟环境中安装包或者虚拟环境没激活。解决确认命令行提示符前有(venv)字样然后重新pip install flask pandas jieba。报错Address already in use原因5000端口被占用。解决在app.run(port5001)中换一个端口或者去任务管理器/活动监视器关闭占用5000端口的进程。页面能打开但图表空白或报错打开浏览器开发者工具看“控制台”(Console) 有无红色报错。错误Failed to load resource: the server responded with a status of 404 (NOT FOUND)原因前端请求的API地址不对或者后端没有定义这个路由。解决核对app.py中的app.route(‘/api/xxx’)和index.html中$.getJSON(‘/api/xxx’)的地址是否完全一致包括大小写。错误Failed to load resource: the server responded with a status of 500 (INTERNAL SERVER ERROR)原因后端Python代码有错误比如文件路径不对、pandas读数据出错、分词出错。解决这是最重要的排查步骤回头看启动Flask的命令行窗口里面会有详细的Python错误堆栈信息。根据错误信息定位代码行比如检查data/comments.csv文件是否存在、编码是否正确、数据格式是否和代码处理逻辑匹配。图表容器没高度检查HTML中div id”chartRating” class”chart-container”对应的CSS.chart-container是否设置了height我们设置了400px。没有高度ECharts无法渲染。数据显示了但图表样式不对或数据奇怪词云只显示方框不显示汉字可能是字体问题。可以在optionWordCloud的textStyle里添加fontFamily: ‘Microsoft YaHei’, ‘Arial’, sans-serif指定字体。折线图X轴日期挤在一起数据点过多。可以在后端聚合时按“周”或“月”聚合而不是“天”。或者使用ECharts的dataZoom组件让用户手动缩放查看。评分分布饼图数据为0检查comments.csv中rating列的值是否在1-5之间是否是整数。value_counts()对非预期值如空值、字符串会忽略。6. 项目扩展与优化思路让简历更出彩一个能跑通的基础项目只是开始。要让它在简历和面试中脱颖而出你需要展示“思考”和“拓展”能力。这里有几个方向6.1 数据分析维度深化情感分析不要只做词频。使用snownlp或paddlenlp等库对每条评论进行情感倾向分析正面/负面/中性然后可视化情感分布和随时间的变化。产品维度对比分析不同产品系列如DIMOO、MOLLY、SKULLPANDA的评分均值、评论数、情感得分用柱状图或雷达图进行对比。关键词与评分关联分析出现“做工”、“手感”、“隐藏款”、“瑕疵”等关键词的评论其平均评分是否有显著差异。6.2 后端性能与工程化数据库集成将数据从CSV文件迁移到SQLite轻量或MySQL/PostgreSQL。使用SQLAlchemy等ORM框架进行数据操作这样更贴近真实生产环境。数据缓存对于计算成本较高的分析如全量词频统计可以使用Flask-Caching将结果缓存一段时间如5分钟避免每次请求都重复计算提升API响应速度。API文档使用Flask-RESTX或Swagger自动生成API接口文档让前端或你自己一目了然。6.3 前端交互增强图表联动在ECharts中实现图表间的联动。例如点击饼图中的“5星”部分折线图动态过滤出只包含5星评论的时间趋势。这需要后端API支持过滤查询参数如/api/comment_trend?rating5。增加筛选控件在页面添加下拉框或日期选择器让用户可以选择特定产品系列、时间范围进行查看。前端将筛选条件作为参数传递给后端API后端动态过滤数据并返回。使用Vue.js/React重构前端如果你正在学习现代前端框架可以将这个项目作为练手。用Flask只提供纯JSON API前端用Vue/React构建单页面应用SPA这是更标准的企业级前后端分离架构。6.4 部署上线本地到公网使用ngrok或localtunnel等工具将本地的localhost:5000临时暴露到一个公网网址方便在手机上看或分享给他人。简单服务器部署购买一台最基础的云服务器如腾讯云、阿里云的轻量应用服务器将代码上传安装Python环境用gunicorn替代Flask自带的开发服务器来运行应用并用nginx做反向代理。这个过程能极大加深你对Web应用部署的理解。这个项目就像一棵技能树的主干以上每一个扩展点都是一条可以深入探索的分支。在简历或面试中你不需要把所有扩展都做完但你可以清晰地描述这个基础项目并针对其中一两个点阐述你的优化思路和实现方案这足以证明你不仅会写代码更具备解决复杂问题和持续迭代的能力。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻