Biblioteca de Python de fuentes de datos

Google tiene una biblioteca de código abierto de Python que crea objetos DataTable para el consumo mediante visualizaciones. Esta biblioteca se puede usar para crear una DataTable en Python y generarla en cualquiera de los tres formatos siguientes:

  • String JSON: Si alojas la página que aloja la visualización que usa tus datos, puedes generar una string JSON para pasarla a un constructor DataTable y propagarla.
  • Respuesta de JSON: Si no alojas la página que aloja la visualización y solo deseas actuar como una fuente de datos para visualizaciones externas, puedes crear una string de respuesta JSON completa que se puede mostrar en respuesta a una solicitud de datos.
  • String de JavaScript: Puedes generar la tabla de datos como una string que consta de varias líneas de código JavaScript que crearán y propagarán un objeto google.visualization.DataTable con los datos de tu tabla de Python. Luego, puedes ejecutar este código JavaScript en un motor para generar y propagar el objeto google.visualization.DataTable. Por lo general, se usa solo para depuración.

En este documento, se supone que comprendes la programación básica de Python y que leíste la documentación de visualización introductoria para crear una visualización y usar una visualización.

Contenido

Cómo usar la biblioteca

A continuación, se detallan los pasos básicos.

1. Crea un objeto gviz_api.DataTable

Importa la biblioteca gviz_api.py desde el vínculo anterior y crea una instancia de la clase gviz_api.DataTable. La clase toma dos parámetros: un esquema de tabla, que describirá el formato de los datos en la tabla y los datos opcionales para propagar la tabla. Puedes agregar datos más adelante, si lo deseas, o reemplazarlos por completo, pero no quitar filas individuales o borrar el esquema de la tabla.

2. Describe el esquema de tu tabla

El esquema table_description especifica el esquema de la tabla que se pasa al constructor. No podrás cambiarlo más adelante. En el esquema, se describen todas las columnas de la tabla: el tipo de datos de cada columna, el ID y una etiqueta opcional.

Cada columna se describe mediante una tupla: (ID [,data_type [,label[,custom_properties]]]).

  • ID: un ID de string que se usa para identificar la columna. Puede incluir espacios. El ID de cada columna debe ser único.
  • data_type: [opcional] Un descriptor de string del tipo de datos de Python de los datos en esa columna. Puedes encontrar una lista de los tipos de datos admitidos en el método SingleValueToJS(). Los ejemplos incluyen “string” y “boolean”. Si no se especifica, el valor predeterminado es “string”.
  • etiqueta: un nombre fácil de usar para la columna, que se puede mostrar como parte de la visualización. Si no se especifica, se usa el valor del ID.
  • custom_properties: un diccionario {String:String} de propiedades de columna personalizadas.

El esquema de tabla es una colección de tuplas de descriptor de columna. Cada miembro de la lista, clave de diccionario o valor de diccionario debe ser otra colección o una tupla descriptor. Puedes usar cualquier combinación de diccionarios o listas, pero cada clave, valor o miembro debe evaluarse a la tupla descriptora. Estos son algunos ejemplos.

  • Lista de columnas: [('a', 'number'), ('b', 'string')]
  • Diccionario de listas: {('a', 'number'): [('b', 'number'), ('c', 'string')]}
  • Diccionario de diccionarios: {('a', 'number'): {'b': 'number', 'c': 'string'}}
  • Y así con cualquier nivel de anidación.

3. Propaga los datos

Para agregar datos a la tabla, crea una estructura de elementos de datos en la misma estructura que el esquema de la tabla. Por ejemplo, si tu esquema es una lista, los datos deben ser una lista:

  • esquema: [("color", "string"), ("shape", "string")]
  • datos: [["azul", "cuadrado"], ["rojo", "círculo"]]

Si el esquema es un diccionario, los datos deben ser un diccionario:

  • esquema: {("rowname", "string"): [("color", "string"), ("shape", "string")] }
  • datos: {"row1": ["blue", "square"], "row2": ["red", "circle"]}

Una fila de la tabla es una sección de los datos y el esquema correspondientes. Por ejemplo, así es como se aplica un esquema de una lista de dos columnas a dos filas de datos.

Schema:[(color),(shape)]
            /     \       
Data: [["blue", "square"], ["red", "circle"]]

Table: 
      Color    Shape
      blue     square
      red      circle

Ten en cuenta que aquí las claves del diccionario se evalúan como datos de columna. Puedes encontrar ejemplos más complejos en la documentación del método AppendData() en el código. El propósito de permitir ese anidamiento complejo es permitirte usar una estructura de datos de Python adecuada para tus necesidades.

4. Genera tus datos

El formato de salida más común es JSON, por lo que probablemente usarás la función ToJsonResponse() para crear los datos que se mostrarán. Sin embargo, si analizas la solicitud de entrada y admites diferentes formatos de salida, puedes llamar a cualquiera de los otros métodos de salida para mostrar otros formatos, incluidos los valores separados por comas, los valores separados por tabulaciones y JavaScript. Por lo general, JavaScript solo se usa para la depuración. Consulta Cómo implementar una fuente de datos si deseas obtener información sobre cómo procesar una solicitud para obtener el formato de respuesta preferido.

Ejemplo de uso

Estos son algunos ejemplos que muestran cómo usar los distintos formatos de salida.

Ejemplo de ToJSon y ToJS

#!/usr/bin/python

import gviz_api

page_template = """
<html>
  <script src="https://www.gstatic.com/charts/loader.js"></script>
  <script>
    google.charts.load('current', {packages:['table']});

    google.charts.setOnLoadCallback(drawTable);
    function drawTable() {
      %(jscode)s
      var jscode_table = new google.visualization.Table(document.getElementById('table_div_jscode'));
      jscode_table.draw(jscode_data, {showRowNumber: true});

      var json_table = new google.visualization.Table(document.getElementById('table_div_json'));
      var json_data = new google.visualization.DataTable(%(json)s, 0.6);
      json_table.draw(json_data, {showRowNumber: true});
    }
  </script>
  <body>
    <H1>Table created using ToJSCode</H1>
    <div id="table_div_jscode"></div>
    <H1>Table created using ToJSon</H1>
    <div id="table_div_json"></div>
  </body>
</html>
"""

def main():
  # Creating the data
  description = {"name": ("string", "Name"),
                 "salary": ("number", "Salary"),
                 "full_time": ("boolean", "Full Time Employee")}
  data = [{"name": "Mike", "salary": (10000, "$10,000"), "full_time": True},
          {"name": "Jim", "salary": (800, "$800"), "full_time": False},
          {"name": "Alice", "salary": (12500, "$12,500"), "full_time": True},
          {"name": "Bob", "salary": (7000, "$7,000"), "full_time": True}]

  # Loading it into gviz_api.DataTable
  data_table = gviz_api.DataTable(description)
  data_table.LoadData(data)

  # Create a JavaScript code string.
  jscode = data_table.ToJSCode("jscode_data",
                               columns_order=("name", "salary", "full_time"),
                               order_by="salary")
  # Create a JSON string.
  json = data_table.ToJSon(columns_order=("name", "salary", "full_time"),
                           order_by="salary")

  # Put the JS code and JSON string into the template.
  print "Content-type: text/html"
  print
  print page_template % vars()


if __name__ == '__main__':
  main()

Ejemplo de ToJSonResponse

Un cliente remoto usa JSonResponse en una solicitud de datos.

#!/usr/bin/python

import gviz_api

description = {"name": ("string", "Name"),
               "salary": ("number", "Salary"),
               "full_time": ("boolean", "Full Time Employee")}
data = [{"name": "Mike", "salary": (10000, "$10,000"), "full_time": True},
        {"name": "Jim", "salary": (800, "$800"), "full_time": False},
        {"name": "Alice", "salary": (12500, "$12,500"), "full_time": True},
        {"name": "Bob", "salary": (7000, "$7,000"), "full_time": True}]

data_table = gviz_api.DataTable(description)
data_table.LoadData(data)
print "Content-type: text/plain"
print
print data_table.ToJSonResponse(columns_order=("name", "salary", "full_time"),
                                order_by="salary")