你可能会问:"我 SQL 已经写得很好了,为什么还要学 Python?"
三个真实场景:
- 1. 每天跑 10 条 SQL,手动复制结果到 Excel,重复劳动 1 小时
- 2. 老板说"把最近 30 天的数据做个趋势图",你只能截图 BI 看板
- 3. 数据量超过 100 万行,Excel 打不开,SQL 导出也卡死
Python 解决的就是这些问题:自动化、可视化、大数据处理。
第一阶段:环境搭建(30 分钟搞定)
1. 安装 Python
推荐用 Anaconda,一键安装 Python + 常用库:
# 下载地址https://www.anaconda.com/download# 安装后验证python --version# 输出: Python 3.11.x
2. 安装数据分析三剑客
pip install pandas numpy matplotlib
- • pandas:处理表格数据(类似 Excel,但更强大)
3. 选择编辑器
- • 新手推荐:Jupyter Notebook(Anaconda 自带)
- • 进阶推荐:VS Code + Python 插件
# 启动 Jupyterjupyter notebook
第二阶段:Python 基础语法(只学数据分析需要的)
1. 变量和数据类型
# 数字age = 25price = 99.9# 字符串name = "胡萝卜数分"# 列表(类似数组)channels = ['自然搜索', '信息流', '社群']# 字典(类似 JSON)user = {'name': '张三', 'age': 25, 'channel': '信息流'}
2. 条件判断
# 判断用户等级if user['age'] > 30: level = '资深用户'elif user['age'] > 20: level = '普通用户'else: level = '新用户'
3. 循环
# 遍历渠道列表for channel in channels: print(f'渠道: {channel}')# 输出:# 渠道: 自然搜索# 渠道: 信息流# 渠道: 社群
4. 函数(把重复代码封装起来)
# 定义一个计算转化率的函数def calc_conversion_rate(pay_users, total_users): if total_users == 0: return 0 return pay_users / total_users * 100# 调用rate = calc_conversion_rate(1200, 20000)print(f'转化率: {rate}%') # 输出: 转化率: 6%
记住这 4 个就够了,其他语法用到再学。
第三阶段:pandas 入门(分析师的核心技能)
1. 读取数据
import pandas as pd# 读取 CSVdf = pd.read_csv('user_data.csv')# 读取 Exceldf = pd.read_excel('user_data.xlsx', sheet_name='Sheet1')# 从数据库读取(连接 MySQL)import pymysqlconn = pymysql.connect( host='localhost', user='root', password='password', database='analytics')df = pd.read_sql('SELECT * FROM user_login WHERE dt = "2026-05-20"', conn)
2. 查看数据
# 查看前 5 行df.head()# 查看数据结构df.info()# 查看统计摘要df.describe()# 查看列名df.columns
3. 数据筛选(类似 SQL 的 WHERE)
# 筛选信息流渠道的用户df_filter = df[df['channel'] == '信息流']# 多条件筛选df_filter = df[ (df['channel'] == '信息流') & (df['age'] > 25)]# 类似 SQL:# SELECT * FROM df WHERE channel = '信息流' AND age > 25
4. 数据聚合(类似 SQL 的 GROUP BY)
# 按渠道统计用户数result = df.groupby('channel')['user_id'].count()# 多维度聚合result = df.groupby(['channel', 'city']).agg({ 'user_id': 'count', 'pay_amount': 'sum', 'age': 'mean'})# 类似 SQL:# SELECT channel, city, # COUNT(user_id), SUM(pay_amount), AVG(age)# FROM df# GROUP BY channel, city
5. 数据排序(类似 SQL 的 ORDER BY)
# 按支付金额降序df_sorted = df.sort_values('pay_amount', ascending=False)# 取前 10 名df_top10 = df_sorted.head(10)
6. 数据合并(类似 SQL 的 JOIN)
# 两个表合并df_merge = pd.merge( df_user, # 左表 df_order, # 右表 on='user_id', # 关联字段 how='left' # LEFT JOIN)# 类似 SQL:# SELECT * FROM df_user LEFT JOIN df_order ON df_user.user_id = df_order.user_id
第四阶段:实战案例——自动化日报脚本
场景:每天早上自动跑 SQL 并生成 Excel 日报
import pandas as pdimport pymysqlfrom datetime import datetime, timedelta# 1. 连接数据库conn = pymysql.connect( host='localhost', user='root', password='password', database='analytics')# 2. 获取昨天的日期yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')# 3. 执行 SQL 查询sql = f"""SELECT channel, COUNT(DISTINCT user_id) AS dau, SUM(pay_amount) AS revenue, COUNT(DISTINCT user_id) FILTER (WHERE pay_amount > 0) AS pay_usersFROM user_dailyWHERE dt = '{yesterday}'GROUP BY channel"""df = pd.read_sql(sql, conn)# 4. 计算转化率df['conversion_rate'] = df['pay_users'] / df['dau'] * 100# 5. 添加日期列df['dt'] = yesterday# 6. 导出到 Excelfilename = f'daily_report_{yesterday}.xlsx'df.to_excel(filename, index=False)print(f'日报已生成: {filename}')print(df)# 7. 关闭连接conn.close()
输出:
日报已生成: daily_report_2026-05-20.xlsx channel dau revenue pay_users conversion_rate dt0 自然搜索 8000 120000 1440 18.0 2026-05-201 信息流 30000 90000 1800 6.0 2026-05-202 社群 5000 80000 800 16.0 2026-05-20
第五阶段:可视化入门(把数据变成图表)
1. 基础折线图
import matplotlib.pyplot as plt# 准备数据days = ['05-18', '05-19', '05-20', '05-21', '05-22']dau = [85000, 90000, 84600, 92000, 95000]# 画图plt.figure(figsize=(10, 6))plt.plot(days, dau, marker='o', linewidth=2)# 添加标题和标签plt.title('DAU 趋势(最近 5 天)')plt.xlabel('日期')plt.ylabel('DAU')# 显示plt.savefig('dau_trend.png')plt.show()
2. 柱状图(渠道对比)
# 准备数据channels = ['自然搜索', '信息流', '社群']revenue = [120000, 90000, 80000]# 画图plt.figure(figsize=(8, 5))plt.bar(channels, revenue, color=['#4CAF50', '#2196F3', '#FF9800'])plt.title('各渠道收入对比')plt.xlabel('渠道')plt.ylabel('收入(元)')plt.savefig('channel_revenue.png')plt.show()
3. 饼图(占比分析)
# 准备数据labels = ['自然搜索', '信息流', '社群']sizes = [28.6, 57.1, 14.3]# 画图plt.figure(figsize=(8, 8))plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)plt.title('渠道流量占比')plt.savefig('channel_pie.png')plt.show()
第六阶段:进阶方向(从入门到精通)
1. 自动化调度
用 schedule 库实现定时任务:
import scheduleimport timedef daily_job(): # 这里放你的日报脚本 print('执行日报任务...')# 每天早上 9 点执行schedule.every().day.at('09:00').do(daily_job)while True: schedule.run_pending() time.sleep(60)
2. 邮件推送
用 smtplib 自动发送邮件:
import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.attachment import MIMEAttachmentdef send_email(to_addr, subject, file_path): msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = 'your_email@gmail.com' msg['To'] = to_addr # 添加附件 with open(file_path, 'rb') as f: attachment = MIMEAttachment(f.read()) attachment.add_header('Content-Disposition', 'attachment', filename=file_path) msg.attach(attachment) # 发送 server = smtplib.SMTP('smtp.gmail.com', 587) server.send_message(msg) server.quit()
3. 大数据处理
当数据超过 100 万行,用 chunksize 分批处理:
# 分批读取大文件chunk_size = 100000for chunk in pd.read_csv('big_data.csv', chunksize=chunk_size): # 处理每一批 result = chunk.groupby('channel')['user_id'].count() print(result)
4. 机器学习入门
用 scikit-learn 做用户流失预测:
from sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifier# 准备数据X = df[['age', 'login_days', 'pay_amount']] # 特征y = df['is_churn'] # 标签(是否流失)# 训练模型model = RandomForestClassifier()model.fit(X_train, y_train)# 预测predictions = model.predict(X_test)
学习路径总结
总计:约 10 小时入门,后续按实际需求深入学习。
给分析师的学习建议
- 1. 不要从头学 Python 教程:只学数据分析需要的部分
- 3. 从自动化开始:先解决重复劳动,再学可视化、机器学习
- 4. 善用 ChatGPT/Claude:让 AI 你写代码,你只需要理解逻辑
Python 不是替代 SQL,而是 SQL 的延伸——让你的数据能力从"查询"升级到"自动化处理"。