课程目标

  1. 掌握Python数据分析基础环境的搭建。
  2. 学习从多种数据源(Excel、CSV、数据库)获取电商运营数据。
  3. 完成第一个数据读取与预览的实战案例。

核心Skills

  • 环境配置:Python、Jupyter Notebook、核心库安装
  • 数据获取:使用Pandas读取结构化文件
  • 数据预览:数据概览、信息查看、基础统计

课件内容与代码

步骤1:环境准备与库安装

# 课件注释:本部分为环境准备,学员需提前安装Anaconda或Miniconda
# 以下代码为库安装命令,在终端(Terminal)或命令提示符(CMD)中执行,非Python脚本

# 安装核心数据分析库
# pip install pandas numpy matplotlib seaborn jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装数据库连接库(可选,根据后续课程需要)
# pip install pymysql sqlalchemy openpyxl xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple

步骤2:创建Jupyter Notebook并导入库

# 代码文件:day1_data_acquisition.ipynb
# 案例数据文件:需准备 `sample_orders.csv` 和 `product_info.xlsx`

# 1. 导入必备库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')  # 忽略警告信息

# 设置中文显示和图形样式
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
sns.set_style("whitegrid")
print(">>> 核心库导入成功!")

步骤3:从CSV文件读取订单数据

# 2. 从CSV文件读取电商订单数据
# 假设 `sample_orders.csv` 文件内容示例:
# order_id,user_id,order_date,product_id,quantity,unit_price,city,category
# 1001,201,2023-10-01,P001,2,299.9,北京,电子产品
# 1002,202,2023-10-01,P002,1,1599.0,上海,家用电器
# ...更多记录...

try:
    df_orders = pd.read_csv('sample_orders.csv', encoding='utf-8')
    print(f">>> 订单数据读取成功!共 {df_orders.shape[0]} 行,{df_orders.shape[1]} 列。")
    print(">>> 数据前5行预览:")
    display(df_orders.head())  # 在Jupyter中优雅显示,也可用 print(df_orders.head())
except FileNotFoundError:
    print(">>> 文件未找到,正在创建示例数据...")
    # 生成模拟订单数据供练习
    np.random.seed(42)
    num_orders = 1000
    data = {
        'order_id': range(1000, 1000 + num_orders),
        'user_id': np.random.randint(200, 500, num_orders),
        'order_date': pd.date_range('2023-10-01', periods=num_orders, freq='H').strftime('%Y-%m-%d'),
        'product_id': ['P' + str(i).zfill(3) for i in np.random.randint(1, 20, num_orders)],
        'quantity': np.random.randint(1, 5, num_orders),
        'unit_price': np.round(np.random.uniform(50, 2000, num_orders), 2),
        'city': np.random.choice(['北京', '上海', '广州', '深圳', '杭州', '成都'], num_orders),
        'category': np.random.choice(['电子产品', '家用电器', '服装服饰', '美妆个护', '食品生鲜'], num_orders)
    }
    df_orders = pd.DataFrame(data)
    df_orders['total_amount'] = df_orders['quantity'] * df_orders['unit_price']  # 计算订单金额
    df_orders.to_csv('sample_orders.csv', index=False, encoding='utf-8')
    print(f">>> 示例订单数据已生成并保存!共 {df_orders.shape[0]} 行。")
    display(df_orders.head())

步骤4:从Excel文件读取商品信息

# 3. 从Excel文件读取商品信息
# 假设 `product_info.xlsx` 文件有一个名为 `Products` 的工作表
try:
    df_products = pd.read_excel('product_info.xlsx', sheet_name='Products')
    print(f">>> 商品信息读取成功!共 {df_products.shape[0]} 行。")
    display(df_products.head())
except FileNotFoundError:
    print(">>> Excel文件未找到,正在创建示例商品数据...")
    # 生成模拟商品数据
    product_data = {
        'product_id': ['P' + str(i).zfill(3) for i in range(1, 21)],
        'product_name': [f'商品_{i}' for i in range(1, 21)],
        'cost_price': np.round(np.random.uniform(30, 1500, 20), 2),
        'brand': np.random.choice(['品牌A', '品牌B', '品牌C', '品牌D'], 20),
        'warehouse': np.random.choice(['华北仓', '华东仓', '华南仓'], 20)
    }
    df_products = pd.DataFrame(product_data)
    # 保存为Excel文件,需要 openpyxl 库
    df_products.to_excel('product_info.xlsx', sheet_name='Products', index=False)
    print(">>> 示例商品数据已生成并保存!")
    display(df_products.head())

步骤5:数据概览与基本信息查看

# 4. 数据基础探查 - 订单数据
print("="*50)
print("【订单数据概览】")
print("="*50)
print("1. 数据形状 (行数, 列数):", df_orders.shape)
print("\n2. 列名与数据类型:")
print(df_orders.dtypes)
print("\n3. 基本信息 (包含非空值计数):")
df_orders.info()
print("\n4. 数值型字段的统计描述 (均值、标准差、分位数等):")
display(df_orders.describe())
print("\n5. 查看是否存在缺失值:")
print(df_orders.isnull().sum())

步骤6:简单数据筛选与排序

# 5. 数据初步操作实战
print("="*50)
print("【实战操作:数据筛选与排序】")
print("="*50)
# a) 筛选特定城市的订单,例如上海
orders_shanghai = df_orders[df_orders['city'] == '上海']
print(f">>> 上海的订单共有 {orders_shanghai.shape[0]} 笔。")
display(orders_shanghai.head())

# b) 筛选金额大于1000的订单
high_value_orders = df_orders[df_orders['total_amount'] > 1000]
print(f">>> 金额大于1000的高价值订单有 {high_value_orders.shape[0]} 笔。")

# c) 按订单金额降序排列,查看Top 10
top10_orders = df_orders.sort_values(by='total_amount', ascending=False).head(10)
print(">>> 订单金额Top 10:")
display(top10_orders[['order_id', 'user_id', 'total_amount', 'city', 'category']])

# d) 按商品类别统计订单数量
category_order_count = df_orders['category'].value_counts()
print(">>> 各商品类别订单数量分布:")
print(category_order_count)

步骤7:数据合并(关联订单与商品)

# 6. 数据合并:将订单数据与商品信息关联
print("="*50)
print("【实战操作:数据合并】")
print("="*50)
# 使用 product_id 作为键,进行左连接,保留所有订单记录
df_merged = pd.merge(df_orders, df_products, on='product_id', how='left')
print(f">>> 合并后的数据形状: {df_merged.shape}")
print(">>> 合并后数据列名:", df_merged.columns.tolist())
display(df_merged.head())

# 计算毛利润 (假设 total_amount 是销售额)
df_merged['gross_profit'] = df_merged['total_amount'] - (df_merged['cost_price'] * df_merged['quantity'])
print(">>> 已计算毛利润,前5行数据:")
display(df_merged[['order_id', 'product_id', 'total_amount', 'cost_price', 'quantity', 'gross_profit']].head())

步骤8:基础可视化 – 销售类别分布

# 7. 基础数据可视化
print("="*50)
print("【实战操作:基础可视化】")
print("="*50)
# 绘制订单类别的柱状图
plt.figure(figsize=(10, 6))
category_order_count.plot(kind='bar', color='skyblue', edgecolor='black')
plt.title('各商品类别订单数量分布', fontsize=15)
plt.xlabel('商品类别', fontsize=12)
plt.ylabel('订单数量', fontsize=12)
plt.xticks(rotation=45)  # 旋转x轴标签
plt.tight_layout()
plt.show()

# 绘制城市销售额饼图
city_sales = df_orders.groupby('city')['total_amount'].sum().sort_values(ascending=False)
plt.figure(figsize=(8, 8))
plt.pie(city_sales.values, labels=city_sales.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette('pastel'))
plt.title('各城市销售额占比', fontsize=15)
plt.show()

步骤9:保存处理结果

# 8. 将处理后的数据保存为新文件
df_merged.to_csv('processed_orders_with_profit.csv', index=False, encoding='utf-8')
print(">>> 处理后的合并数据已保存为 'processed_orders_with_profit.csv'")

本日要点总结

  1. 环境是根基:成功配置Python、Jupyter及Pandas等库是第一步。
  2. pd.read_csv() pd.read_excel() 是读取本地文件最常用的函数。
  3. 数据预览四板斧.head().info().describe().isnull().sum()
  4. 数据筛选:使用布尔索引 df[df['列名'] > 值]
  5. 数据排序.sort_values()
  6. 数据合并pd.merge() 实现类似SQL的JOIN操作。
  7. 初步可视化:Pandas内置的 .plot() 方法快速绘图。