资讯动态

从JSON到SQL:机器学习数据准备全流程解析

发布时间:2026/9/8 10:56:25 来源:尧图企业网站定制
在机器学习项目中拿到一份可以直接训练的干净数据集往往比调模型参数更花时间。很多真实数据不会以 CSV 表格的形式摆在面前而是分散在 API 返回的 JSON 字符串里或者躺在 MySQL、PostgreSQL、SQLite 的某张业务表中。今天这篇是 100 天机器学习系列的第 16 天学习笔记聚焦 CampusX 课程中“数据处理”这一阶段梳理从 JSON 和 SQL 两类来源读取数据、清洗数据、落地数据并最终变成可用于训练的特征表的完整流程。学完之后你应该能独立完成一次“从接口 JSON 到数据库表再到 DataFrame”的数据准备过程。1. 先弄清楚 JSON 和 SQL 在机器学习流程中的角色很多入门教程会把数据处理简单地等同于“用 pandas 读个 CSV”但真实项目很少这么顺利。数据要么来自外部系统要么来自业务数据库。JSON 和 SQL 是两种最常见的承载方式理解它们在机器学习流程中的位置比单纯记住函数更有价值。1.1 JSONAPI 数据和日志数据的主要格式JSONJavaScript Object Notation是一种轻量级数据交换格式。它支持对象、数组、字符串、数字、布尔值和 null因此在传输结构复杂的业务数据时非常灵活。机器学习场景里JSON 最常出现在三个地方第三方 API 响应比如天气接口、电商商品接口、社交媒体开放接口返回结果通常是多层嵌套 JSON。行为日志文件埋点系统把用户点击、浏览、搜索行为以 JSON 行格式写入日志服务采集后导出为.json或.jsonl。配置文件很多模型训练框架、调度平台使用 JSON 保存配置参数虽然这不是主要训练数据但解析逻辑相通。JSON 的核心优势是可表达嵌套关系。比如一个“用户下单事件”可以同时包含用户信息、收货地址、订单明细、商品列表用传统二维表存储时需要拆成多张表而 JSON 可以在一段文本内完整描述。但这个优势对机器学习来说也是一道门槛嵌套结构不能直接进入模型必须先被展平成“一行一个样本”的表格形式。1.2 SQL结构化业务数据的主要来源SQLStructured Query Language是与关系型数据库交互的标准语言。用户表、订单表、交易流水表、商品表通常都存在关系型数据库中。机器学习建模时这些表是最常见的特征来源。在机器学习项目中SQL 扮演的不是“算法”角色而是“取数”和“特征工程”角色数据提取从指定表中选择字段。数据过滤根据时间、状态、渠道等条件筛选样本。数据聚合统计每个用户的订单数、点击量、消费金额。数据关联把用户表和订单表连接成一张宽表。窗口计算计算用户最近 30 天消费排名、累计金额等滑动特征。很多数据分析师和算法工程师形成了这样的习惯先用 SQL 在数据库端完成尽可能多的过滤和聚合减少传输到 Python 进程的数据量再用 pandas 做更灵活的特征加工。这个取舍会在后面的章节展开。1.3 从原始数据到训练集的完整链路无论数据来自 JSON 还是 SQL进入训练前的处理链路都是相似的阶段主要工作常见工具或操作数据获取从接口、文件、数据库读取原始数据requests、json、sqlite3、SQLAlchemy数据解析将 JSON 或查询结果转换成表格json.loads、pd.json_normalize、pd.read_sql数据清洗处理缺失值、重复值、类型错误dropna、fillna、astype、to_datetime特征加工聚合、关联、衍生新特征groupby、merge、SQL JOIN、窗口函数数据存储把中间结果写回数据库或文件to_sql、to_csv、to_json数据验证检查数据量、分布、结构是否符合预期shape、dtypes、isna、describe机器学习建模只占整个项目的一小部分。前面的数据链路越扎实后面训练和评估阶段越不容易被“脏数据”干扰。这也是 100 天机器学习系列把数据处理放在前期反复练习的原因。2. 环境准备最小依赖与示例数据设计这一节的目标是准备一套可以运行完整示例的开发环境并构造一份模拟数据。示例数据不需要来自真实业务只要包含 JSON 嵌套结构和 SQL 两张关联表即可这样所有后续代码都能连通。2.1 推荐开发环境和依赖库建议使用 Python 3.9 或更高版本编辑器可以用 VS Code、PyCharm 或 Jupyter Notebook。就本篇文章的示例而言核心依赖有四个库名作用安装方式pandas数据解析、清洗、分析pip install pandasrequests模拟从 HTTP 接口拉取 JSON 数据pip install requestssqlite3Python 内置 SQLite 驱动无需安装标准库SQLAlchemy连接各类数据库、执行 SQLpip install SQLAlchemy如果后续要连接 MySQL 或 PostgreSQL需要额外安装对应驱动比如 PyMySQL 或 psycopg2-binary。本篇文章以 SQLite 为主因为它是 Python 内置支持的关系型数据库文件即库非常适合学习和演示。建议使用虚拟环境隔离依赖python -m venv ml_env source ml_env/bin/activate # Windows 下使用 ml_env\Scripts\activate pip install pandas requests SQLAlchemy依赖安装完成后可以用一段小代码确认环境可用import pandas as pd import sqlite3 import requests print(pd.__version__) print(sqlite3.sqlite_version)看到输出的 pandas 版本和 SQLite 版本后环境就准备好了。版本号只需要能正常运行不一定要最新。2.2 设计一份“用户订单”示例数据为了让 JSON 和 SQL 两条线能串起来我设计了一个非常简单的场景一个电商平台有用户表和订单表同时通过一个模拟 API 返回用户行为日志。整个示例围绕“用户购买行为分析”展开。先准备一份 JSON 文件orders.json文件内容是一个列表每个元素代表一个用户内含用户基本信息和订单数组[ { user_id: 1, name: Alice, city: Beijing, orders: [ {order_id: 101, amount: 59.9, status: paid, created_at: 2024-01-05 10:12:33}, {order_id: 102, amount: 23.5, status: paid, created_at: 2024-01-09 14:22:11} ] }, { user_id: 2, name: Bob, city: Shanghai, orders: [ {order_id: 103, amount: 199.0, status: refunded, created_at: 2024-01-07 09:30:00} ] }, { user_id: 3, name: Cathy, city: Shenzhen, orders: [] } ]这份 JSON 的特点是user_id、name、city是用户维度信息orders是嵌套数组。如果直接用pd.read_json(orders.json)pandas 会把整个orders列表塞进一列里得到不便于建模的结构。后面会专门处理。再准备一个 SQLite 数据库文件shop.db包含users和orders两张表。先写一个建库脚本import sqlite3 conn sqlite3.connect(shop.db) cur conn.cursor() cur.execute( CREATE TABLE IF NOT EXISTS users ( user_id INTEGER PRIMARY KEY, name TEXT NOT NULL, city TEXT ) ) cur.execute( CREATE TABLE IF NOT EXISTS orders ( order_id INTEGER PRIMARY KEY, user_id INTEGER, amount REAL, status TEXT, created_at TEXT, FOREIGN KEY (user_id) REFERENCES users(user_id) ) ) users [ (1, Alice, Beijing), (2, Bob, Shanghai), (3, Cathy, Shenzhen), (4, David, Hangzhou), ] orders [ (101, 1, 59.9, paid, 2024-01-05 10:12:33), (102, 1, 23.5, paid, 2024-01-09 14:22:11), (103, 2, 199.0, refunded, 2024-01-07 09:30:00), (104, 4, 88.0, paid, 2024-01-12 20:15:00), (105, 4, 45.0, paid, 2024-01-13 08:00:00), (106, 4, 120.0, paid, 2024-01-15 12:45:00), ] cur.executemany(INSERT OR REPLACE INTO users VALUES (?, ?, ?), users) cur.executemany(INSERT OR REPLACE INTO orders VALUES (?, ?, ?, ?, ?), orders) conn.commit() conn.close()这个脚本创建了两张表并插入少量模拟数据。SQLite 的字段类型使用了 REAL、TEXT、INTEGER足够支撑示例。后续读取 JSON 得到的数据也会被写入这样的表中。2.3 为什么选择 SQLite 作为教学数据库很多初学者直接连接 MySQL、PostgreSQL容易在驱动安装、权限、远程连接上消耗大量时间。SQLite 的优势是数据库就是一个.db文件复制、删除、备份都非常简单。Python 内置sqlite3模块不需要额外安装数据库服务。SQL 语法与主流数据库高度一致学会后切换到 MySQL 的成本很低。当然SQLite 不适合高并发写入和生产级分布式部署但作为学习“SQL 取数 pandas 处理”这套流程是完全足够的。如果后续需要用到 MySQL只需要把连接字符串换成mysqlpymysql://username:passwordhost:port/dbname代码结构基本保持一致。3. 用 Python 处理 JSON从字符串到可训练表格完成了环境和数据准备下面进入 JSON 处理的核心部分。本节会从最基础的json模块讲起然后处理嵌套结构最后落到 DataFrame 这一层。3.1 读取 JSON 文件与 JSON 字符串Python 标准库json提供了两个最常用的方法json.load(fp)从文件对象读取解析成 Python 的 dict 或 list。json.loads(s)从字符串读取解析成 Python 的 dict 或 list。实际项目中接口返回的数据通常是字符串文件里保存的也是文本。下面这段代码演示两种读取方式import json # 方式1读取 JSON 文件 with open(orders.json, r, encodingutf-8) as f: data_from_file json.load(f) # 方式2读取 JSON 字符串 json_str {user_id: 5, name: Eva, city: Chengdu} data_from_str json.loads(json_str) print(type(data_from_file)) # list print(type(data_from_str)) # dict print(data_from_str[name]) # Eva这里要注意编码问题。Windows 环境下如果直接open(orders.json)可能遇到UnicodeDecodeError通常需要显式指定encodingutf-8。生产环境中如果 JSON 文件来自不同业务方编码可能不止 UTF-8可能是utf-8-sig、gbk等读取前先确认文件的原始编码。3.2 解析嵌套 JSON用 pandas.json_normalize 展平pd.read_json能直接读取 JSON但它对嵌套结构的处理并不智能。比如直接读取orders.jsonimport pandas as pd df pd.read_json(orders.json) print(df.head())输出通常是user_id name city orders 0 1 Alice Beijing [{order_id: 101, amount: 59.9, status: p... 1 2 Bob Shanghai [{order_id: 103, amount: 199.0, status: ... 2 3 Cathy Shenzhen []orders列里装的是一个列表这样的表格很难直接做特征提取。正确的做法是使用pandas.json_normalizeimport pandas as pd with open(orders.json, r, encodingutf-8) as f: data json.load(f) users_df pd.json_normalize( data, record_pathorders, meta[user_id, name, city] ) print(users_df.head())json_normalize是处理嵌套 JSON 的利器。关键参数有两个record_path指定要展开的嵌套数组路径这里填orders。meta希望保留在外层、作为每行记录附加字段的键这里填[user_id, name, city]。上面例子的结果是order_id amount status created_at user_id name city 0 101 59.9 paid 2024-01-05 10:12:33 1 Alice Beijing 1 102 23.5 paid 2024-01-09 14:22:11 1 Alice Beijing 2 103 199.0 refunded 2024-01-07 09:30:00 2 Bob Shanghai这样一条原本嵌套在用户对象里的订单记录被展开成一行样本每个样本都可以作为后续建模的输入。如果嵌套层级更深比如订单里还有商品列表可以继续用record_path[orders, items]但要注意不同层级的字段名不能冲突。3.3 处理缺失值、类型转换和重复值数据进入 DataFrame 后下一个任务通常是清洗。最常见的四类操作是缺失值处理。时间字段转换。数值字段格式修正。重复样本去重。针对上面的订单数据可以做这些处理# 转时间字段 users_df[created_at] pd.to_datetime(users_df[created_at]) # 删除缺失金额的订单 users_df users_df.dropna(subset[amount]) # 删除完全重复的行 users_df users_df.drop_duplicates() # 转换用户ID为整数 users_df[user_id] users_df[user_id].astype(int) print(users_df.dtypes) print(users_df.shape)这里要解释一个容易出错的地方JSON 中1解析出来可能是 int但某些接口会返回1字符串或者在缺失值处理过程中变成了NaN。直接把整列astype(int)可能会因为缺失值而报错。稳妥的做法是先用pd.to_numeric做安全转换users_df[amount] pd.to_numeric(users_df[amount], errorscoerce)errorscoerce表示无法转换的置为NaN随后再由你自己决定是删除还是填充。机器学习模型基本不接受 NaN 值所以这个决策要放在建模前。3.4 JSON 处理中常见的基础坑学习 JSON 解析时我见过最多的问题集中在四个方面。坑 1没有区分json.load和json.loads。前者接收文件对象后者接收字符串。如果向json.loads传一个文件路径字符串会得到类似Expecting value: line 1 column 1的错误。检查方式是打印传入参数的类型确认它是字符串还是文件对象。坑 2嵌套数组导致 DataFrame 行数暴增。一个用户有 10 个订单展平后会产生 10 行用户维度字段被重复 10 次。这不是错误但要注意后续聚合时需要groupby(user_id)把粒度从“订单级”提升到“用户级”。坑 3JSON 键缺失。不同时间返回的 JSON 结构可能不一样有的记录没有某个字段。直接用dict[key]会抛出KeyError。建议使用dict.get(key)或者统一先pd.json_normalize让缺失键变成 NaN。坑 4中文编码问题。读取 JSON 文件时没指定encodingutf-8或者json.dumps输出时没设置ensure_asciiFalse都会看到乱码。导出 JSON 时建议这样写with open(result.json, w, encodingutf-8) as f: json.dump(result_list, f, ensure_asciiFalse, indent2)ensure_asciiFalse会保留中文原文indent2让输出文件对开发者更友好。4. 用 pandas 读取 SQL从数据库取数到特征表JSON 处理解决的是“从外部系统拿到的半结构化数据”SQL 部分解决的是“从关系型数据库里取业务数据”。这两者在实际项目中经常同时存在。4.1 连接 SQLite 数据库Python 标准库sqlite3是最轻量级的连接方式import sqlite3 conn sqlite3.connect(shop.db) cur conn.cursor() cur.execute(SELECT * FROM users) rows cur.fetchall() print(rows) conn.close()但这种方式返回的是 list of tuple没有列名信息直接建模不方便。更推荐把连接交给 pandas或者使用 SQLAlchemy 管理连接。如果用 SQLAlchemy连接字符串会更统一from sqlalchemy import create_engine engine create_engine(sqlite:///shop.db)后续无论是 pandas 读取还是写入都传engine而不是conn。这样切换到 MySQL 时只需要改一个连接字符串代码主体不用动。4.2 用 pandas 执行 SQL 查询推荐使用pandas.read_sql_query它可以直接把 SQL 的结果封装成 DataFrameimport pandas as pd from sqlalchemy import create_engine engine create_engine(sqlite:///shop.db) df pd.read_sql_query( SELECT user_id, order_id, amount, status, created_at FROM orders, engine ) print(df.head()) print(df.dtypes)这种方式的优势是SQL 负责过滤和取数越早过滤传回本地的数据量越小。pandas 负责后续加工比如类型转换、派生特征。两者职责清晰便于测试。如果查询条件来自 Python 变量千万不要用字符串拼接 SQL。最常用的方法是使用params参数target_user 1 df pd.read_sql_query( SELECT * FROM orders WHERE user_id :user_id, engine, params{user_id: target_user} )参数化查询不仅更安全也避免因为变量中含引号导致 SQL 语法错误。生产环境中任何直接拼接外部输入的行为都应该被视为高风险操作。4.3 多表关联和聚合特征SQL 的核心能力在于做多表关联和聚合。以下场景非常典型需要统计每个用户的总订单数、已支付总金额、最近一次下单时间。如果数据量很大在数据库端完成聚合比把所有明细行拉回来再做 pandas 处理要高效得多。feature_sql SELECT u.user_id, u.name, u.city, COUNT(o.order_id) AS order_count, SUM(CASE WHEN o.status paid THEN o.amount ELSE 0 END) AS total_paid_amount, MAX(o.created_at) AS last_order_time FROM users u LEFT JOIN orders o ON u.user_id o.user_id GROUP BY u.user_id, u.name, u.city user_features pd.read_sql_query(feature_sql, engine) print(user_features.head())这个查询做的事情是LEFT JOIN确保没有订单的用户也被保留order_count为 0。COUNT(o.order_id)统计每个用户的订单数量。SUM(CASE WHEN ... THEN ... ELSE 0 END)只累加状态为paid的金额。MAX(o.created_at)提取最近下单时间。运行后会得到一张用户维度特征表每一行对应一个用户。这种结果可以直接作为分类问题的训练集预测目标可以是用户是否复购、是否流失等。4.4 SQL 取数时的常见坑坑 1字段类型与 pandas 推断不一致。SQLite 不强制校验类型amount列可能既有小数也有整数。读取后最好先用pd.to_numeric统一避免后续计算时报错。坑 2日期时间被当成普通字符串。SQL 中created_at如果是 TEXT 类型pandas 不会自动转成 datetime。需要手动pd.to_datetime再做时间窗口特征。坑 3JOIN 产生重复行。一个用户有多张订单和订单表 JOIN 后用户维度字段会被重复。如果还想保留用户维度需要先聚合订单表再 JOIN而不是直接 JOIN 后再聚合。比如SELECT u.user_id, o.order_count FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ) o ON u.user_id o.user_id子查询先把订单聚合好再关联用户表能减少中间结果的行数。坑 4连接失败。SQLite 文件路径如果写错或者目录不存在会报Unable to open database file。检查文件是否存在、当前工作目录是否正确通常是第一个排查方向。连接 MySQL、PostgreSQL 时还要确认驱动安装、端口、账号和网络连通性。5. 把 JSON 清洗结果写回 SQL端到端数据流程JSON 和 SQL 并不是两个独立模块在真实项目中它们经常串在一起从接口拿到 JSON清洗成 DataFrame写入数据库再从数据库中查询聚合结果导出成训练集。本节把前面所有代码连成一个完整流程。5.1 将清洗后的 DataFrame 写入 SQLitepandas 提供了to_sql方法可以把 DataFrame 直接写入数据库表。以之前解析出的订单明细为例import pandas as pd import json from sqlalchemy import create_engine # 1. 读取并展平 JSON with open(orders.json, r, encodingutf-8) as f: data json.load(f) orders_df pd.json_normalize( data, record_pathorders, meta[user_id, name, city] ) # 2. 清洗 orders_df[created_at] pd.to_datetime(orders_df[created_at]) orders_df[amount] pd.to_numeric(orders_df[amount], errorscoerce) orders_df orders_df.dropna(subset[amount]) orders_df orders_df.drop_duplicates() # 3. 写入数据库表 engine create_engine(sqlite:///shop.db) orders_df.to_sql( orders_from_json, engine, if_existsreplace, indexFalse ) print(写入完成行数:, len(orders_df))to_sql的几个关键参数if_existsreplace如果表已存在就删除后重建适合演示生产环境通常用append增量写入或者先经过业务主键去重再追加。indexFalse不要写入 pandas 的默认索引列。chunksize当数据量很大时建议设置分批写入比如chunksize5000避免一次性写入造成数据库锁时间过长。5.2 用 SQL 完成特征工程后导出训练文件数据进入数据库后可以用 SQL 完成维度转换和特征聚合最后导成机器学习建模常用的宽表。假设要预测“用户是否为高价值用户”可以用下面这张特征 SQLSELECT u.user_id, u.city, COUNT(o.order_id) AS order_count, SUM(CASE WHEN o.status paid THEN o.amount ELSE 0 END) AS total_amount, AVG(CASE WHEN o.status paid THEN o.amount END) AS avg_order_amount, MAX(o.created_at) AS last_order_time FROM users u LEFT JOIN orders o ON u.user_id o.user_id GROUP BY u.user_id, u.city然后通过 pandas 读取feature_df pd.read_sql_query(feature_sql, engine) feature_df.to_csv(user_features.csv, indexFalse, encodingutf-8)这一步得到的 CSV 就是一份“模型输入文件”。如果你还需要 JSON 格式可以这样导出feature_df.to_json(user_features.json, orientrecords, force_asciiFalse)orientrecords会把 DataFrame 转成[{}, {}, ...]的列表结构force_asciiFalse保证中文正常显示。5.3 完整流程的检查点端到端流程完成后需要确认几个环节没有丢数据JSON 原始记录数和展平后订单行数是否合理。写入数据库后能用SELECT COUNT(*) FROM orders_from_json验证。两张表 JOIN 后样本数是否等于预期用户数。最终导出的user_features.csv是否有列名、是否有空值、时间字段格式是否正确。这里要注意如果 JSON 中的某用户在users表里不存在直接 JOIN 时可能会被过滤掉。需要根据业务含义决定使用INNER JOIN还是LEFT JOIN并在验证时核对行数。6. 训练前必须完成的数据验证很多初学者把数据准备好后直接扔给模型等到评估时才发现特征异常。训练前做一轮系统验证能省下大量排错时间。6.1 用代码做基础验证以 5.2 中的feature_df为例验证可以拆成四步# 1. 看规模 print(样本数:, feature_df.shape[0]) print(特征数:, feature_df.shape[1]) # 2. 看类型 print(feature_df.dtypes) # 3. 看缺失值 missing feature_df.isna().sum() print(missing[missing 0]) # 4. 看重复值 print(重复行数:, feature_df.duplicated().sum())如果只看平均值和标准差容易被离群值影响还需要用describe()观察分位数print(feature_df[[order_count, total_amount, avg_order_amount]].describe())如果order_count的最小值是负数或者total_amount出现 null都说明前面某个环节出了问题。6.2 数据质量检查清单下面的表格可以作为每次建模前的固定检查项目检查项方法通过标准失败处理建议样本数量shape行数与业务预期接近检查 JOIN 条件、去重逻辑字段类型dtypes数值列是 int/float时间列是 datetime使用 astype、pd.to_datetime 转换缺失值isna().sum()无必须字段缺失或缺失比例在可接受范围删除、填充或建模时单独处理重复值duplicated().sum()重复行为 0 或符合业务预期根据主键去重时间范围min/max覆盖目标时间窗口检查 SQL 过滤条件目标列分布value_counts()类别分布不是极端失衡确认抽样逻辑或考虑重采样数值范围describe()无明显异常值数据在合理区间检查采集逻辑决定是否截断或转换验证不是一次性的。每进行一次数据更新都要重跑一遍清单。把验证代码封装成函数后续会非常方便def validate_dataframe(df, required_cols): assert set(required_cols).issubset(df.columns), 缺少必要列 print(样本数:, len(df)) print(重复行数:, df.duplicated().sum()) print(缺失值统计:\n, df.isna().sum())把断言加在训练脚本的入口处能在模型开始运行前就暴露数据问题。7. 常见问题排查从现象倒推原因这一节把学习过程中容易遇到的问题集中整理成一张速查表。遇到报错时先对照现象确定方向再按顺序检查输入、路径、依赖、配置和日志。问题现象可能原因检查方式处理建议UnicodeDecodeError文件编码不是 UTF-8用文本编辑器或chcp查看文件编码指定正确编码读取如encodingutf-8-sigKeyError: ordersJSON 结构里没有该字段打印json.loads(...)[0].keys()用get或先确认接口返回结构json_normalize报ValueErrorrecord_path路径不存在检查 JSON 中字段名是否拼写错误修正路径或先pprint打印前几条数据DataFrame 中日期是字符串源数据本身是文本或导入时未解析df.dtypes查看列类型pd.to_datetime(df[created_at]).astype(int)报错列中存在 NaN 或非数字文本df[col].unique()查看取值先pd.to_numeric(errorscoerce)再处理空值to_sql写入失败表存在且主键冲突查看数据库日志、检查if_exists参数使用append并处理主键冲突或先删除表OperationalError: no such table数据库文件不对或建表脚本未执行执行SELECT name FROM sqlite_master WHERE typetable确认连接的是同一个.db文件重跑建表脚本内存溢出JSON 或 SQL 结果集过大查看数据条数和列数增加过滤条件分批读取或使用更高效的数据类型排查时的顺序建议是输入是否正确文件路径、SQL 条件、JSON 键名。代码上下文是否匹配变量名、函数名、编码格式。依赖版本是否兼容pandas、SQLAlchemy、Python 版本。数据本身是否符合预期先head()、dtypes、shape。日志是否包含明确异常栈优先读最后 10 行。数据库连接参数是否正确文件路径、账号、端口。很多时候问题并不复杂只是检查顺序不对。先把“数据长什么样”打印出来比反复盲改代码效率高得多。8. 学习环境与生产环境的差距100 天机器学习系列的目标是建立机器学习基础能力但学习环境中的代码和生产环境之间还有一段明显距离。第 16 天结束后你可以尝试把同样的思路应用到更真实的项目中。8.1 从学习到生产需要注意什么学习阶段可以用相对“直接”的写法比如脚本里硬编码数据库路径、不做异常处理、失败就重跑。生产环境还需要额外考虑这些点配置外置化数据库连接字符串、文件路径、API 地址不要写死在代码里可以用环境变量、配置文件或配置中心管理。日志和监控记录读取数据量、处理耗时、写入失败次数方便定位问题。异常处理读取外部文件或接口时要有超时、重试、失败告警机制。数据版本管理同一份训练数据经过多次清洗后可能需要保存不同版本避免模型复现时找不到对应数据。资源控制大数据量下不要一次性read_sql考虑分批读取、分区表、采样或使用分布式框架。权限管理数据库账号、敏感字段要有最小权限控制不要把测试库和生产库混用。8.2 下一步学习方向掌握了 JSON 和 SQL 的数据读取后下一步建议按这三步走做一个小项目用 requests 请求一个公开接口把返回的 JSON 展平成 DataFrame写入 SQLite再用 SQL 完成一个目标字段的统计。练习窗口函数学习ROW_NUMBER()、SUM() OVER(PARTITION BY ... ORDER BY ...)等 SQL 写法这些在做时间序列特征时非常常用。把流程封装成函数将“读 JSON - 清洗 - 写库 - 查特征”封装成可复用模块为后续构建自动化特征管道打基础。这一天的核心不是背 API而是建立一套“拿到数据 - 解析清洗 - 验证入库 - 查询建模”的完整思考方式。JSON 和 SQL 是数据工程的基本功也是从“会调模型”过渡到“能做项目”之间的关键连接点。把这套流程练熟后面的特征工程、模型训练和评估才能建立在更可靠的数据基础上。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价