
零基础学数据分析通常不是被 Python 语法难倒的而是被三件事卡住数据从哪来、数据怎么取、分析结果怎么落地。很多人一开始会盯着 Python 基础语法反复看可一旦面对一张真实的业务表仍然不知道从哪下手。真正的转折点往往不是你掌握了多少语法细节而是你第一次独立完成“取数 → 清洗 → 分析 → 可视化”的完整流程。这里要给一个明确的判断如果没有业务场景Python 语法学得再熟练也很难转化为数据分析能力而最容易入门、也最容易讲清楚的业务场景是电商数据。这也是为什么“Python SQL 电商实战”会成为最近两年 B 站上很受欢迎的零基础学习路线。它不是零散技巧的堆砌而是一条能形成闭环的路径用 SQL 从库里取出数据用 Python 做清洗与分析最后用图表回答业务问题。SQL、Python、数据分析这三个关键词正好对应了入门阶段最核心的能力三角。这篇文章会把这条路线完整拆开环境怎么装、SQL 要掌握哪些核心语法、pandas 怎么做数据清洗、一个典型的京东电商数据实战项目包含哪些步骤以及最常见的报错和解决思路。读完以后你可以照着跑通一个最小可用的电商数据分析项目并清楚下一步该往哪里深入。1. 为什么推荐“Python SQL 电商实战”这个组合1.1 数据分析的真实工作流讲到数据分析很多人第一反应是“写代码”。但在实际开发和业务分析中代码只是中间一环。完整的工作流通常是先明确要回答什么业务问题再通过 SQL 把相关数据从数据库取出来用 Python 做清洗、统计和建模最后用图表或报告把结论展示出来。如果数据还在数据库里而你已经急着用 Python 去处理那你很可能在做重复工作。SQL 负责“取数”Python 负责“加工”两者是前后衔接的关系。真实项目里的顺序永远是业务问题 → 数据库 → SQL 查询 → 数据表 → pandas 清洗 → 分析与可视化。很多初学者跳过 SQL 直接用 Python 读 Excel这在数据量小的时候可行一旦进入公司环境你会发现大部分数据都在数据仓库里第一关就是 SQL。1.2 为什么用电商数据做实战电商是目前数据最完整、业务逻辑最清晰的场景之一。订单表、用户表、商品表、支付流水字段含义直观和日常购物经验一致。对一个初学者来说看到“订单金额”“商品分类”“支付时间”这样的字段很快就知道要算什么GMV、客单价、复购率、销量排行。相比之下金融风控、工业 IoT 数据的业务背景复杂新手容易在理解业务上耗尽精力。用电商数据练手可以把注意力集中在“技术 分析思路”上。京东电商项目的优势尤其明显它的品类结构丰富订单金额跨度大用户行为链条完整非常适合做“整体销售分析 品类结构分析 用户分层分析”这三类最常见的分析任务。1.3 三条学习路线的对比学习路线周期门槛最终结果只学 Python 语法1-3 个月低会写代码但不会分析只学 SQL2-4 周低会查数但不会处理复杂数据Python SQL 电商实战2-3 个月中低能独立完成一个完整的数据分析项目从这张表可以看得很清楚单纯学一门语言或一种语法都很难形成真正的分析能力。只有把 SQL、Python 和一个具体业务场景串起来才称得上“入门”。这套路线之所以在 B 站这类视频平台上口碑好恰恰是因为它把一个抽象的能力目标拆成了可执行、可检验的小任务。2. 零基础环境搭建从 Python 安装到 Jupyter Notebook2.1 环境选择Anaconda 还是官方 Python新手常问的第一个问题是Python 到底该装官方版本还是装 Anaconda我的建议很直接如果只为了数据分析直接用 Anaconda 更省事。它自带 Python、pandas、numpy、matplotlib、jupyter 等常用工具避免初学者在安装环节花太多时间。如果希望更贴近工程开发也可以装官方 Python再用 pip 安装依赖。版本以当前文档发布时的官方稳定版为准不必追求最新版稳定性优先。如果使用的是公司电脑安装软件可能受权限限制这时候可以优先考虑安装用户级的 Python 发行版或者使用 VS Code 的远程开发能力。从实践来看环境问题往往比代码问题更容易劝退新手所以第一步宁可慢一点也要把 Python 和编辑器跑通。2.2 安装步骤以 Anaconda 为例安装过程分为三步打开搜索引擎进入 anaconda.com 官网下载页面选择对应操作系统的安装包。安装时注意勾选“Add Anaconda to my PATH environment variable”这样可以避免后续命令行找不到命令。如果安装时没有勾选也可以后续手动配置环境变量。安装完成后打开终端或命令行工具输入检查命令。python --version conda --version正常情况下会输出当前安装的 Python 和 conda 版本号例如Python 3.12.x conda 24.x.x如果你的命令提示找不到python优先检查环境变量配置。输入命令能识别就说明 Python 环境已经可用。接下来安装核心依赖库。pip install pandas numpy matplotlib jupyter如果使用 conda也可以用conda install pandas numpy matplotlib jupyter安装完成后启动 Jupyter Notebookjupyter notebook启动成功后浏览器会自动打开 Notebook 页面在右侧点击 New → Python 3 就能新建一个代码单元格。2.3 开发工具怎么选Jupyter 还是 VS CodeJupyter Notebook 适合做探索性分析代码、输出、图表都放在同一个文档里看到结果再继续写下一步。VS Code 适合写更正式的脚本尤其是配合 SQL 插件、Python 插件使用。如果目标是想快速跑通数据分析流程优先选 Jupyter如果目标是后续做工程化项目选 VS Code。过程中不用纠结工具能让你最快看到结果的就是好工具。如果你选择 VS Code建议安装 Python 插件和 Jupyter 插件。打开一个.py文件后可以直接右键选择“在交互式窗口中运行”效果接近 Notebook又保留了脚本文件的可维护性。这个组合在当前的项目开发中非常流行。3. SQL 核心语法数据分析师真正要掌握的部分3.1 SQL 的学习边界很多人学 SQL 会陷入两个极端要么只会SELECT *要么把时间花在存储过程、触发器这类偏开发的功能上。数据分析场景里的 SQL核心其实只有几块查询过滤、分组聚合、表连接、子查询、去重和排序。掌握了这些你已经能解决绝大多数业务取数需求。还有一类能力容易被忽略就是“看懂慢 SQL 和执行计划”。当你写的查询在几十万行数据上跑不动时才会理解索引为什么重要。搜索热词里经常出现“SQL 优化”“慢 SQL 优化”“SQL 去重查询”说明这些问题在实际工作中出现频率非常高。入门阶段先保证能写出正确的查询进阶阶段再关注查询效率。3.2 建表与模拟数据为了后面能直接跑通示例我们先用 SQLite 建一个极简订单表并插入模拟数据。SQLite 是 Python 内置支持的数据库不需要额外安装服务端非常适合本地学习。CREATE TABLE orders ( order_id TEXT, user_id TEXT, product_name TEXT, category TEXT, amount REAL, pay_time TEXT ); INSERT INTO orders VALUES (A001, U1001, 手机, 数码, 2999.00, 2025-01-01 10:00:00), (A002, U1002, 手机壳, 配件, 19.90, 2025-01-01 10:05:00), (A003, U1001, 蓝牙耳机, 数码, 199.00, 2025-01-02 11:00:00), (A004, U1003, 卫衣, 服饰, 129.00, 2025-01-02 12:30:00), (A005, U1002, 跑鞋, 运动, 329.00, 2025-01-03 09:20:00), (A006, U1004, 手机, 数码, 2999.00, 2025-01-03 14:00:00), (A007, U1001, 针织帽, 服饰, 69.00, 2025-01-04 16:00:00);需要说明的是这里的数据是演示用的模拟数据字段设计参照真实电商订单表并不来自任何具体平台内部数据库。学习阶段用这样的数据足够跑通流程等进入真实项目后再替换成真实业务数据。3.3 核心查询语法示例下面这几个查询基本涵盖了数据分析取数时最高频的语法。-- 查询数码类且金额大于 100 的订单 SELECT * FROM orders WHERE category 数码 AND amount 100; -- 按商品分类统计总金额和订单数 SELECT category, COUNT(*) AS order_cnt, SUM(amount) AS total_amount, AVG(amount) AS avg_amount FROM orders GROUP BY category ORDER BY total_amount DESC; -- 去重统计购买用户数 SELECT COUNT(DISTINCT user_id) AS user_cnt FROM orders; -- 统计每个用户的订单数并筛选订单数大于等于 2 的用户 SELECT user_id, COUNT(*) AS cnt FROM orders GROUP BY user_id HAVING cnt 2;这里要特别提一下BETWEEN AND的用法它经常被初学者搞混边界。WHERE amount BETWEEN 100 AND 500是包含端点值的等价于amount 100 AND amount 500。如果不确定边界就写成显式的比较条件可读性反而更好。GROUP BY和HAVING的关系也需要理解清楚WHERE是在分组前过滤行HAVING是在分组后过滤组。如果想筛选“订单数大于等于 2 的用户”只能用HAVING cnt 2因为COUNT(*)是在分组之后才计算出来的WHERE条件里不能直接使用聚合函数。3.4 子查询与 JOIN数据分析中经常需要“先圈定一批用户再分析他们的行为”。这个时候子查询最方便-- 找出订单数大于等于 2 的用户再统计这些用户的平均客单价 SELECT user_id, AVG(amount) AS avg_amount FROM orders WHERE user_id IN ( SELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) 2 ) GROUP BY user_id;日常取数时还经常需要把订单表和用户表做关联。JOIN 的语法不复杂但要搞清楚INNER JOIN、LEFT JOIN的区别INNER JOIN只保留两边都匹配的行LEFT JOIN会保留左表所有行匹配不上的右表字段为 NULL。实际业务中分析“注册用户但从未下单的用户”这一类问题就必须依赖LEFT JOIN否则那些没有下单记录的用户会被过滤掉。4. 用 Python 完成数据清洗与预处理4.1 为什么需要 pandas数据库里的数据不一定直接能用来分析。常见问题包括字段是字符串类型但不是数字、有空值、有重复行、有超出正常范围的异常值。pandas 是 Python 生态里做数据清洗和表格处理最常用的库。它提供了类似 Excel 的表格操作能力又比 Excel 更适合处理大文件和自动化流程。搜索热词里反复出现“dify 做数据分析清洗”“数据清洗”这类内容说明大家在实际工作中对清洗环节的痛点很深。但清洗不是靠某个 AI 工具一键解决的核心仍然是你对数据的理解哪些字段是关键字段、哪些值算缺失、哪些值算异常都必须结合业务判断。4.2 读取数据先准备一份 CSV 文件内容与上面的订单表一致。一般情况下数据仓库导出的文件也多为 CSV 或 Excel。import pandas as pd df pd.read_csv(orders.csv) df.head()读取文件后head()方法可以显示前 5 行快速检查数据是否读对了。注意 CSV 文件的编码问题从 Excel 另存的 CSV 通常是GBK编码需要用pd.read_csv(orders.csv, encodinggbk)读取否则可能报UnicodeDecodeError。4.3 完整清洗代码下面这段代码演示了四个最常用的清洗步骤查看基本信息、处理缺失值、去除重复值、转换金额类型。import pandas as pd # 读取数据 df pd.read_csv(orders.csv) # 1. 查看缺失值 print(df.isnull().sum()) # 2. 删除缺失关键字段的行 df df.dropna(subset[order_id, user_id, amount]) # 3. 删除重复订单 df df.drop_duplicates(subset[order_id]) # 4. 把金额转为浮点数遇到错误转为 NaN 再处理 df[amount] pd.to_numeric(df[amount], errorscoerce) df df.dropna(subset[amount]) # 5. 把时间字符串转为 datetime 类型 df[pay_time] pd.to_datetime(df[pay_time]) # 6. 重新查看数据 df.info() print(df.head())这段代码的核心逻辑是先通过isnull().sum()看哪些列有缺失再按业务要求删除关键字段缺失的行订单号是唯一标识所以用drop_duplicates去重金额列如果混入了空字符串或“未知”之类的脏数据to_numeric会自动转成 NaN再做一次删除。清洗完的数据才能进入后续的分析环节。很多人第一次跑通“从数据库取数 → pandas 清洗”的流程后才会真正明白数据分析里所谓“脏数据”不是一个抽象概念而是你每天都要面对的真实情况。有时候明明是同一个订单因为导出了两次就造成重复计算有时候金额列里混入了一个中文括号整个求和就报错。清洗不是最酷的环节但一定是最值钱的环节。5. 京东电商实战项目需求、字段与指标体系5.1 业务需求定义一个典型的电商数据分析实战不会一上来就让你写代码而是先给你一个业务问题。比如运营团队想知道 1 月第一周的销售情况重点回答三个问题整体 GMV 和订单量是多少哪些品类销售贡献最大哪些用户是核心用户他们的消费行为有什么特点这三个问题分别对应数据分析里的“整体情况”“结构分析”“用户分层”是电商项目最常见的套路。很多教程讲到这里就急着写代码但真正的分析流程应该是先定义问题再确定指标最后写代码取数。5.2 字段与指标为了简化实战项目通常只需要两张表订单表order_id、user_id、product_name、category、amount、pay_time。用户表user_id、user_name、city、register_time。核心指标包括GMV成交总额、订单量、客单价、品类销售占比、复购用户数。讲解指标时要注意GMV 在不同公司定义略有差异有的是“支付成功金额”有的包含“未支付订单金额”所以在做真实项目时第一步永远是确认口径。5.3 分析思路拿到业务问题后不建议马上写代码。先画一条分析主线先从订单表按日期汇总出销售趋势再按品类拆分看结构最后回到用户维度找出高价值用户。SQL 负责取数pandas 负责加工matplotlib 负责展示。这种思路比单纯背函数重要得多。有经验的工程师常说数据分析项目里最难的不是技术而是“提对问题”。同一个数据集可以算出一百个指标但真正能帮助运营做决策的往往就是两三个核心指标。入门学习时先把“销售趋势 品类结构 用户贡献”这三件套练熟就能应付大多数面试题和初级业务分析任务。6. 实战一用 SQL 完成核心指标统计下面继续用 SQLite 演示。为了让结果更有意义可以把示例数据先导入 SQLite然后执行聚合查询。-- 1. 整体 GMV 与订单量 SELECT COUNT(*) AS order_cnt, SUM(amount) AS gmv FROM orders; -- 2. 各品类销售额与订单量 SELECT category, COUNT(*) AS order_cnt, SUM(amount) AS total_amount FROM orders GROUP BY category ORDER BY total_amount DESC; -- 3. 每日销售趋势 SELECT DATE(pay_time) AS pay_date, COUNT(*) AS order_cnt, SUM(amount) AS gmv FROM orders GROUP BY DATE(pay_time) ORDER BY pay_date;在 SQLite 里DATE(pay_time)可以把时间字符串截断成日期在 MySQL 里对应的是DATE_FORMAT(pay_time, %Y-%m-%d)在 PostgreSQL 里可以直接pay_time::date。不同数据库的函数名有差异这也是初学者常被困扰的地方但核心逻辑是一样的把时间戳归一到日期维度再按日期分组求和。这三个查询分别解决了 5.1 里的前两个问题整体 GMV 看大盘品类销售额看结构每日趋势看变化。执行顺序上建议先跑第一个查询确认数据总量没有明显问题再跑后两个分组查询。如果发现 GMV 明显偏大或偏小第一反应应该是检查过滤条件而不是怀疑 SQL 语法。7. 实战二用 Python 完成清洗、分析与可视化7.1 整体流程SQL 执行完之后我们得到了结果集。接下来把同样的订单数据放到 pandas 中完成清洗并额外做可视化。这里给出一个完整的 Python 脚本可以直接用 Jupyter Notebook 分段执行。import pandas as pd import matplotlib.pyplot as plt # 配置中文字体避免图表出现方框 plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, WenQuanYi Micro Hei] plt.rcParams[axes.unicode_minus] False # 读取订单数据 df pd.read_csv(orders.csv) # 数据清洗 df df.dropna(subset[order_id, user_id, amount]) df df.drop_duplicates(subset[order_id]) df[amount] pd.to_numeric(df[amount], errorscoerce) df df.dropna(subset[amount]) df[pay_time] pd.to_datetime(df[pay_time]) df[pay_date] df[pay_time].dt.date # 指标整体 GMV gmv df[amount].sum() order_cnt len(df) print(fGMV: {gmv:.2f}) print(f订单量: {order_cnt}) print(f客单价: {gmv / order_cnt:.2f}) # 品类销售贡献 category_summary df.groupby(category)[amount].sum().sort_values(ascendingFalse) print(category_summary) # 每日销售趋势 daily_summary df.groupby(pay_date)[amount].sum().sort_index() # 可视化品类销售额柱状图 plt.figure(figsize(8, 5)) category_summary.plot(kindbar, color#4C72B0) plt.title(各品类销售额) plt.ylabel(销售额元) plt.xticks(rotation45) plt.tight_layout() plt.show() # 可视化每日 GMV 折线图 plt.figure(figsize(8, 5)) daily_summary.plot(kindline, markero, color#55A868) plt.title(每日 GMV 趋势) plt.ylabel(销售额元) plt.grid(True, linestyle--, alpha0.6) plt.tight_layout() plt.show()7.2 关键逻辑说明第一次看这段代码只要抓住三根主线就行。第一groupby(category)[amount].sum()是把数据按类型分组完成“结构分析”第二groupby(pay_date)[amount].sum()是按时间分组完成“趋势分析”第三matplotlib的两张图核心只是plot和bar两个入口参数都只是美化效果。中文字体配置经常被忽略。如果你在图表标题、坐标轴标签上看到方框不是代码逻辑错误而是系统缺少对应字体。上面的plt.rcParams一行配置了常见中文字体列表不同系统会匹配到不同的可用字体。运行环境是 Linux 服务器时通常还需要额外安装中文字体包这一步在本地 Windows 或 macOS 上一般不会遇到。8. 运行结果与效果验证8.1 预期输出如果一切正常运行上面的 Python 脚本后终端或 Notebook 单元格会输出类似这样的内容GMV: 6743.90 订单量: 7 客单价: 963.41 category 数码 6197.0 服饰 198.0 运动 329.0 配件 19.9 Name: amount, dtype: float64随后会弹出两张图表一张是各品类销售额柱状图另一张是每日 GMV 趋势折线图。8.2 如何判断成功判断标准不是“没有报错”而是“结果是否符合业务直觉”。比如“数码”类因为有手机订单销售额远高于其他品类这是合理的每天订单金额有波动但总量没有异常也是合理的。如果某个品类金额为 0那就要回头看是不是清洗时把行删掉了或者数据本身不完整。如果输出结果和预期不一致优先检查三个位置一是读取文件时是否用了正确的编码和路径二是清洗步骤是否先于统计步骤执行三是groupby的分组列名是否和原表一致。数据分析项目里绝大多数结果对不上都是这三类问题。8.3 出错了先看哪里运行失败时第一步看错误信息的最末尾而不是整个堆栈。Python 的报错信息通常最后一行才说明错误类型和关键位置前面的堆栈信息对新手来说噪音很大。如果你在 Jupyter 里执行快捷键Shift Enter是运行当前单元格如果单元格前面出现*表示正在运行变成数字表示已完成。9. 常见问题与排查思路问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named pandas未安装依赖检查当前使用哪个 Python 环境pip install pandas中文图表显示为方框系统缺少中文字体查看plt.rcParams[font.sans-serif]配置安装字体或指定项目中文字体UnicodeDecodeError读取 CSV 报错文件编码不是 UTF-8查询文件原始编码用encodinggbk或encodingutf-8重新读取ValueError: could not convert string to float金额列混入非数字字符用df[amount].str检查异常值用to_numeric(errorscoerce)转为 NaN 再过滤SQL 查询报错 near GROUP: syntax error关键字顺序或分号问题检查 SQL 关键字顺序按 SELECT → FROM → WHERE → GROUP BY → ORDER BY 重写Jupyter 启动后浏览器打不开网络或端口被占用查看终端日志用jupyter notebook --port8889指定端口这里需要补充一个安全提醒SQL 注入是真实存在的安全风险写 SQL 时不要把用户输入直接拼接到查询字符串中学习阶段也不要尝试绕过 SQL 登录验证这类危险操作。数据分析的正道是掌握索引、优化和规范查询而不是投机取巧。研究搜索热词时会看到大量“SQL 注入”相关的内容但作为数据分析学习者你更应该关注的是如何写出安全的参数化查询。10. 学习路线与工程建议10.1 分阶段学习路线如果你决定走这条路建议按四个阶段推进。第一阶段是 Python 基础重点掌握变量、列表、字典、循环、函数不需要深入面向对象。第二阶段是 SQL 基础重点练习 SELECT、WHERE、GROUP BY、JOIN用一个练习库反复刷题。第三阶段是 pandas 与 matplotlib重点掌握读取、清洗、分组聚合和基础绘图。第四阶段是综合项目把前面所有内容串起来完成一个完整的电商数据分析报告。每个阶段都可以用“能否完成一个最小任务”来检验。比如 SQL 阶段的检验标准是给你一张订单表你能在五分钟内写出“最近 7 天各品类销售额 Top 5”的查询。pandas 阶段的检验标准是给你一份脏 CSV你能在一分钟内完成清洗并输出统计口径一致的汇总表。任务驱动比“看课程集数”更有效。10.2 工程习惯数据分析同样要有工程意识。脚本命名要有语义比如analysis_jd_order.py不要叫test1.py。结果文件统一放在output/目录。每次跑脚本前先确认数据源路径不要把绝对路径写死在代码里养成用pathlib或os.path拼接路径的习惯。在真实业务中还需要注意权限和数据隐私。能访问数据库的账号应该遵循最小权限原则只读账号就只做查询不执行 DELETE、DROP 等危险操作。涉及客户信息的字段不能随意打印到日志里也不能把数据文件上传到公开仓库。这一点容易被初学者忽略但却是技术人员最基本的职业底线。10.3 下一步深入方向当你跑通第一个项目后下一步可以考虑三个方向一是把 pandas 用得更熟练比如窗口函数、数据透视表、合并数据集二是学习 SQL 优化理解索引和慢查询日志这在面试中很加分三是学习更完整的可视化方案比如 pyecharts、Plotly用来做交互式仪表盘。我建议你把这份教程里的代码保存下来改一改数据换成“最近一个月”的订单重新跑一遍。不要只复制要逐行理解每个函数在做什么。数据量和字段复杂度提升之后你才会真正遇到索引、内存、数据一致性这些问题而那些问题才是从“入门”走向“实战”的分水岭。