使用 DataTable 分析销售数据的学习笔记

使用 DataTable 分析销售数据的学习笔记

记录使用 Python 的 datatable 库分析销售数据的学习过程,包含数据加载、过滤、分组、连接和保存等操作的代码示例和心得。

安装与环境配置

  • 安装 DataTable:
    1
    pip install datatable
  • 确认安装:
    1
    2
    import datatable as dt
    print(dt.__version__)

基本操作

1. 读取数据

  • 从 CSV 文件读取销售数据,文件包含客户ID、产品、类别、价格、数量和订单日期:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from datatable import dt
    import chardet

    # 检查文件编码
    with open("01.csv", "rb") as f:
    result = chardet.detect(f.read())
    print("01.csv 的编码方式:")
    print(result)

    # 读取数据
    data = dt.fread("01.csv", sep=",", encoding="GB2312")
    print("原始数据预览:")
    print(data.head())
  • 示例输出(基于 01.csv 内容):
    1
    2
    3
    4
    5
    6
    7
      | 客户ID  产品      类别      价格  数量  订单日期
    |-------|--------|--------|------|------|---------
    0 | 101 笔记本 电子产品 5000 10 2025/8/1
    1 | 102 手机 电子产品 4000 20 2025/8/10
    2 | 103 鼠标 电子产品 20 20 2025/8/25
    3 | 104 书桌 家具 1000 4 2025/8/4
    4 | 105 椅子 家具 500 2 2025/8/12

2. 数据筛选

  • 筛选价格大于 1000 的高价值订单:
    1
    2
    3
    high_value = data[dt.f["价格"] > 1000, :]
    print("高价值订单:")
    print(high_value)
  • 示例输出:
    1
    2
    3
    4
      | 客户ID  产品    类别      价格  数量  订单日期
    |-------|------|--------|------|------|---------
    0 | 101 笔记本 电子产品 5000 10 2025/8/1
    1 | 102 手机 电子产品 4000 20 2025/8/10

3. 数据分组与聚合

  • 计算每笔订单的总金额(价格 × 数量),并按类别分组求和:
    1
    2
    3
    4
    data[:, dt.update(total_amount=dt.f["价格"] * dt.f["数量"])]
    grouped_data = data[:, dt.sum(dt.f.total_amount), dt.by(dt.f["类别"])]
    print("按类别分组的总销售额:")
    print(grouped_data)
  • 示例输出:
    1
    2
    3
    4
      | 类别      total_amount
    |--------|------------
    0 | 家具 5000
    1 | 电子产品 84400

4. 合并数据集

  • 连接客户信息表,包含客户ID、姓名和城市:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      xin_data = """客户ID,姓名,城市
    101,王麻子,长沙
    102,石昊,北京
    103,李建国,广州
    104,王林,衡阳
    105,叶凡,桂林
    106,方圆,南宁
    """
    with open("02.csv", "w", encoding="GB2312") as f:
    f.write(xin_data)

    customers = dt.fread("02.csv", sep=",", encoding="GB2312")
    data[:, dt.update(客户ID=dt.as_type(dt.f["客户ID"], dt.Type.int32))]
    customers[:, dt.update(客户ID=dt.as_type(dt.f["客户ID"], dt.Type.int32))]
    customers.key = "客户ID"
    joined_data = data[:, :, dt.join(customers)]
    print("连接客户信息后的数据:")
    print(joined_data)
  • 示例输出:
    1
    2
    3
    4
    5
    6
    7
    8
      | 客户ID  产品      类别      价格  数量  订单日期    total_amount  姓名      城市
    |-------|--------|--------|------|------|----------|------------|-------|------
    0 | 101 笔记本 电子产品 5000 10 2025/8/1 50000 王麻子 长沙
    1 | 102 手机 电子产品 4000 20 2025/8/10 80000 石昊 北京
    2 | 103 鼠标 电子产品 20 20 2025/8/25 400 李建国 广州
    3 | 104 书桌 家具 1000 4 2025/8/4 4000 王林 衡阳
    4 | 105 椅子 家具 500 2 2025/8/12 1000 叶凡 桂林
    5 | 106 儿童手表 电子产品 200 20 2025/8/10 4000 方圆 南宁

5. 保存数据

  • 将连接结果保存为 03.csv,使用 GB2312 编码:
    1
    2
    3
    4
    csv_string = joined_data.to_csv()
    with open("03.csv", "w", encoding="GB2312") as f:
    f.write(csv_string)
    print("连接结果已保存至 03.csv")

常见问题

  • 编码问题:加载 01.csv02.csv 时,需指定 encoding="GB2312",否则中文列名可能出现乱码。使用 chardet 检查文件编码是个好习惯:
    1
    2
    with open("01.csv", "rb") as f:
    print(chardet.detect(f.read()))
  • 数据类型不匹配:连接表时,客户ID 的数据类型必须一致,使用 dt.as_type(dt.Type.int32) 转换:
    1
    data[:, dt.update(客户ID=dt.as_type(dt.f["客户ID"], dt.Type.int32))]
  • 保存编码限制to_csv() 不支持 encoding 参数,需先获取 CSV 字符串,再用 open() 保存为 GB2312

学习心得

  • 高效性datatable 的语法简洁,处理速度快,特别适合大数据场景。相比 Pandas,它的内存占用更低。
  • 调试经验:遇到 KeyErrorTypeError 时,打印 data.namesdata.stypes 帮助快速定位问题。
  • 实践价值:通过这次分析销售数据,我学会了如何用 datatable 完成从数据加载到结果保存的全流程,感受到数据分析的逻辑之美。

资源

  • 官方文档:https://datatable.readthedocs.io/
  • 社区论坛:Stack Overflow、DataTable GitHub Issues