恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

云南旅游景点数据分析实战:从数据清洗到可视化看板

  • 首页
  • 资讯中心
  • /
  • 云南旅游景点数据分析实战:从数据清洗到可视化看板

相关资讯

NCBI数据库使用全攻略:从Entrez检索到SRA数据下载与上传找回 2026/9/27 1:18:37
从零开始构建智能Agent:TaoToken统一API接入与配置文件全指南(建议收藏) 2026/9/27 1:18:37
Jetson Orin Nano与Xavier NX选型实战指南:算力之外的关键决策因素 2026/9/27 1:13:37

最新资讯

STM32H743VIT6采购复核:封装与系统边界零风险验证指南
高云FPGA实现高精度逻辑分析仪设计
夏普MX-3618RC彩色复印机开机报可以复印。(需要维护。代码:FK3)如何解决
gitee怎么用?求助大佬
Cursor 点了「Run Everything」仍然每次询问
中兴通讯校招薪资全拆解:岗位、城市、评级如何影响你的offer

今日推荐

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

云南旅游景点数据分析实战:从数据清洗到可视化看板

发布时间:2026/9/27 1:18:37
云南旅游景点数据分析实战:从数据清洗到可视化看板 简介一份围绕云南旅游景点数据分析与可视化的毕业论文文档可供计算机或旅游管理相关专业的学生完成毕业设计、课程论文时参考解决从景点数据处理到可视化系统设计的思路问题。文档从开发背景和国内外现状讲起依次介绍了Python语言、Django框架、MySQL数据库及IDEA开发平台的选择理由并说明了前后端分离架构、首页、用户管理、景点管理和旅游资讯发布等模块。还专门讲解了数据分析与可视化的方法流程包括数据清洗、统计分析以及用图表地图展示结果最后给出了总结与展望。资源包内共1个docx文件大小约2MB包含摘要、关键词、目录、正文与参考文献等完整论文结构。已有188人学习下载对于需要完成类似课题的读者可以直接借鉴系统模块划分、技术选型理由和可视化实现思路减少选题与架构设计阶段的摸索。1. 云南旅游景点数据分析从论文标题到可落地项目差的是数据管道把一份标注着“基于Python的云南旅游景点数据分析与可视化”的docx论文标题抛给我我第一反应不是打开文档而是反问他你手里有没有一份能画出云南地图、能按城市聚合、能解释“为什么丽江口碑高、昆明热度高”的干净数据这个标题真正在讲的是一套“Python 数据分析与可视化”的完整项目链路数据获取、清洗、聚合、绘图、结论解释。它能解决的是旅游从业者、文旅运营人员和做毕业设计的学生最常碰到的问题——信息散落在各平台想得到结论却不知道从哪下手。适合谁适合已经会基础Python语法、想用真实业务数据做一次完整实战的人。先提醒一句热门景区不等于高评分景区这个反直觉结论正是这个项目第一个能写进论文或报告里的洞察。2. 数据准备与字段设计先定数据字典再谈爬虫和可视化标题里带“景点数据分析”第一步不是写爬虫而是想清楚分析什么。我把常见做法拆成三条路第一直接使用公开旅游统计公报和景区名录数据规范但更新慢第二从公开点评平台抓取结构化字段数据鲜活但有合规和反爬风险第三自己造一份带随机种子、量级合理的示例数据先把分析代码和图表跑通再替换真实数据。我之前跑这个方向时选的是第三条路打底再补真实公报做交叉验证。2.1 为什么选云南数据好拿、结论可验证、可视化素材丰富云南这个选题适合做数据项目是因为它的地理层级和旅游数据天然对得上。省内16个市州昆明、大理、丽江、西双版纳、香格里拉、腾冲各有不同的旅游标签景区类型覆盖古城、雪山、雨林、温泉。做出来的地图和柱状图观点一眼能看懂不是那种“为了画图而画图”的产出。另外云南旅游的热度数据在公开平台上有足够的评论量级年接待游客量也有官方统计公报可做交叉验证。标题里写的是“云南旅游景点”不是“全国景点”这说明作者预设的地域边界很清晰。项目能落地的关键也恰恰是把“数据管道”修到云南这一个域内。2.2 数据字典先于代码一张表定下字段与口径我一般会先画一张字段表而不是先写爬虫脚本。原因很简单爬虫爬到一半发现缺字段回头补的代价远大于一开始多写两行。下面这组字段是跑云南景点分析够用的最小集所有后续计算都以它为准字段类型说明来源方式citystr所属市州昆明、大理、丽江等基础字段scenic_namestr景点名称基础字段latitude / longitudefloat景点经纬度地理编码或POI接口star_ratingfloat景区等级3A/4A/5A无等级填0公开名录comment_scorefloat游客评分百分制点评页聚合comment_countint评价数作为热度代理变量点评页聚合avg_pricefloat门票均价订票页结构化字段peak_monthstr主要旺季月份类别业务规则标注这份字典里有两个关键口径需要先定死评分统一转成百分制50分的及格线写法后面才有统一锚点热度不用“游客量”而用“评论数”是因为对普通项目来说评论数更好抓、更新更快。口径一旦定下来后面所有清洗和聚合代码都长在同一个对齐锚点上。2.3 用Python造一份可复现的示例数据numpy加pandas脚本真实数据没到位之前先跑通数据处理链路是最值得的投资。下面这段代码生成500条覆盖10个市州的示例数据带随机种子保证每次运行结果一致省去“为什么换台机器图全变了”的烦躁。import numpy as np import pandas as pd cities [昆明, 大理, 丽江, 西双版纳, 香格里拉, 腾冲, 红河, 玉溪, 曲靖, 怒江] scenic_pool [古城, 雪山, 森林公园, 古镇, 湖泊, 峡谷, 梯田, 温泉, 茶园, 寺庙] np.random.seed(42) # 固定随机种子保证项目可复现 n 500 # 样本规模 city np.random.choice(cities, sizen, p[0.15,0.15,0.12,0.12,0.10, 0.10,0.08,0.08,0.06,0.04]) scenic_name city · np.random.choice(scenic_pool, sizen) latitude np.random.normal(25.5, 2.0, sizen).round(4) longitude np.random.normal(102.5, 3.0, sizen).round(4) star_rating np.random.choice([0, 3, 4, 5], sizen, p[0.2, 0.3, 0.3, 0.2]) comment_score np.random.normal(86, 8, sizen).clip(0, 100).round(1) comment_count np.random.lognormal(5.5, 1.2, sizen).astype(int) 5 avg_price np.random.lognormal(4.2, 0.6, sizen).round(0) df pd.DataFrame({ city: city, scenic_name: scenic_name, latitude: latitude, longitude: longitude, star_rating: star_rating, comment_score: comment_score, comment_count: comment_count, avg_price: avg_price }) df.to_csv(yunnan_scenic_raw.csv, indexFalse, encodingutf-8-sig)这段代码在生成数据时已经埋进了“现实世界”的噪声评分为正态分布且截断在0到100分之间符合点评平台大多数景区集中在75到95分的真实形态评论数用对数正态分布生成模拟少部分头部景区评论过万、大部分景区只有几百条的长尾结构。参数里最值得调的是np.random.seed(42)把随机过程固定后续无论谁运行同一份脚本得到的数据集都一致。p[...]则让城市分布不均昆明和大理占比更高避免生成一份“十城均等”的假数据。注意这份CSV最终用utf-8-sig编码写入是为了让Excel和Windows记事本直接打开不出现中文乱码。如果你想换成真实爬虫数据只要把爬虫结果整理成同样的列名结构后面清洗和可视化代码一行都不用改。3. 数据清洗与聚合用Python把脏数据变成“热度”和“口碑”两个指标很多数据分析的新手在这一步翻车爬下来5000条数据就直接groupby画图图一出来就傻眼。做数据分析与数据挖掘实战项目第一课永远是处理脏数据。所谓“脏”不只是缺失和重复还包括评分口径不统一、评论数极端值把图压扁、同一景点出现两条不同名称的记录。清洗不是论文里的理论章节它是可视化之前必须在本地解决的现实工程问题。3.1 清洗套路去重、补缺、截断异常值常见的数据清洗顺序是先去重、再补缺失、最后截断异常值。不要反过来——如果先截断再做去重可能把“两个名字不同的同一条记录”留下聚合时数据被重复计算。import pandas as pd import numpy as np df pd.read_csv(yunnan_scenic_raw.csv) # 第一步按“城市景点名”去重保留评论数最多的那条记录 df df.drop_duplicates(subset[city, scenic_name], keepfirst) # 第二步缺失值补全 # 评论分缺失用全国中位数补价格缺失用同城市中位数补 df[comment_score] df[comment_score].fillna(df[comment_score].median()) df[avg_price] df[avg_price].fillna( df.groupby(city)[avg_price].transform(median) ) # 第三步截断异常值避免极端值主导图表刻度和肉眼可读性 df[comment_score] df[comment_score].clip(lower0, upper100) df[comment_count] df[comment_count].clip( lowerdf[comment_count].quantile(0.01), upperdf[comment_count].quantile(0.99) ) df.to_csv(yunnan_scenic_clean.csv, indexFalse, encodingutf-8-sig)字段选择上keepfirst保留首条记录在真实场景中不一定对我一般会改成“保留评论数最多的一条”因为评论数越多的记录越可能被完整维护。注释里已经写了这个逻辑你实际执行时可以这样写先按comment_count排序再drop_duplicates。clip的两个参数lower和upper用分位数而不是固定值是为了让1%到99%区间之外的值被拉回边界避免西双版纳某热门景点两万条评论把昆明几百条的散点全部挤压到原点附近。3.2 聚合口径按城市和按景区等级两个维度清洗后的CSV要产生可分析结论需要做两层聚合。第一层按城市看整体口碑和热度分布第二层按景区等级5A/4A/3A/无等级看高等级是否必然等于高口碑。这两层聚合是论文里最稳的两个表格来源。# 城市维度聚合 city_stats df.groupby(city).agg( scenic_num(scenic_name, count), avg_score(comment_score, mean), total_comments(comment_count, sum), avg_price(avg_price, mean) ).reset_index().sort_values(avg_score, ascendingFalse) # 景区等级维度聚合 rating_stats df.groupby(star_rating).agg( count(scenic_name, count), mean_score(comment_score, mean), total_comments(comment_count, sum) ).reset_index()这里有两个需要注意的口径陷阱。第一avg_score用平均分而不是加权平均分会造成小样本景区拖高城市均值比如怒江如果只有两个景点且评分都高它就会排在丽江前面这不符合直觉。稳妥做法是加一层筛选只保留景点数不少于5个的城市再排名。第二star_rating等级为0表示无评级它和3A景区混在一起聚合会拉平均值可视化时建议单独标记为“未评级”而不是算进“3A及以下”。3.3 定义两个核心指标热度与口碑怎么算才不打架论文不能只放“评论数”和“评分”两个原始字段读者看不出结论。常见做法是把它们加工成两个0到100的标准化指标口碑指数直接用comment_score的百分制热度指数用comment_count做min-max归一化。为什么社交平台上有人批评“高热度榜”和“高口碑榜”完全对不上就是因为这两个指标逻辑不同。计算热度时直接除最大值会让头部景区拿到100分但长尾景区可能只有个位数图表区分度很差我一般会先做log1p再归一化。# 热度指数对数压缩 线性归一化到 0~100 df[heat_score] ( (np.log1p(df[comment_count]) - np.log1p(df[comment_count]).min()) / (np.log1p(df[comment_count]).max() - np.log1p(df[comment_count]).min()) * 100 ).round(1) # 口碑-热度四象限用于后续散点图分组 df[quadrant] 普通型 df.loc[(df[heat_score] 60) (df[comment_score] 85), quadrant] 热门口碑型 df.loc[(df[heat_score] 60) (df[comment_score] 85), quadrant] 热门争议型 df.loc[(df[heat_score] 60) (df[comment_score] 85), quadrant] 小众口碑型log1p的参数是加1再取对数专门处理评论数为0的记录60和85的分界线不是拍脑袋是统计两组变量的中位数后取整得到的。想要更严格可以用pd.qcut按四分位数自动切分但论文里可解释性略微下降。四象限的意义在于它让散点图不止是“大点小点”而是直接生成“热门争议型”这种能写进分析结论的分组标签。4. 可视化选型与实现一张云南地图值回票价可视化是这个项目里最出效果、也是最容易把论文做成“大杂烩”的部分。很多Python教程只教语法不教怎么选图表结果就是柱状图、折线图、饼图堆了一页读者看完记不住任何结论。我建议只选三张图云南省地图展示地理分布、热度-价格散点图展示市场结构、TOP15条形图展示头部景区三张图对应三个核心观点。4.1 工具选型matplotlib和pyecharts按使用场景选常见做法是论文终版插图用matplotlib和seaborn黑白打印不失真样式稳定答辩现场或大屏汇报则用pyecharts它生成的交互式HTML适合投屏滚动查看。另外一种组合是pyecharts画地图、matplotlib画散点和柱状图两个库各干各最擅长的事。pyecharts的图表在网页端有悬浮提示地图缩放流畅标签可控matplotlib胜在自由度和论文排版兼容性。我在这个项目里的选择是地图给pyecharts其余全部matplotlib理由只有一个散点图叠加四象限颜色用matplotlib五六行搞定用pyecharts反而要翻文档。4.2 用pyecharts画云南地图市州维度的口碑分布云南地图是这个项目里最出效果的一张图。pyecharts加载“云南”地图时底层需要GeoJSON数据不同版本处理方式差别很大。下面这段代码适用于pyecharts 2.x的标准用法。from pyecharts import options as opts from pyecharts.charts import Map map_data [ [row[city], round(row[avg_score], 2)] for _, row in city_stats.iterrows() ] m ( Map() .add( 口碑均分, map_data, maptype云南, is_map_symbol_showFalse, # 关闭散点标记避免遮挡颜色映射 is_roamFalse, # 关闭缩放拖拽论文截图更干净 ) .set_global_opts( title_optsopts.TitleOpts(title云南各市州景点口碑均分), visualmap_optsopts.VisualMapOpts( min_80, max_90, range_color[#fde725, #5dc863, #21918c], is_piecewiseFalse, # 连续色带适合口碑这类连续指标 ), ) ) m.render(yunnan_map.html)这段代码里有两个参数值得单独说明。is_map_symbol_showFalse把地图上的散点图标关掉很多教程没加这一行结果是云南地图上方铺了一层红点颜色映射基本看不清。min_80和max_90不是什么玄学它是从清洗后的口碑分位数里取出来的查询city_stats[avg_score].quantile([0.1, 0.9])把区间稍微放宽色带才能拉开层次如果你用全量数据的min到max比如60到95的跨度全省基本一个颜色。运行完代码会在本地生成一个yunnan_map.html浏览器打开后悬停可看城市名称和数值。如果地图渲染出来是空白或者报“Map not found”问题基本不在代码而在pyecharts的地图数据文件。2.x版本对省级GeoJSON的注册方式比较麻烦我习惯把离线注册文件放到项目根目录的geo文件夹中通过Map.add前显式注册Geojson。这一点在第五章避坑里会细说。4.3 热度-价格散点图哪些景区“又贵又火”散点图承载的是文章的核心洞见横轴是热度指数纵轴是门票均价点的大小映射评分点的颜色映射四象限。import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] matplotlib.rcParams[axes.unicode_minus] False fig, ax plt.subplots(figsize(10, 6)) scatter ax.scatter( df[heat_score], df[avg_price], sdf[comment_count].apply(lambda x: max(10, x / 50)), cdf[quadrant].map({热门口碑型: #e74c3c, 热门争议型: #f39c12, 小众口碑型: #2ecc71, 普通型: #bdc3c7}), alpha0.6, ) ax.set_xlabel(热度指数对数归一化) ax.set_ylabel(门票均价元) ax.set_title(云南景区热度-价格分布与口碑分组) plt.tight_layout() plt.savefig(heat_price_scatter.png, dpi300)散点图的三个参数是在真实项目里调试最久的。scomment_count/50让评论量最大的景区点直径约为普通景区的3倍这里除以50是调出来的经验值如果点在图中明显过大可以改100alpha0.6让重叠点能透出层次大量中低热度的点叠在一起时可读性好很多。四象限的颜色映射直接来自3.3节生成的quadrant列不需要额外合并数据集。还有一个隐藏坑如果你发现图里中文全是方框那是matplotlib在Linux下找不到中文字体先检查fc-list :langzh没有就安装字体这一条在第五章单独展开。4.4 单景点TOP15条形图论文里最稳妥的一类图地图和散点图都有一定解读门槛条形图则是论文里最安全的一类输出。热度TOP15条形图能让读者在3秒内理解“云南最火的景点是谁”。但要注意条形图和柱状图的方向——景点名称是长文本横置条形名字在Y轴比竖置柱状图可读性强很多。top15 df.nlargest(15, comment_count) fig, ax plt.subplots(figsize(8, 8)) colors plt.cm.viridis(ax.scatter(top15[comment_count], range(len(top15)), ctop15[heat_score]).norm(top15[heat_score])) ax.barh(top15[scenic_name][::-1], top15[comment_count][::-1], colorplt.cm.viridis(0.8)) ax.set_xlabel(评论数条) ax.set_title(云南热门景点 TOP15按评论数) plt.tight_layout() plt.savefig(top15_bar.png, dpi300)这里有一处细节[::-1]把数据倒序排列因为barh的条形图是Y轴自下而上绘制的不做倒序处理时最大值的条形会显示在最底部视觉上很不舒服。颜色统一采用viridis色系的末段色而不是用彩虹色逐条标颜色这是为了打印时省墨、也维持统一的视觉风格。想要更专业一点可以在每条柱子末端标注评论数用ax.text循环加标签即可。5. 云南旅游景点可视化避坑5个高频翻车点与排查方案这一章是血泪经验集。我能理解触到这类项目的痛点的人很多因为这些坑会出现在任何“Python 数据可视化”相关的项目里——地图加载、中文乱码、坐标偏移、长尾数据压扁图表、清洗结果和图表脱节。每一条我都按“现象→原因→解决”的格式写方便你快速对号入座。5.1 pyecharts地图白屏不是代码有问题是地图GeoJSON没注册现象本地打开yunnan_map.html页面是空白浏览器控制台报错类似于Map is not defined。原因pyecharts 2.x版本默认不自带省级GeoJSON数据需要单独注册。很多Python教程里的地图代码能跑是因为运行环境里已经装过额外的地图数据包换一台新电脑就翻车。解决把云南省GeoJSON文件下载后放进项目geo目录注册方式参考下面这段伪代码逻辑——先注册再绘图from pyecharts.datasets import register_url # 实际文件来自本地geo目录不是网络请求 with open(geo/yunnan.json, r, encodingutf-8) as f: register_url(云南, http://127.0.0.1:8000/yunnan.json) # 本地起服务或用DataURI方式这个方法有个别扭的点register_url走的是URL本地文件需要起一个静态服务。我做项目时更常直接用Map.add配合maptype云南若仍报错就用最土但最有效的方法——把地图数据改成“全国”图然后用VisualMapOpts的range_color和region参数只展示云南范围。这个方案不优雅但稳定适合答辩前最后一晚救场。提前一天检查地图能否渲染是唯一可靠的后悔药。5.2 中文乱码和方框编码与字体双重问题现象CSV打开中文乱码matplotlib输出的图片里中文变成一个个方块。原因两个不同坑。CSV乱码是因为没有用utf-8-sig编码写入Windows默认用GBK打开utf-8的BOM缺失时读出来就是乱码。图片中文方框是matplotlib默认字体库在系统里找不到SimHei或微软雅黑。解决写入CSV时统一encodingutf-8-sigmatplotlib侧写入字体配置import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, Noto Sans CJK SC] matplotlib.rcParams[axes.unicode_minus] False三组字体按顺序回退Windows走SimHeiLinux走Noto Sans CJK SC。如果你在云服务器上画图没装任何中文字体直接apt install fonts-noto-cjk装完重跑即可。5.3 坐标偏移国内POI数据和底图坐标系不匹配现象散点图上的景点位置整体偏到山沟里或者地图上标注的丽江古城落在城外两公里。原因国内大多数POI接口返回的是GCJ-02坐标火星坐标系而pyecharts地图底图用的经纬度基准是WGS84。两个坐标系之间存在几十到几百米的偏差放到市级地图上不明显放到景区级别的小比例尺图上就非常突出。解决在清洗阶段就把坐标统一转换。常见做法是维护一个gcj02_to_wgs84函数网上流传的版本就是把火星坐标做一次偏心校正。我不建议用复杂的库十几行函数足够。import math def gcj02_to_wgs84(lng, lat): a 6378245.0 ee 0.00669342162296594323 dlat _transform_lat(lng - 105.0, lat - 35.0) dlng _transform_lng(lng - 105.0, lat - 35.0) radlat lat / 180.0 * math.pi magic math.sin(radlat) magic 1 - ee * magic * magic sqrtmagic math.sqrt(magic) dlat (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * math.pi) dlng (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * math.pi) return lng dlng, lat - dlat这个函数不需要理解内部球体模型也能用。它接受GCJ-02经纬度返回WGS84经纬度。使用方法是在清洗脚本里对latitude和longitude列逐行转换转换后的列加后缀_wgs84再供图表使用。需要注意的是这个公式依赖固定参考点全国各地误差不完全一致但对云南这一地域范围来说足够可靠。5.4 长尾数据把图表压扁先看分布再决定要不要截断现象热度散点图中90%的点堆在左下角一个小区域个别点飞在右上角整张图的信息量约等于零。原因评论数量级差异过大。头部景区上万条长尾景区几十条线性坐标直接画长尾必然被压扁。解决不仅做log1p变换还要观察变换后的分布图再决定坐标轴范围。我通常先跑一行df[log_count] np.log1p(df[comment_count]) df[log_count].hist(bins40)如果直方图显示大部分点在5到8之间、尾部在11以上按0.01到0.99分位数截断后再绘图。如果截断后仍然偏斜要考虑用pandas.cut把热度分箱成“高/中/低”三个等级用颜色表达而不是用位置表达。5.5 清洗逻辑更新后图表没同步数据和图形耦合太深现象改了清洗脚本后发现图还是旧数据或者直接把两个脚本放在同一个文件里跑中间任何一步报错图就全没输出。原因数据分析项目中常见的架构问题——清洗脚本和绘图脚本混在一起函数内部直接引用了清洗前的DataFrame变量。解决强制把清洗结果落盘绘图脚本单独读CSV。清洗输出yunnan_scenic_clean.csv绘图脚本开头只保留一行pd.read_csv。这样既隔离了报错范围也让论文每一张图都能追溯数据版本。我自己的习惯是加点版本号清洗输出存成yunnan_scenic_clean_v2.csv图表的图注里同步标注数据日期答辩时这个细节能给评审留下深刻印象。6. 进阶技巧从单张静态图升级成可筛选的“数据看板”到这里你已经有了清洗后的CSV、三张核心图表和一个可以写进论文的结论。下一步我想把它升级成一个真正能被翻来覆去查看的轻量“数据看板”用Flask暴露一个简单的数据API前端用pyecharts读取接口按城市切换图表。数据看板不是大屏但它的交互价值在于——论文答辩时评审问一句“那大理的数据单独看不呢”你在浏览器下拉选择“大理”图表实时切换比返回到脚本里改参数重跑一遍体面得多。首选方案是Flask加少量JavaScript听起来要写前端其实后端模板里嵌一个pyecharts的Page就能解决大半需求。最小实现如下先把聚合结果按城市存成JSON接口再在HTML里加载地图脚本。from flask import Flask, jsonify import pandas as pd app Flask(__name__) df pd.read_csv(yunnan_scenic_clean.csv) app.route(/api/city/city) def city_snapshot(city): rows df[df[city] city] return jsonify({ scenic_num: len(rows), avg_score: round(rows[comment_score].mean(), 2), total_comments: int(rows[comment_count].sum()), top_scenic: rows.nlargest(3, comment_count)[scenic_name].tolist() }) if __name__ __main__: app.run(debugFalse, port5000)这份接口代码返回的是一个城市的场景快照景点数量、平均口碑、总评论数和TOP3景点名。前端拿到数据后可以直接拼装成卡片的HTML文本也可以把数值喂给ECharts重新渲染。这里的要点是debugFalse——调试时你可以开True但部署展示时一定关掉否则刷新页面容易暴露出栈信息。做完看板之后不要忘了验证数据可信度。我的习惯是把聚合结果和云南省的公开统计公报数字对一遍公报说某市年接待游客量是5000万再看评论总数是否在同一量级差了一个数量级以上一定是数据口径出了问题。相关性验证也可以做把城市维度的热度指数和百度指数月均值做一次Spearman相关相关度高于0.6基本能说明这一套数据管道是靠谱的。我现在的习惯是任何数据项目开工前先强制自己写一份数据字典清洗和绘图必须分离成两个脚本。抓到数据先画分布图再谈结论这句话我吃了无数次亏才真正听进去。沿着这套方案把云南旅游景点分析做下来你会得到一份能复现的本地项目也顺带把“数据管道”这个词变成了自己的实操能力。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号