Compartir vía


Inicio rápido: Estructuras de datos y objetos mediante Python con aprendizaje automático de SQL

Se aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL Managed Instance

En este inicio rápido, aprenderá a usar estructuras de datos y tipos de datos al utilizar Python en SQL Server Machine Learning Services, Machine Learning Services en Azure SQL Managed Instance o Clústeres de macrodatos de SQL Server. Aprenderá a mover datos entre Python y SQL Server, así como los problemas comunes que pueden producirse.

Aprendizaje automático de SQL se basa en el paquete pandas de Python, que es excelente para trabajar con datos tabulares. Sin embargo, no puede pasar un valor escalar desde Python a la base de datos y esperar que funcione. En esta guía de inicio rápido, revisará algunas definiciones de estructura de datos básicas a fin de prepararle para incidencias adicionales que podrían ocurrir al pasar datos tabulares entre Python y la base de datos.

Los conceptos más comunes son:

  • Una trama de datos es una tabla con varias columnas.
  • Una sola columna de una trama de datos es un objeto de tipo lista denominado serie.
  • Un valor único de una trama de datos se denomina celda y se obtiene acceso a ella mediante el índice.

¿Cómo se expondría el resultado único de un cálculo como una trama de datos, si una data.frame requiere una estructura tabular? Una respuesta es representar el valor escalar único como una serie, que se convierte fácilmente en una trama de datos.

Nota

Cuando se devuelven fechas, Python en SQL usa DATETIME, que tiene un intervalo de fechas restringido de 1753-01-01(-53690) a 9999-12-31(2958463).

Prerrequisitos

Para ejecutar este inicio rápido, debe cumplir los siguientes requisitos previos.

Valor escalar como una serie

Este ejemplo realiza algunas operaciones matemáticas simples y convierte un valor escalar en una serie.

  1. Una serie requiere un índice, que puede asignarlo manualmente, como se muestra aquí, o mediante programación.

    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)
    '
    

    Dado que la serie no se ha convertido a data.frame, los valores se devuelven en la ventana mensajes, pero puede ver que los resultados se encuentran en un formato más tabular.

    Resultados

    STDOUT message(s) from external script: 
    0.5
    simple math example 1    0.5
    dtype: float64
    
  2. Para aumentar la longitud de la serie, puede agregar nuevos valores mediante una matriz.

    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)
    '
    

    Si no especifica un índice, se genera un índice con valores que empiezan por 0 y terminan con la longitud de la matriz.

    Resultados

    STDOUT message(s) from external script:
    0    0.5
    1    2.0
    dtype: float64
    
  3. Si aumenta el número de valores del índice, pero no agrega nuevos valores de datos, los valores de datos se repiten para rellenar la serie.

    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)
    '
    

    Resultados

    STDOUT message(s) from external script:
    0.5
    simple math example 1    0.5
    simple math example 2    0.5
    dtype: float64
    

Conversión de series en tramas de datos

Después de convertir los resultados matemáticos escalares en una estructura tabular, debe convertirlos a un formato que aprendizaje automático de SQL pueda controlar.

  1. Para convertir una serie en data.frame, llame al método DataFrame de 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))
    

    A continuación se muestra el resultado. Incluso si usa el índice para obtener valores específicos de data.Frame, los valores del índice no forman parte de la salida.

    Resultados

    ResultValue
    0.5
    2

Los valores de salida en data.frame

Ahora se mostrarán los valores específicos de dos series de resultados matemáticos en data.frame. El primero tiene un índice de valores secuenciales generados por Python. El segundo usa un índice arbitrario de valores de cadena.

  1. En el ejemplo siguiente se obtiene un valor de la serie utilizando un índice de entero.

    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))
    

    Resultados

    ResultValue
    2.0

    Recuerde que el índice generado automáticamente comienza en 0. Pruebe a usar un valor de índice fuera de intervalo y vea lo que sucede.

  2. Ahora obtenga un valor único de la otra trama de datos mediante un índice de cadena.

    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))
    

    Resultados

    ResultValue
    0.5

    Si intenta usar un índice numérico para obtener un valor de esta serie, obtendrá un error.

Pasos siguientes

Para obtener información sobre cómo escribir funciones avanzadas de Python con aprendizaje automático de SQL, siga este inicio rápido: