ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

南京二手房数据采集清洗与可视化:Python毕设全流程实战

南京二手房数据采集清洗与可视化:Python毕设全流程实战 简介这份资源是面向计算机相关专业学生与项目实战学习者的毕业设计完整资料包主题为基于Python的南京二手房数据采集及可视化分析可用于毕业设计、课程设计或期末大作业代码经导师指导并通过评审适合零基础小白上手运行。包内共156个文件涵盖18个py脚本、18个csv数据集、65个png图表、15个html页面及11个js文件另有pptx答辩资料与ini配置、txt说明等压缩包约39.99MB目录结构清晰便于按模块查阅。目前已有81人学习下载。资料完整覆盖数据采集、清洗与可视化全流程csv文件包含原始与清洗后的多版本二手房数据py脚本对应爬取与处理逻辑png与html则呈现分析图表和可视化页面配合答辩文档可帮助读者快速理解项目结构、复现实验过程并梳理答辩思路适合需要完整项目参考与实战练习的学习者。1. 南京二手房数据从采集到可视化一份能跑通的毕设工程拆解南京二手房这个选题在计算机毕设里出现频率极高原因很直接数据源公开、字段结构清晰、可视化维度丰富答辩时老师能一眼看懂你在做什么。但真正动手做过的人都知道从网页上把房源信息抓下来只是第一步后面还有编码乱码、字段清洗、数据库入库、图表渲染一连串环节任何一个卡住都够折腾一整天。这份资源打包了一套完整的 Python 二手房数据采集与可视化分析工程包含原始 CSV、清洗后数据、数据库文件和答辩资料适合正在做毕业设计、课程大作业或想练手数据分析全流程的人。它最大的价值不是代码有多复杂而是把「采集→清洗→存储→可视化」这条链路完整跑通了你拿到手就能对照复现不用从零搭架子。2. 数据文件与编码体系先搞清楚你手里有什么2.1 原始数据与清洗数据的对应关系这份资源里的 CSV 文件命名本身就透露了处理流程。ershoufang-origin-utf8.csv和ershoufang-origin-ansi.csv是同一批原始数据的两种编码版本ershoufang-clean-utf8-v1.1.csv和ershoufang-clean-ansi-v1.1.csv则是对应的清洗后版本。另外还有一个ershoufang - 20000.csv从命名看是约两万条记录的规模ershoufang.csv可能是最终合并或去重后的主表。为什么要同时保留 UTF-8 和 ANSI 两个版本这是血泪经验。Python 在 Windows 下用 pandas 读 CSV默认编码经常不是 UTF-8如果文件本身是 ANSIGBK编码而你用 UTF-8 去读中文列名和区域字段直接变乱码后面所有分组统计全废。反过来如果你在 Linux 或 Mac 上处理UTF-8 才是默认。所以这套资源把两种编码都备了一份你在哪个环境跑就选对应的文件。文件名编码用途建议使用场景ershoufang-origin-utf8.csvUTF-8原始采集数据Linux/Mac 或已配置 UTF-8 的 Windowsershoufang-origin-ansi.csvANSI/GBK原始采集数据默认中文 Windows 环境ershoufang-clean-utf8-v1.1.csvUTF-8清洗后数据直接用于分析和可视化ershoufang-clean-ansi-v1.1.csvANSI/GBK清洗后数据默认中文 Windows 环境ershoufang - 20000.csv视具体文件而定约两万条记录中等规模测试或完整分析ershoufang.csv视具体文件而定主表/合并表最终分析入口2.2 用 pandas 统一读取不同编码的 CSV不管你拿到的是哪个版本第一步都是把它正确读进 DataFrame。下面这段代码是我一般会先跑的探测逻辑自动尝试常见编码避免手动猜。import pandas as pd def read_csv_smart(filepath): 依次尝试 UTF-8 和 GBK 编码读取 CSV返回第一个成功的 DataFrame encodings [utf-8, gbk, gb18030, ansi] for enc in encodings: try: df pd.read_csv(filepath, encodingenc) print(f成功读取: {filepath}编码: {enc}形状: {df.shape}) return df except (UnicodeDecodeError, LookupError): continue raise ValueError(f无法读取文件: {filepath}请检查编码) # 读取清洗后的 UTF-8 版本 df read_csv_smart(ershoufang-clean-utf8-v1.1.csv) print(df.head()) print(df.columns.tolist())逻辑说明read_csv_smart按 UTF-8 → GBK → GB18030 → ANSI 的顺序尝试哪个不报UnicodeDecodeError就用哪个。gb18030是 GBK 的超集覆盖更多生僻字。参数方面pd.read_csv的encoding参数直接决定了解码方式如果你明确知道文件是 UTF-8直接写encodingutf-8就行不用走这个函数。读取成功后先看df.shape和df.columns确认列名没有乱码、行数符合预期再往下做分析。注意如果列名出现\ufeff前缀说明文件带 BOM 头用encodingutf-8-sig读取即可消除。3. 数据清洗与字段处理把脏数据变成能分析的表格3.1 二手房数据里最常见的四类脏数据南京二手房数据从页面采集下来原始字段通常包括小区名称、区域、户型、面积、楼层、朝向、装修、总价、单价、挂牌时间等。这些字段里最容易出问题的有四类第一类是价格字段带单位。比如「320万」「45000元/平米」直接当字符串存着没法做数值计算必须把「万」「元/平米」这些后缀剥掉再转 float。第二类是面积字段带「平米」「㎡」等不同写法同样需要统一。第三类是区域字段不规整比如「江宁区」「江宁」「南京市江宁区」混在一起分组统计时会散成多个组。第四类是缺失值有些房源没写朝向或装修采集下来就是空字符串或 NaN。3.2 用 pandas 做字段清洗的完整脚本下面这段清洗脚本覆盖了上面四类问题你可以直接拿去改字段名适配自己的数据。import pandas as pd import numpy as np import re df pd.read_csv(ershoufang-clean-utf8-v1.1.csv, encodingutf-8) # 1. 价格字段去掉「万」「元/平米」等后缀转为数值 def parse_price(val): 将 320万 转为 320.045000元/平米 转为 45000.0 if pd.isna(val): return np.nan val str(val).strip() val re.sub(r[万万元/平米㎡\s], , val) try: return float(val) except ValueError: return np.nan df[总价_万] df[总价].apply(parse_price) df[单价_元] df[单价].apply(parse_price) # 2. 面积字段统一去掉「平米」「㎡」 df[面积_平米] df[面积].astype(str).str.replace(r[平米㎡\s], , regexTrue) df[面积_平米] pd.to_numeric(df[面积_平米], errorscoerce) # 3. 区域字段统一加上「区」后缀去掉「南京市」前缀 def normalize_district(val): if pd.isna(val): return np.nan val str(val).strip() val val.replace(南京市, ).replace(南京, ) if not val.endswith(区) and val in [江宁, 鼓楼, 玄武, 秦淮, 建邺, 栖霞, 雨花台, 浦口, 六合, 溧水, 高淳]: val val 区 return val df[区域_标准化] df[区域].apply(normalize_district) # 4. 缺失值处理关键字段缺失的行直接丢弃 before len(df) df.dropna(subset[总价_万, 面积_平米, 区域_标准化], inplaceTrue) after len(df) print(f清洗前 {before} 行清洗后 {after} 行丢弃 {before - after} 行) # 5. 异常值过滤单价低于 5000 或高于 150000 的视为异常 df df[(df[单价_元] 5000) (df[单价_元] 150000)] print(f异常值过滤后剩余 {len(df)} 行) df.to_csv(ershoufang_cleaned_final.csv, indexFalse, encodingutf-8-sig)逻辑说明parse_price用正则把中文单位和空格全部去掉再尝试转 float转不了就返回 NaN。normalize_district先去掉「南京市」前缀再检查是否以「区」结尾不是就补上。dropna的subset参数指定只检查关键列避免因为某个非关键字段缺失就丢掉整行。最后的异常值过滤用单价上下界卡一道5000 以下和 150000 以上在南京二手房市场基本不合理可能是采集错误或特殊房源。参数方面to_csv的encodingutf-8-sig会带 BOM 头用 Excel 打开不会乱码但如果你后续还要用 pandas 读记得用utf-8-sig而不是utf-8。indexFalse表示不把行号写进文件避免多出一列无意义的索引。提示清洗后的行数变化要记录在答辩材料里老师经常会问「你丢了多少数据为什么丢」有数字比空口说「做了一些清洗」可信得多。4. 可视化分析与数据库入库让数据开口说话4.1 南京二手房的核心分析维度数据清洗完接下来就是出图。南京二手房分析通常围绕这几个维度展开各区域均价对比、面积与总价的散点分布、户型分布饼图、楼层与单价的关系、挂牌时间趋势。这些图用 matplotlib 或 pyecharts 都能做matplotlib 更适合写进论文pyecharts 适合答辩演示时交互展示。下面这段代码用 matplotlib 画一张区域均价柱状图同时把清洗后的数据写入 SQLite 数据库方便后续用 SQL 做更灵活的查询。import pandas as pd import matplotlib.pyplot as plt import sqlite3 # 设置中文字体Windows 用 SimHeiMac 用 Arial Unicode MS plt.rcParams[font.sans-serif] [SimHei, Arial Unicode MS] plt.rcParams[axes.unicode_minus] False df pd.read_csv(ershoufang_cleaned_final.csv, encodingutf-8-sig) # 1. 各区域均价柱状图 district_price df.groupby(区域_标准化)[单价_元].mean().sort_values(ascendingFalse) fig, ax plt.subplots(figsize(12, 6)) bars ax.bar(district_price.index, district_price.values, color#4C72B0) ax.set_title(南京各区域二手房均价对比, fontsize16) ax.set_xlabel(区域, fontsize12) ax.set_ylabel(均价元/平米, fontsize12) ax.tick_params(axisx, rotation45) # 在柱子上标注数值 for bar in bars: height bar.get_height() ax.text(bar.get_x() bar.get_width() / 2, height, f{height:.0f}, hacenter, vabottom, fontsize9) plt.tight_layout() plt.savefig(district_price.png, dpi150) plt.show() # 2. 写入 SQLite 数据库 conn sqlite3.connect(ershoufang.db) df.to_sql(house, conn, if_existsreplace, indexFalse) print(已写入数据库表名: house) # 3. 用 SQL 查一下各区域房源数量 result pd.read_sql(SELECT 区域_标准化, COUNT(*) as 数量 FROM house GROUP BY 区域_标准化 ORDER BY 数量 DESC, conn) print(result) conn.close()逻辑说明groupby(区域_标准化)[单价_元].mean()按区域分组求均价sort_values(ascendingFalse)让柱子从高到低排列视觉上更直观。plt.rcParams那两行是解决 matplotlib 中文显示方块问题的标配Windows 下SimHei一般都有Mac 下用Arial Unicode MS。to_sql的if_existsreplace表示每次运行都重建表避免重复插入如果你要增量追加改成append。参数方面figsize(12, 6)控制图片宽高比dpi150决定输出分辨率论文里一般 150 到 300 够用。ax.text在每根柱子顶部标数值方便读者直接读数不用对着 Y 轴估。4.2 数据库表结构与查询优化SQLite 作为毕设项目的存储方案足够用不需要额外装 MySQL 或 PostgreSQL。写入后的house表字段就是 DataFrame 的列你可以用任何 SQL 客户端打开ershoufang.db查看。如果数据量到两万条以上建议在区域_标准化和单价_元上建索引查询会快很多。CREATE INDEX IF NOT EXISTS idx_district ON house(区域_标准化); CREATE INDEX IF NOT EXISTS idx_price ON house(单价_元); -- 查询均价最高的五个区域及其房源数 SELECT 区域_标准化, COUNT(*) AS 房源数, ROUND(AVG(单价_元), 0) AS 均价 FROM house GROUP BY 区域_标准化 ORDER BY 均价 DESC LIMIT 5;逻辑说明索引建在经常用于GROUP BY和WHERE的列上IF NOT EXISTS避免重复建索引报错。第二条 SQL 同时输出房源数和均价比单纯看均价更有参考价值——有些区域均价高但房源少可能是样本偏差。注意SQLite 不支持中文列名加反引号以外的特殊符号如果你的列名里有空格或括号建表时最好先重命名成英文或下划线格式。5. 避坑与常见问题那些答辩前夜才发现的坑5.1 编码问题导致中文全部乱码现象用 pandas 读取 CSV 后列名显示为\xe5\x8c\xba\xe5\x9f\x9f这样的字节串或者直接报UnicodeDecodeError。原因文件实际编码与read_csv指定的encoding参数不一致。Windows 下 Excel 另存的 CSV 默认是 GBK而 pandas 默认按 UTF-8 读。解决用第 2 章里的read_csv_smart函数自动探测或者手动指定encodinggbk。如果列名带\ufeff改用encodingutf-8-sig。5.2 matplotlib 中文显示为方块现象图表标题和轴标签里的中文全部变成小方块英文和数字正常。原因matplotlib 默认字体不支持中文。解决在绘图前设置plt.rcParams[font.sans-serif] [SimHei]Windows或[Arial Unicode MS]Mac同时设plt.rcParams[axes.unicode_minus] False解决负号显示问题。如果系统没有 SimHei可以下载字体文件后用font_manager手动注册。5.3 价格字段转换后大量 NaN现象parse_price跑完总价列有一大半变成 NaN。原因原始数据里价格字段格式不统一除了「万」还有「万元」「万人民币」甚至直接是数字不带单位正则没覆盖全。解决先df[总价].unique()[:50]看一下实际有哪些写法再针对性扩充正则。我一般会加一步df[总价].str.extract(r(\d\.?\d*))先把数字抠出来再转 float这样兼容性更好。5.4 SQLite 写入后中文列名查询报错现象to_sql写入成功但用 SQL 查询时SELECT 区域_标准化 FROM house报语法错误。原因SQLite 对中文列名支持没问题但如果列名里有空格、括号或特殊字符必须用双引号或方括号包起来。解决建表时把列名改成英文下划线格式比如district、unit_price查询时不用额外处理。如果必须保留中文列名查询时写SELECT 区域_标准化 FROM house。5.5 数据量太大导致可视化卡顿现象两万条数据画散点图时matplotlib 渲染极慢甚至内存溢出。原因散点图每个点都是一个独立图元数据量大时渲染开销线性增长。解决要么抽样df.sample(n2000)随机取两千条画图要么改用hexbin或density图用颜色密度代替散点。pyecharts 在大数据量下也有类似问题可以开启dataZoom让用户自己缩放查看。6. 答辩演示与代码复现的进阶技巧答辩现场最怕什么老师让你当场跑一遍代码结果环境不对、路径不对、包没装。我的习惯是提前把整个项目打包成一个可复现的目录结构用requirements.txt锁死依赖版本再写一个run_all.py一键跑通采集、清洗、入库、出图全流程。# run_all.py import subprocess import sys steps [ (数据清洗, python clean_data.py), (数据库入库, python to_database.py), (可视化出图, python visualize.py), ] for name, cmd in steps: print(f 执行: {name} ) result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue) if result.returncode ! 0: print(f[失败] {name}) print(result.stderr) sys.exit(1) print(f[完成] {name}) print(全流程执行完毕)逻辑说明subprocess.run依次调用三个脚本capture_outputTrue捕获输出returncode ! 0时打印错误并退出。这样答辩时你只需要跑一个命令不用手忙脚乱切终端。requirements.txt里至少锁这几个包pandas2.0.3 matplotlib3.7.2 requests2.31.0 beautifulsoup44.12.2 lxml4.9.3版本号根据你实际环境调整关键是锁死避免老师机器上装了个新版本 pandas 导致 API 不兼容。还有一个技巧把清洗前后的数据行数、各区域房源分布、均价 top5 这些关键数字提前打印在一页 A4 纸上答辩时放在手边。老师问「你数据量多大」「哪个区最贵」你直接念比现场翻代码快得多。我那次答辩就是靠这张纸撑过了数据提问环节后来每次做数据分析项目都保留这个习惯——先跑一遍全流程把关键指标记下来再动手写论文。希望帮到你。本文还有配套的精品资源点击获取
返回列表