数据源 Python 库

Google 开源了一个 Python 库,可用于创建 DataTable 对象以供可视化图表使用。此库可用于在 Python 中创建 DataTable,并以以下三种格式之一输出:

  • JSON 字符串 - 如果您托管的页面托管了使用您的数据的可视化图表,则可以生成 JSON 字符串以传入 DataTable 构造函数进行填充。
  • JSON 响应 - 如果您不托管托管可视化图表的网页,而只是想充当外部可视化图表的数据源,则可以创建可响应数据请求的完整 JSON 响应字符串。
  • JavaScript 字符串 - 您可以将数据表格输出为由多行 JavaScript 代码构成的字符串,此代码将使用您的 Python 表格中的数据填充并填充 google.visualization.DataTable 对象。然后,您可以在引擎中运行此 JavaScript,以生成并填充 google.visualization.DataTable 对象。这通常仅用于调试。

本文档假定您了解基本的 Python 编程,并已阅读有关创建可视化图表使用可视化图表的可视化文档。

内容

如何使用库

以下是基本步骤:

1. 创建 gviz_api.DataTable 对象

通过上述链接导入 gviz_api.py 库,并实例化 gviz_api.DataTable 类。该类接受两个参数:一个表架构,用于描述表中数据的格式,以及一些可选数据以填充表。您可以稍后根据需要添加数据,也可以完全覆盖数据,但不能移除个别行,也可以清除表架构。

2. 描述表架构

表架构由传递到构造函数的 table_description 参数指定。您之后无法对其进行更改。架构描述了表中的所有列:每列的数据类型、ID 和可选标签。

每个元组都由一个元组 (ID [,data_type [,label [,custom_properties]]]) 进行描述。

  • ID - 用于标识列的字符串 ID。可以包含空格。 每列的 ID 必须是唯一的。
  • data_type - [可选] 该列中的数据的 Python 数据类型的字符串描述符。您可以在 SingleValueToJS() 方法中找到支持的数据类型列表。例如“字符串”和“布尔值”。如果未指定,则默认为“字符串”。
  • label - 列的名称,易于查看,可作为可视化图表的一部分显示。如果未指定,则使用 ID 值。
  • custom_properties - 自定义列属性的 {String:String} 字典。

表架构是列描述符元组的集合。每个列表成员、字典键或字典值都必须是另一个集合或描述符元组。您可以使用字典或列表的任意组合,但每个键、值或成员最终必须评估为描述符元组。以下是一些示例。

  • 列列表:[('a', 'number'), ('b', 'string')]
  • 列表字典:{('a', 'number'): [('b', 'number'), ('c', 'string')]}
  • 字典字典:{('a', 'number'): {'b': 'number', 'c': 'string'}}
  • 以及任何级别的嵌套。

3. 填充数据

如需向表添加数据,请按照与表架构完全相同的结构构建数据元素的结构。例如,如果您的架构是列表,则数据必须为列表:

  • schema: [("color", "string"), ("shape", "string")]
  • 数据:[["blue", "square"], ["red", "Circle"]]

如果架构是字典,则数据必须是字典:

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

表中的一行是相应数据和架构的一部分。例如,以下是将两列列表的架构应用于两行数据的方式。

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

Table: 
      Color    Shape
      blue     square
      red      circle

请注意,字典键的计算结果为列数据。您可以在代码的 AttachData() 方法文档中找到更复杂的示例。允许这样复杂的嵌套是为了让您能够使用适合自己需求的 Python 数据结构。

4. 输出数据

最常见的输出格式为 JSON,因此您可能需要使用 ToJsonResponse() 函数来创建要返回的数据。但是,如果您要解析输入请求并支持不同的输出格式,则可以调用任何其他输出方法以返回其他格式,包括逗号分隔值、制表符分隔值和 JavaScript。JavaScript 通常仅用于调试。如需了解如何处理请求以获取首选响应格式,请参阅实现数据源

用法示例

以下是一些示例,演示了如何使用各种输出格式。

ToJSon 和 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()

ToJSonResponse 示例

JSonResponse 供远程客户端在数据请求中使用。

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