使用 DataTable 分析销售数据的学习笔记
使用 DataTable 分析销售数据的学习笔记
记录使用 Python 的 datatable 库分析销售数据的学习过程,包含数据加载、过滤、分组、连接和保存等操作的代码示例和心得。
安装与环境配置
- 安装 DataTable:
1
pip install datatable
- 确认安装:
1
2import datatable as dt
print(dt.__version__)
基本操作
1. 读取数据
- 从 CSV 文件读取销售数据,文件包含客户ID、产品、类别、价格、数量和订单日期:
1
2
3
4
5
6
7
8
9
10
11
12
13from 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
3high_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
4data[:, 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
18xin_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
4csv_string = joined_data.to_csv()
with open("03.csv", "w", encoding="GB2312") as f:
f.write(csv_string)
print("连接结果已保存至 03.csv")
常见问题
- 编码问题:加载
01.csv和02.csv时,需指定encoding="GB2312",否则中文列名可能出现乱码。使用chardet检查文件编码是个好习惯:1
2with 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,它的内存占用更低。 - 调试经验:遇到
KeyError或TypeError时,打印data.names和data.stypes帮助快速定位问题。 - 实践价值:通过这次分析销售数据,我学会了如何用
datatable完成从数据加载到结果保存的全流程,感受到数据分析的逻辑之美。
资源
- 官方文档:
https://datatable.readthedocs.io/ - 社区论坛:Stack Overflow、DataTable GitHub Issues