继续只用 Excel 的风险
同一个客户可能在不同表中反复出现;文件版本可能混乱;多人同时修改容易冲突;数据权限很难细分;当数据超过几十万行时,筛选、计算和打开文件都会变慢。
Python在金融中的应用 · 第二部分
当数据从“一张作业表”变成“长期积累的客户、交易、授信和还款记录”时,只靠 Excel 会越来越困难。数据库的作用,是把数据结构化保存,并让 Python 能稳定、可重复地读取和写入数据。
Excel 很适合小规模整理和临时计算,但金融数据通常有三个特点:数据量会不断增加,数据表之间存在关系,数据访问需要权限控制。只要进入长期项目、多人协作或网页应用场景,就应该理解数据库。
同一个客户可能在不同表中反复出现;文件版本可能混乱;多人同时修改容易冲突;数据权限很难细分;当数据超过几十万行时,筛选、计算和打开文件都会变慢。
数据库把数据放进表中,每张表有清楚字段。可以用 SQL 查询需要的数据,用账号权限控制访问,用备份机制降低误删风险,用 Python 自动读取数据并继续分析。
简单判断:如果数据只用一次,可以先用 Excel;如果数据要持续积累、多人使用、反复查询,或者要支撑网页和应用,就应该使用数据库。
数据库不神秘。可以把它先理解成“更规范、更可查询、更能多人协作的表格系统”。学习 MySQL 前,先掌握几个词。
| 概念 | 直观理解 | 小微信贷例子 |
|---|---|---|
| 数据库 database | 一组相关数据表的集合。 | inclusive_finance 数据库。 |
| 表 table | 一张结构化表格。 | 客户表、贷款表、还款表、城市指数表。 |
| 字段 column | 表中的一列,代表一个变量。 | 客户编号、行业、贷款金额、违约标记。 |
| 记录 row | 表中的一行,代表一个观测。 | 某一个商户的一笔贷款记录。 |
| 主键 primary key | 能唯一识别一行记录的字段。 | customer_id 或 loan_id。 |
| SQL | 操作数据库的查询语言。 | 查询某城市某一年小微信贷平均额度。 |
市面上的数据库很多,不需要一开始全部掌握。先理解它们各自解决什么问题:有的适合交易记录,有的适合本地小文件,有的适合文档数据,有的适合高速缓存,有的适合大规模分析。下面这些是学习和项目中经常会遇到的数据库。
关系型数据库
最常见的开源关系型数据库之一,很多网站、业务系统和云数据库服务都支持。适合学习 SQL、表结构、用户权限和 Python 连接数据库。
官方站点
关系型数据库
功能强、扩展性好,适合更复杂的数据类型、地理空间数据和严肃业务系统。它和 MySQL 都使用 SQL,但在功能细节和生态上不同。
官方站点嵌入式数据库
不需要单独启动服务器,一个数据库就是一个文件。适合本地小项目、手机应用、桌面软件和课程练习,不适合多人同时写入的大型系统。
官方站点关系型数据库
从 MySQL 生态发展而来,很多命令和使用习惯与 MySQL 接近。适合需要开源关系型数据库、并希望兼容 MySQL 使用经验的场景。
官方站点文档型数据库
数据以类似 JSON 的文档保存,不强制每条记录都有完全相同的字段。适合内容系统、日志、半结构化数据和快速变化的数据结构。
官方站点内存数据库 / 缓存
读写速度很快,常用于缓存、排行榜、会话、实时计数和简单消息队列。它不是替代 MySQL 的普通表格数据库,而是解决高频访问问题。
官方站点商业关系型数据库
微软生态中的关系型数据库,常与 Windows Server、Azure、Power BI 和企业管理系统配合使用。适合了解企业级数据库场景。
官方文档分析型嵌入式数据库
适合在本机或 Python 环境中直接分析 CSV、Parquet 等数据文件。可以把它理解为“面向数据分析的 SQLite”,很适合教学和数据探索。
官方站点本课程以 MySQL 为主,因为它适合讲清楚“服务器、账号、数据库、表、SQL、Python 连接”这一整套工作流。SQLite 和 DuckDB 更适合本地分析;MongoDB、Redis、SQL Server 等可以作为扩展了解。
先创建一个非常小的客户表。这个表只用于练习,字段包括客户编号、城市、行业、贷款金额、年利率和是否违约。
CREATE TABLE micro_loan_customers (
customer_id INT PRIMARY KEY,
city VARCHAR(50),
industry VARCHAR(50),
loan_amount DECIMAL(12, 2),
annual_rate DECIMAL(5, 4),
default_flag INT
);
这段 SQL 的意思是:创建一张名为 micro_loan_customers 的表。customer_id 是主键,每个客户只能有一个唯一编号。loan_amount 用于保存贷款金额,default_flag 用 0 或 1 表示是否违约。
INSERT INTO micro_loan_customers
(customer_id, city, industry, loan_amount, annual_rate, default_flag)
VALUES
(1, '杭州', '餐饮', 80000, 0.0580, 0),
(2, '宁波', '零售', 120000, 0.0620, 0),
(3, '温州', '制造', 200000, 0.0680, 1),
(4, '嘉兴', '物流', 150000, 0.0600, 0);
插入数据后,就可以查询。例如,查看所有客户,或者计算不同城市的平均贷款金额。
SELECT * FROM micro_loan_customers;
SELECT city, AVG(loan_amount) AS avg_loan
FROM micro_loan_customers
GROUP BY city;
Python 连接 MySQL 的基本思路是:安装驱动,准备连接信息,建立连接,执行 SQL,最后把结果读入 Pandas 做进一步分析。
pip install pymysql pandas
下面是一段最小连接代码。实际使用时,不要把真实密码写进公开网页、公开仓库或截图中。这里用占位符表示。
import pymysql
import pandas as pd
connection = pymysql.connect(
host="你的数据库地址",
port=3306,
user="你的用户名",
password="你的密码",
database="inclusive_finance",
charset="utf8mb4"
)
sql = """
SELECT city, industry, loan_amount, annual_rate, default_flag
FROM micro_loan_customers
WHERE loan_amount >= 100000
"""
df = pd.read_sql(sql, connection)
print(df)
connection.close()
这段代码最重要的不是记住每个参数,而是理解每个参数的含义:host 是数据库服务器地址,port 通常是 3306,user 和 password 是账号密码,database 是要连接的数据库名称。
如果连接失败,先检查四件事:数据库是否启动;账号和密码是否正确;数据库名是否写对;如果是云数据库,是否设置了白名单或安全组。
读取数据库只是第一步。很多实际项目中,还需要把清洗后的结果或模型输出写回数据库。下面示例插入一条新的客户记录。
import pymysql
connection = pymysql.connect(
host="你的数据库地址",
port=3306,
user="你的用户名",
password="你的密码",
database="inclusive_finance",
charset="utf8mb4"
)
sql = """
INSERT INTO micro_loan_customers
(customer_id, city, industry, loan_amount, annual_rate, default_flag)
VALUES (%s, %s, %s, %s, %s, %s)
"""
data = (5, "绍兴", "批发", 90000, 0.0610, 0)
with connection.cursor() as cursor:
cursor.execute(sql, data)
connection.commit()
connection.close()
这里的 %s 是参数占位符。不要用字符串拼接方式把用户输入直接拼进 SQL,因为那样容易出现 SQL 注入风险。虽然本节只是入门,但从一开始就要养成安全写法。
练习 MySQL 有多种方式,不必所有同学都购买云服务。可以根据学习目的和成本选择。
| 方案 | 适合情况 | 优点 | 注意事项 |
|---|---|---|---|
| 阿里云 RDS MySQL | 希望练习云数据库、白名单、远程连接和数据库管理。 | 托管服务,包含备份、监控、恢复等能力。 | 会产生费用;购买页面和配置价格以官网实时显示为准。 |
| 阿里云轻量数据库服务 | 轻量应用、开发测试、小型项目。 | 面向轻量级应用,可与轻量应用服务器内网连接。 | 官方文档显示支持 MySQL 5.7 和 MySQL 8.0;不同地域和套餐以购买页为准。 |
| 学院服务器 MySQL | 希望在统一环境中练习,不想自己安装。 | 老师可以提供测试账号,便于统一演示。 | 只用于课程练习,不要上传敏感数据;账号权限应限制在测试数据库内。 |
| 本机 MySQL | 希望完全在自己电脑上练习。 | 成本低,适合反复试错。 | 需要自行安装和配置;换电脑或重装系统时要注意备份。 |
如果选择云端 MySQL,可以从阿里云官方页面开始。不要只看价格,也要看地域、版本、白名单、安全组、备份策略和是否需要公网访问。
阿里云 RDS 是托管型关系数据库服务,支持 MySQL 等引擎,适合练习标准云数据库实例、账号、数据库和连接地址配置。
轻量数据库服务面向轻量级应用。官方文档说明可与轻量应用服务器通过内网连接,并支持 MySQL 5.7 和 MySQL 8.0。
阿里云官方文档提供了通过应用程序访问 RDS MySQL 的示例,其中包括 Python 连接方式。实际操作时以文档和控制台页面为准。
老师可以提供现成 MySQL 测试库和账号。拿到账号后,只需要记录主机地址、端口、数据库名、用户名和密码。第一次连接时,先运行 SELECT 1;,确认能连通,再进入建表和查询练习。
学院服务器账号只用于课程练习。不要修改公共表,不要上传真实敏感数据,不要把账号密码发到公开群、网页或仓库。
本机安装适合反复练习。可以安装 MySQL Community Server,也可以使用 Docker 运行 MySQL。初学时建议先用图形化工具或命令行确认 MySQL 能启动,再让 Python 连接。
# 如果使用 Docker,可参考这样的练习命令
docker run --name mysql-course \
-e MYSQL_ROOT_PASSWORD=course_password \
-e MYSQL_DATABASE=inclusive_finance \
-p 3306:3306 \
-d mysql:8.0
安全要求:真实业务数据、个人信息、银行流水、客户联系方式等敏感数据不能放进公开练习环境。课程示例应使用合成数据或脱敏数据。
为“小微商户贷款记录”设计一张表,至少包含贷款编号、客户编号、城市、行业、贷款金额、利率、是否违约和贷款年份。写出字段名和字段含义。
写出三条查询:查看全部记录;筛选贷款金额大于 10 万元的记录;按照城市计算平均贷款金额。
把查询结果读入 Pandas DataFrame,并打印前五行。观察列名、数据类型和金额单位是否符合预期。
列出连接云数据库前必须检查的事项:白名单、账号权限、密码保存位置、是否使用真实敏感数据。