快速入门:通过 SQL 机器学习使用 Python 时的数据结构和对象
适用于: SQL Server 2017 (14.x) 及更高版本 Azure SQL 托管实例
本快速入门介绍在 SQL Server 机器学习服务、Azure SQL 托管实例机器学习服务中或 SQL Server 大数据群集上使用 Python 时如何使用数据结构和数据类型。 你将了解如何在 Python 与 SQL Server 之间移动数据,以及可能出现的常见问题。
SQL 机器学习依赖于 Python 的 pandas 包,该包非常适合处理表格数据。 但是,不能将标量从 Python 传递到数据库并期望它“正常运行”。 在本快速入门中,你将回顾一些基本的数据结构定义,以便为在 Python 和数据库之间传递表格数据时可能遇到的其他问题做好准备。
需预先了解的概念包括:
- 数据帧是包含多列的表。
- 数据帧的单列是一个类似于列表的对象,称为“序列”。
- 数据帧的单个值称为单元格,并由索引访问。
如果数据帧需要表格结构,那么如何将计算的单个结果公开为数据帧? 一种答案是将单个标量值表示为一个序列,该序列很容易转换为数据帧。
注意
返回日期时,SQL 中的 Python 使用 DATETIME,其受限制的日期范围是 1753-01-01(-53690) 到 9999-12-31(2958463)。
先决条件
若要运行本快速入门,需要具备以下先决条件。
以下平台之一上的 SQL 数据库:
- SQL Server 机器学习服务。 如需安装,请参阅 Windows 安装指南或 Linux 安装指南。
- SQL Server 大数据群集。 了解如何在 SQL Server 大数据群集上启用机器学习服务。
- Azure SQL 托管实例机器学习服务。 有关信息,请参阅 Azure SQL 托管实例机器学习服务概述。
用于运行包含 Python 脚本的 SQL 查询的工具。 本快速入门使用 Azure Data Studio。
作为序列的标量值
此示例执行一些简单的数学运算,并将标量转换成序列。
序列需要索引,可以手动分配,如图所示,或以编程方式分配。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' a = 1 b = 2 c = a/b print(c) s = pandas.Series(c, index =["simple math example 1"]) print(s) '
由于序列尚未转换为数据帧,因此将在“消息”窗口中返回值,但你可以看到结果的格式更为表格化。
结果
STDOUT message(s) from external script: 0.5 simple math example 1 0.5 dtype: float64
要增加序列的长度,可以使用数组添加新值。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' a = 1 b = 2 c = a/b d = a*b s = pandas.Series([c,d]) print(s) '
如果未指定索引,则会生成一个索引,其值以 0 开头,以数组长度结尾。
结果
STDOUT message(s) from external script: 0 0.5 1 2.0 dtype: float64
如果增加索引值的数目,但不添加新的数据值,则将重复使用数据值来填充序列 。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' a = 1 b = 2 c = a/b s = pandas.Series(c, index =["simple math example 1", "simple math example 2"]) print(s) '
结果
STDOUT message(s) from external script: 0.5 simple math example 1 0.5 simple math example 2 0.5 dtype: float64
将序列转换为数据帧
将标量数学结果转换为表格结构后,仍需将其转换为 SQL 机器学习可以处理的格式。
若要将序列转换为数据帧,请调用 pandas 数据帧方法。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' import pandas as pd a = 1 b = 2 c = a/b d = a*b s = pandas.Series([c,d]) print(s) df = pd.DataFrame(s) OutputDataSet = df ' WITH RESULT SETS((ResultValue FLOAT))
结果如下所示。 即使使用索引从数据帧中获取特定值,索引值也不是输出的一部分。
结果
ResultValue 0.5 2
将值输出到数据帧中
现在,你将在数据帧中输出两个数学结果序列中的特定值。 第一个是由 Python 生成的序列值索引。 第二个使用字符串值的任意索引。
以下示例使用整数索引从序列中获取值。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' import pandas as pd a = 1 b = 2 c = a/b d = a*b s = pandas.Series([c,d]) print(s) df = pd.DataFrame(s, index=[1]) OutputDataSet = df ' WITH RESULT SETS((ResultValue FLOAT))
结果
ResultValue 2.0 请记住,自动生成的索引从 0 开始。 尝试使用超出范围的索引值并查看发生的情况。
现在使用字符串索引从另一个数据帧中获取单个值。
EXECUTE sp_execute_external_script @language = N'Python' , @script = N' import pandas as pd a = 1 b = 2 c = a/b s = pandas.Series(c, index =["simple math example 1", "simple math example 2"]) print(s) df = pd.DataFrame(s, index=["simple math example 1"]) OutputDataSet = df ' WITH RESULT SETS((ResultValue FLOAT))
结果
ResultValue 0.5 如果试图使用数字索引从该序列中获取值,则会出现错误。
后续步骤
若要了解如何通过 SQL 机器学习编写高级 Python 函数,请参阅以下快速入门: