Libreria Python di origine dati

Google ha reso open source una libreria Python che crea oggetti DataTable utilizzabili dalle visualizzazioni. Questa libreria può essere utilizzata per creare un DataTable in Python e generarlo in uno dei tre formati seguenti:

  • Stringa JSON : se ospiti la pagina che ospita la visualizzazione che utilizza i tuoi dati, puoi generare una stringa JSON da passare a un costruttore DataTable per compilarla.
  • Risposta JSON : se non ospiti la pagina che ospita la visualizzazione e vuoi semplicemente fungere da origine dati per le visualizzazioni esterne, puoi creare una stringa di risposta JSON completa che può essere restituita in risposta a una richiesta di dati.
  • Stringa JavaScript: puoi generare la tabella di dati come stringa composta da diverse righe di codice JavaScript che creerà e completerà un oggetto google.visualization.DataTable con i dati della tabella Python. Puoi quindi eseguire questo codice JavaScript in un motore per generare e compilare l'oggetto google.visualization.DataTable. In genere viene utilizzato solo per il debug.

Questo documento presuppone che tu comprenda la programmazione Python di base e che tu abbia letto la documentazione introduttiva relativa alla visualizzazione per la creazione di una visualizzazione e l'utilizzo di una visualizzazione.

Contenuti

Come utilizzare la Raccolta

Di seguito sono riportati i passaggi di base, in maggiore dettaglio:

1. Crea un oggetto gviz_api.DataTable

Importa la libreria gviz_api.py dal link riportato sopra e crea un'istanza per la classe gviz_api.DataTable. La classe accetta due parametri: uno schema di tabella, che descrive il formato dei dati nella tabella, e i dati facoltativi con cui completare la tabella. Se vuoi, puoi aggiungere dati in un secondo momento oppure sovrascrivere completamente i dati, ma non rimuovere singole righe o cancellare lo schema della tabella.

2. Descrivi lo schema della tabella

Lo schema della tabella viene specificato dal parametro table_description passato al costruttore. L'impostazione non può essere modificata in un secondo momento. Lo schema descrive tutte le colonne della tabella: il tipo di dati di ogni colonna, l'ID e un'etichetta facoltativa.

Ogni colonna è descritta da una tupla: (ID [,data_type [,label [,custom_properties]]]).

  • ID: un ID stringa utilizzato per identificare la colonna. Può includere spazi. L'ID di ogni colonna deve essere univoco.
  • data_type - [facoltativo] Un descrittore di stringa del tipo di dati Python dei dati in quella colonna. Puoi trovare un elenco dei tipi di dati supportati nel metodo SingleValueToJS(). Alcuni esempi sono "string" e "booleani". Se non specificato, il valore predefinito è "string".
  • label - Un nome semplice per la colonna, che potrebbe essere mostrato durante la visualizzazione. Se non specificato, viene utilizzato il valore ID.
  • custom_properties: un dizionario {String:String} di proprietà delle colonne personalizzate.

Lo schema della tabella è una raccolta di tuple di descrittori di colonna. Ogni membro dell'elenco, chiave del dizionario o valore del dizionario deve essere un'altra raccolta o una tupla descrittore. Puoi utilizzare qualsiasi combinazione di dizionari o elenchi, ma ogni chiave, valore o membro alla fine deve restituire una tupla descrittore. Ecco alcuni esempi.

  • Elenco di colonne: [('a', 'number'), ('b', 'string')]
  • Dictionary of lists: {('a', 'number'): [('b', 'number'), ('c', 'string')]}
  • Dictionary of dictionaries: {('a', 'number'): {'b': 'number', 'c': 'string'}}
  • E così via, con qualsiasi livello di nidificazione.

3. Compila i tuoi dati

Per aggiungere dati alla tabella, crea una struttura di elementi di dati che abbia esattamente la stessa struttura dello schema della tabella. Ad esempio, se lo schema è un elenco, i dati devono essere un elenco:

  • schema: [("color", "string"), ("forma", "string")]
  • dati: [["blu", "quadrato"], ["rosso", "cerchio"]]

Se lo schema è un dizionario, i dati devono essere un dizionario:

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

Una riga della tabella è una sezione dei dati e dello schema corrispondenti. Ad esempio, ecco come viene applicato uno schema di un elenco di due colonne a due righe di dati.

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

Table: 
      Color    Shape
      blue     square
      red      circle

Tieni presente che le chiavi del dizionario qui corrispondono ai dati della colonna. Puoi trovare esempi più complessi nella documentazione sul metodo AppendData() nel codice. Lo scopo di consentire una nidificazione così complessa è consentirti di utilizzare una struttura di dati Python adatta alle tue esigenze.

4. Output dei dati

Il formato di output più comune è JSON, quindi probabilmente utilizzerai la funzione ToJsonResponse() per creare i dati da restituire. Se, tuttavia, stai analizzando la richiesta di input e supporti diversi formati di output, puoi chiamare uno qualsiasi degli altri metodi di output per restituire altri formati, inclusi valori separati da virgole, valori separati da tabulazioni e JavaScript. In genere, JavaScript viene utilizzato solo per il debug. Consulta Implementazione di un'origine dati per scoprire come elaborare una richiesta per ottenere il formato di risposta preferito.

Esempio di utilizzo

Ecco alcuni esempi che mostrano come utilizzare i vari formati di output.

Esempio di ToJSon e 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()

Esempio di ToJSonResponse

JSonResponse viene utilizzato da un client remoto in una richiesta di dati.

#!/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")