Skip to content

9triver/finbric

Repository files navigation

Finbric - 金融数据集市演示项目

使用 dbt 构建金融数据集市的完整演示,展示如何将散落在各个数据库中的"脏数据"转换为干净的业务数据集市。

dbt SQLite Python

🎯 项目目标

演示如何使用 dbt 处理金融行业的数据:

  • 📥 从多个源系统抽取数据(客户、账户、交易)
  • 🔄 清洗和标准化数据(处理脏数据、不一致格式)
  • 🔒 脱敏敏感信息(身份证、电话、账号)
  • 📊 构建业务数据集市(客户360视图、交易分析)

🚀 快速开始(5分钟演示)

前置要求

# 安装 Python 3.9+
python3 --version

# 安装 dbt-sqlite
pip3 install dbt-sqlite

演示步骤

1️⃣ 创建源数据库(包含"脏数据")

python3 setup_sqlite.py

输出示例:

✅ 插入了 8 条客户数据(包含需要清洗的问题)
✅ 插入了 10 条账户数据(包含需要标准化的问题)
✅ 插入了 100 条交易数据(包含需要转换的问题)

📊 源数据质量问题示例:
  • 姓名有多余空格(如 '  李四  ')
  • 客户类型不统一(individual / PERSON / 个人)
  • 邮箱大小写混乱(LISI@EXAMPLE.COM)
  • 敏感信息完全暴露(身份证号、电话号码、账号)
  • 账户类型不统一(储蓄 / checking / SAVINGS / 投资)
  • 交易类型中英文混杂(支付 / PAYMENT / 取款)
  • 金额包含负数(-34420.08)

2️⃣ 安装 dbt 依赖并运行数据处理

# 安装依赖包
dbt deps

# 运行数据处理流程
dbt run

输出示例:

Found 7 models, 2 analyses, 17 data tests, 3 sources, 543 macros

1 of 7 START sql table model main_staging.stg_core_banking__customers ..... [RUN]
1 of 7 OK created sql table model main_staging.stg_core_banking__customers  [OK in 0.01s]
...
7 of 7 OK created sql table model main_mart.mart_customer_360 ............. [OK in 0.01s]

Completed successfully
Done. PASS=7 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=7

3️⃣ 查看处理结果

python3 show_results.py

4️⃣ 运行数据质量测试

dbt test

输出示例:

Done. PASS=17 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=17

📊 数据转换效果展示

1️⃣ 客户数据转换

源数据(有问题):

customer_id  customer_name  customer_type  id_number           phone         email               
-----------  -------------  -------------  ------------------  ------------  --------------------
CUST002        李四         PERSON         110101199002021235  13800138001   LISI@EXAMPLE.COM    
CUST003      王五           个人           110101199003031236  13800138002   wangwu@example.com  

❌ 问题:

  • 姓名有多余空格
  • 客户类型不统一(PERSON / 个人)
  • 邮箱大小写混乱
  • 敏感信息完全暴露

处理后数据(干净):

customer_id  customer_name  customer_type  id_number          phone        email                 is_active
-----------  -------------  -------------  -----------------  -----------  --------------------  ---------
CUST002      李四           INDIVIDUAL     110**********1235  138****8001  lisi@example.com      0        
CUST003      王五           INDIVIDUAL     110**********1236  138****8002  wangwu@example.com    0        

✅ 改进:

  • ✓ 姓名已清洗(去除空格)
  • ✓ 客户类型已标准化(统一为 INDIVIDUAL)
  • ✓ 邮箱已规范化(全部小写)
  • ✓ 敏感信息已脱敏(身份证保留前3后4位,电话保留前3后4位)
  • ✓ 新增活跃标识字段

2️⃣ 账户数据转换

源数据(有问题):

account_id  account_type  account_number    balance    currency  status
----------  ------------  ----------------  ---------  --------  ------
ACC001      储蓄          6222000012340001  156789.5   CNY       正常  
ACC002      checking      6222000012340002  45678.2    cny       ACTIVE
ACC003      SAVINGS       6222000012340003  234567.8   CNY       活跃  

❌ 问题:

  • 账户类型中英文混杂(储蓄 / checking / SAVINGS)
  • 账号完全暴露
  • 币种大小写不统一(CNY / cny)
  • 状态描述不统一(正常 / ACTIVE / 活跃)

处理后数据(干净):

account_id  account_type  account_number  balance    currency  status  is_active
----------  ------------  --------------  ---------  --------  ------  ---------
ACC001      SAVINGS       0001            156789.5   CNY       ACTIVE  1        
ACC002      CHECKING      0002            45678.2    CNY       ACTIVE  1        
ACC003      SAVINGS       0003            234567.8   CNY       ACTIVE  1        

✅ 改进:

  • ✓ 账户类型已标准化(SAVINGS / CHECKING / INVESTMENT)
  • ✓ 账号已脱敏(仅显示后4位)
  • ✓ 币种已统一(全部大写 CNY)
  • ✓ 状态已标准化(统一为 ACTIVE / INACTIVE / FROZEN / CLOSED)
  • ✓ 新增活跃标识字段

3️⃣ 交易数据转换

源数据(有问题):

transaction_id  transaction_type  amount     currency  status  channel 
--------------  ----------------  ---------  --------  ------  --------
TXN00001        支付              -34420.08  Cny       处理中  手机银行
TXN00002        取款              -1300.42   Cny       成功    ONLINE  
TXN00003        TRANSFER          26163.58   cny       成功    柜台    

❌ 问题:

  • 交易类型中英文混杂(支付 / PAYMENT / 取款)
  • 金额包含负数(-34420.08)
  • 币种大小写混乱(Cny / cny / CNY)
  • 状态不统一(处理中 / 成功 / SUCCESS)
  • 渠道名称不规范(手机银行 / ONLINE / 柜台)

处理后数据(干净):

transaction_id  transaction_type  amount    amount_direction  currency  status   channel  is_successful
--------------  ----------------  --------  ----------------  --------  -------  -------  -------------
TXN00001        PAYMENT           34420.08  DEBIT             CNY       PENDING  MOBILE   0            
TXN00002        WITHDRAWAL        1300.42   DEBIT             CNY       SUCCESS  ONLINE   1            
TXN00003        TRANSFER          26163.58  CREDIT            CNY       SUCCESS  BRANCH   1            

✅ 改进:

  • ✓ 交易类型已标准化(DEPOSIT / WITHDRAWAL / TRANSFER / PAYMENT)
  • ✓ 金额转为绝对值,新增方向字段(CREDIT / DEBIT)
  • ✓ 币种已统一(CNY)
  • ✓ 状态已标准化(SUCCESS / PENDING / FAILED / CANCELLED)
  • ✓ 渠道已标准化(MOBILE / ONLINE / ATM / BRANCH)
  • ✓ 新增时间维度字段(年、月、日、星期)和成功标识

4️⃣ 业务数据集市

客户360度视图

customer_id  customer_name  customer_type  account_count  balance       txn_6m  customer_segment  ltv  
-----------  -------------  -------------  -------------  ------------  ------  ----------------  -----
CUST004      科技有限公司   CORPORATE      1              1,234,567.90  6       STANDARD          100.0
CUST003      王五           INDIVIDUAL     2              840,123.45    8       STANDARD          100.0
CUST001      张三           INDIVIDUAL     2              202,467.70    11      PREMIUM           87.74

💡 业务价值:

  • ✓ 整合客户、账户、交易多维度数据
  • ✓ 自动计算客户分群(VIP / PREMIUM / STANDARD / INACTIVE)
  • ✓ 余额分级(HIGH / MEDIUM / LOW)
  • ✓ 活跃度评估
  • ✓ LTV(客户终身价值)评分
  • ✓ 支持精准营销和客户管理

交易日汇总

transaction_date  count  amount       deposit  withdraw  mobile  online
----------------  -----  -----------  -------  --------  ------  ------
2025-10-09        1      145.55       0        1         0       0     
2025-10-08        1      49,814.76    0        0         0       0     
2025-10-07        1      20,039.61    0        1         0       0     
2025-09-30        3      54,531.58    0        1         2       1     

💡 业务价值:

  • ✓ 按日汇总所有交易数据
  • ✓ 按交易类型分类统计
  • ✓ 按渠道分析(手机银行、网银、ATM、柜台)
  • ✓ 支持日常运营监控和趋势分析

🏗️ 项目架构

源数据库(有问题的脏数据)
    ↓
┌─────────────────────────────────────────┐
│  Staging 层 (main_staging.db)           │
│  • stg_core_banking__customers          │
│  • stg_core_banking__accounts           │
│  • stg_transaction_system__transactions │
│  ✓ 数据清洗、标准化、脱敏                │
└─────────────────────────────────────────┘
    ↓
┌─────────────────────────────────────────┐
│  Intermediate 层 (main_intermediate.db) │
│  • int_customer_accounts                │
│  • int_customer_transactions            │
│  ✓ 业务逻辑转换、数据聚合                │
└─────────────────────────────────────────┘
    ↓
┌─────────────────────────────────────────┐
│  Mart 层 (main_mart.db)                 │
│  • mart_customer_360                    │
│  • mart_transaction_daily_summary       │
│  ✓ 业务数据集市、分析视图                │
└─────────────────────────────────────────┘

📁 项目结构

finbric/
├── source_data.db              # 源数据库(包含脏数据)
├── target_schemas/             # 处理后的数据库
│   ├── main_staging.db         # Staging 层
│   ├── main_intermediate.db    # Intermediate 层
│   └── main_mart.db           # Mart 层(业务集市)
│
├── setup_sqlite.py             # 生成演示数据
├── show_results.py             # 展示处理结果对比
│
├── dbt_project.yml             # dbt 项目配置
├── packages.yml                # 依赖包配置
│
├── models/                     # 数据模型(SQL)
│   ├── sources.yml            # 数据源定义
│   │
│   ├── staging/               # Staging 层
│   │   ├── core_banking/
│   │   │   ├── stg_core_banking__customers.sql
│   │   │   └── stg_core_banking__accounts.sql
│   │   └── transaction_system/
│   │       └── stg_transaction_system__transactions.sql
│   │
│   ├── intermediate/          # Intermediate 层
│   │   └── customer/
│   │       ├── int_customer_accounts.sql
│   │       └── int_customer_transactions.sql
│   │
│   └── mart/                  # Mart 层
│       ├── customer/
│       │   └── mart_customer_360.sql
│       └── transaction/
│           └── mart_transaction_daily_summary.sql
│
├── tests/                     # 数据质量测试
│   ├── generic/              # 通用测试
│   └── mart/                 # 业务测试
│
├── macros/                    # SQL 宏和函数
├── analyses/                  # 分析查询
└── docs/                      # 项目文档

📈 数据统计

数据类型 源数据量 处理后 说明
客户数据 8 条 8 条 完成清洗、标准化、脱敏
账户数据 10 条 10 条 完成类型标准化、脱敏
交易数据 100 条 100 条 完成类型转换、金额处理
客户360视图 - 8 条 新增:整合多维度数据
交易日汇总 - 36 天 新增:按日聚合分析
数据质量测试 - 17/17 通过 ✅ 全部通过

🎯 核心价值体现

1️⃣ 数据标准化

  • 统一不同系统的字段格式
  • 统一枚举值(类型、状态、渠道等)
  • 统一命名规范

2️⃣ 数据清洗

  • 去除多余空格
  • 统一大小写
  • 数据格式规范化

3️⃣ 数据脱敏

  • 身份证号:保留前3后4位
  • 电话号码:保留前3后4位
  • 账户号码:仅保留后4位

4️⃣ 业务转换

  • 金额方向化(CREDIT/DEBIT)
  • 活跃度标识
  • 客户分群(VIP/PREMIUM/STANDARD)
  • LTV评分计算

5️⃣ 数据集市

  • 客户360度视图
  • 交易日汇总分析
  • 支持精准营销和运营决策

🛠️ 技术栈

  • dbt-core 1.10+ - 数据转换工具
  • dbt-sqlite 1.10+ - SQLite 适配器
  • SQLite 3 - 演示数据库
  • Python 3.9+ - 脚本语言
  • dbt_utils - dbt 工具包

📝 常用命令

# 查看源数据问题
python3 setup_sqlite.py

# 安装依赖
dbt deps

# 运行数据处理
dbt run

# 运行特定层
dbt run --select staging          # 只运行 Staging 层
dbt run --select intermediate     # 只运行 Intermediate 层
dbt run --select mart             # 只运行 Mart 层

# 运行特定模型
dbt run --select mart_customer_360

# 查看处理结果
python3 show_results.py

# 运行数据质量测试
dbt test

# 运行特定测试
dbt test --select mart_customer_360

# 生成和查看文档
dbt docs generate
dbt docs serve

# 查看模型血缘关系
dbt docs generate
# 在浏览器中查看依赖关系图

# 清理生成文件
dbt clean

🧪 数据质量保证

项目包含 17 个数据质量测试

  • ✅ 主键唯一性测试(6个)
  • ✅ 主键非空测试(6个)
  • ✅ 源数据完整性测试(4个)
  • ✅ 业务规则验证测试(1个)

运行 dbt test 可以验证:

  • 所有主键字段非空且唯一
  • 业务逻辑正确(余额非负、账户数逻辑、LTV评分范围)
  • 跨表关联完整

📚 学习资源

项目文档

外部资源

🎓 适用场景

本项目适合以下学习场景:

  1. 学习 dbt - 完整的 dbt 项目示例
  2. 数据工程 - 了解数据清洗、转换、建模流程
  3. 数据仓库 - 理解分层架构(Staging → Intermediate → Mart)
  4. 金融数据 - 了解金融行业数据处理需求
  5. 数据质量 - 学习数据验证和测试方法

🚀 扩展方向

可以基于本项目扩展:

  1. 添加更多数据源

    • 产品系统数据
    • 风控系统数据
    • 客服系统数据
  2. 构建更多数据集市

    • 产品分析集市
    • 风险管理集市
    • 渠道效能集市
    • 营销效果集市
  3. 集成 BI 工具

    • Metabase
    • Superset
    • Tableau
    • Power BI
  4. 实施增量更新

    • 修改模型为增量物化
    • 添加数据分区策略
    • 优化大数据处理

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License


🎉 开始您的数据集市之旅!

如有任何问题,请查看 演示指南 或提交 Issue。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages