真实项目的第一步不是分析,是「把数据取出来」——数据在别人的库里。 整条流程四步:连库取数、查洗干净、分组统计、写结论。 注册时间是这张表的核心字段,格式错一个字,年度月度分析全废。
从这一章起进入本书最后一部分:四个真实项目。 第一个连 MySQL,第二个读 Excel,第三个带图形界面,第四个做客户分群。 本沙箱没有 MySQL 服务,也没有 pymysql。 教材里的连接代码原样保留并标注,分析部分用 sqlite3 真跑。
一、项目要回答的三个问题
一家公司既有网站也有 App,用户注册了就算进来。老板只有三个问题: 用户在不在增长、增长主要来自哪一年、新用户从哪个渠道来。 问题都不难,难的是数据在一个 MySQL 库里,不在手边。
这是真实项目和课本例题最大的差别:数据得先去取,取数是半个项目。
二、四步流程
| 步骤 | 做什么 | 用什么 |
|---|---|---|
| 一 | 连数据库、把数据读进来 | pymysql 加 pandas |
| 二 | 查缺失、查重复、查异常 | pandas |
| 三 | 按年、按月、按渠道统计 | groupby |
| 四 | 画图、写结论 | matplotlib |
四步顺序不能乱。数据没洗干净就统计,出来的数不能用。 这个顺序其实对应本书前八章:先会 pandas,再学取数,最后才是分析。 把流程写下来再动手,比直接开 Notebook 一行行试要快得多。
三、表结构只有五个字段
| 字段 | 类型 | 含义 |
|---|---|---|
| user_id | int | 用户编号,主键 |
| user_name | varchar(20) | 用户名 |
| reg_time | datetime | 注册时间 |
| channel | varchar(20) | 注册渠道 |
| city | varchar(20) | 所在城市 |
五个字段,三百条记录,时间跨度 2021 到 2025。
reg_time 是全表的核心。年度、月度、季节分析全靠它一个字段。
它格式一错,后面所有分组都会错,而且错得很隐蔽——统计照样跑得出来。
四、要装什么,本沙箱差在哪
课本要三样:MySQL 服务端(装软件、建库)、pymysql 驱动(pip 装)、pandas。 本沙箱没有 MySQL 服务,也没有 pymysql,这一整套装不了。
pip install pymysql
分析部分全部改用 sqlite3 真跑。SQL 语句基本一样,差异每节都会点出来。 sqlite3 是 Python 自带的,不用装。它的定位是「单文件数据库」,练手正好。
五、动手 Demo:项目概述、效果与准备
这一节不写分析,先把流程、表结构、环境三件事交代清楚。 教材的 pymysql 连接代码原样列出,标注「本沙箱不执行」。
import sqlite3
print("流程四步:连库取数 → 查洗干净 → 分组统计 → 写结论")
print("表结构:user_id / user_name / reg_time / channel / city")
# 教材里这一步是 pymysql.connect(...),本沙箱没有 MySQL,跳过
conn = sqlite3.connect(":memory:")
conn.execute("create table users(user_id integer primary key, "
"user_name text, reg_time text, channel text, city text)")
conn.execute("insert into users values (1, '用户001', "
"'2025-03-14 09:20:00', '搜索引擎', '北京')")
print("连接可用:%s" % conn.execute("select count(*) from users").fetchone()[0])
conn.close()
实跑输出:
--------------------------------------------------------------------
项目概述、效果与准备
--------------------------------------------------------------------
① 这个项目要回答什么
--------------------------------------------------------------------
一家公司有网站也有 App,用户注册了就算进来。老板想知道三件事:
用户是不是在增长、增长主要来自哪一年、新用户从哪个渠道来。
问题听起来简单,但数据在一个 MySQL 库里,得先把它搬出来。
! 真实项目和课本例题最大的差别就在这一步:数据不在手边,得先去取。
② 整条流程四步
--------------------------------------------------------------------
| 步骤 | 做什么 | 用哪个工具 |
|---|---|---|
| 一 | 连数据库、把数据读进来 | pymysql + pandas |
| 二 | 检查数据干不干净 | pandas |
| 三 | 按年、按月统计 | pandas 的 groupby |
| 四 | 画图、写结论 | matplotlib |
四步的顺序不能乱。数据没洗干净就统计,出来的数不能用。
这也是本书前八章的顺序:先会用 pandas,再学 SQL 取数,最后才是分析。
③ 表结构长什么样
--------------------------------------------------------------------
| 字段 | 类型 | 含义 |
|---|---|---|
| user_id | int | 用户编号,主键 |
| user_name | varchar(20) | 用户名 |
| reg_time | datetime | 注册时间 |
| channel | varchar(20) | 注册渠道 |
| city | varchar(20) | 所在城市 |
五个字段,300 条记录,时间跨度 2021 到 2025。
! 注册时间是整张表的核心。年度分析、月度分析全靠它,格式错了全盘皆输。
④ 要装什么
--------------------------------------------------------------------
课本要装 MySQL 服务端、建库、再用 pip 装 pymysql 驱动。
本沙箱没有 MySQL 服务,也没有 pymysql,这一整套装不了。
[平台原样 · 本沙箱不执行]
| pip install pymysql
装驱动;服务端要另装 MySQL
下面的分析全部用 sqlite3 真跑,SQL 语句基本一样,差异会在每节点出来。
! sqlite3 是 python 自带的,不用装。它的定位是「单文件数据库」,正好拿来练手。
sqlite3.connect(":memory:") 是内存库,程序结束就没了,适合试手。
真项目里这一步是 pymysql.connect(host=..., user=..., password=...)。
沙箱跑不了 MySQL,但「连接、执行、取结果」这三件事的道理完全一样。
30 秒实验
- 把表结构里的字段删掉一个(比如 city),想一想前面的分析会受什么影响。
- 想一想:如果 reg_time 里混进了 2025/03/14 这种斜杠格式,会发生什么?
- 列出你自己手上任何一张表,写出它的字段和「哪个字段是核心」。
常见误区
- 一上手就写分析代码:数据没取到、没洗干净,代码再漂亮也是空转。
- 以为连库很难:真的只有一行,难的是知道库在哪、账号密码对不对。
- 不看表结构直接 select:字段名拼错,报错信息还以为是库连不上。
- 忽略字符集:连接串不写 utf8mb4,中文全变问号。
自测三问(点开对答案)
1. 真实项目和课本例题最大的差别是什么? —— 数据不在手边。得先连库、登录、把数据取出来,这一步占掉半个项目。 2. 为什么说 reg_time 是核心字段? —— 年度、月度、季节分析全靠它。它格式错,所有分组都错,而且错得很隐蔽。 3. 本沙箱为什么用 sqlite3 代替 MySQL? —— 没有 MySQL 服务也没有 pymysql 驱动。sqlite3 自带,「连接、执行、取结果」的道理一样。流程清楚了,下一篇动手:把库建起来、数据读进来,顺手把两种 SQL 的差异摊开。
- ☐ (本篇完,下一篇 9.2 导入 MySQL 数据)