在JupyterHub中新建一个Jupyter Notebook(.ipynb),编写用于可视化,分析,以及处理测试、测量及设备等数据的代码。

创建Jupyter Notebook之前,请完成下列任务:
  • 在NI Package Manager中安装Jupyter Notebooks for SystemLink以获取使用SystemLink Python API的预定义Jupyter Notebook。
  • 在SystemLink应用程序URL后添加/niapis/python/index.html,以访问Python API。
  • 了解Jupyter Notebook的用户界面和结构。
  • 安装用于增强数据分析和处理的Python库。NI建议使用Python Package Index (PyPI)获取程序包。
  • 了解IPython内核支持的内置Magic命令。
  1. 在SystemLink Web应用程序中,点击Jupyter
  2. Notebook下,点击Python 3
    随后Jupyter Notebook将打开,并启动内核,在Notebook中运行Python。
  3. 重命名Notebook以反映其执行的报告类型。
  4. 在代码单元格中,导入交互式Notebook所需的Python模块、库和小组件。
    例如,导入Pandas和Scrapbook的代码可实现下列目标:
    • 创建和处理数据框(Pandas)。
    • 执行Notebook (Scrapbook)。
    • 获取Notebook结果(Scrapbook)。
    import copy
    import datetime
    import dateutil.parser
    import pandas as pd
    import scrapbook as sb
    from dateutil import tz
  5. 选用一个SystemLink Python API来访问要可视化、分析或处理的数据。
    如需访问SystemLink测试监视器服务的数据,请使用以下命令。
    from systemlink.clientconfig import get_configuration
    from systemlink.clients.nitestmonitor import *
  6. 建立与SystemLink Server的连接。
    如要将测试监视器客户端连接到服务器,可使用以下命令。
    http_client_config = get_configuration(route_name='nitestmonitor')
  7. 定义Notebook的参数和元数据。
    1. 在代码单元格中定义参数。
      可以通过代码实现下列目标:
      • 根据指定时间范围筛选测试结果。
      • 根据测试系统获取结果的日期对测试结果进行分组。
      filter = 'startedWithin <= "30.0:0:0"'
      group_by = 'Day'
    2. 在右侧边栏中,打开Property Inspector窗格。
    3. 单元格元数据代码块中,添加参数、参数默认值和输出。
      要添加该信息,可通过以下代码实现:
      "papermill": {
              "parameters": {
                  "group_by": "Day",
                  "results_filter": "startedWithin <= \"30.0:0:0\"",
              }
          },
          "systemlink": {
              "namespaces": [
                  "ni-testmanagement"
              ],
              "outputs": [
                  {
                      "display_name": "This will show in dashboard output selector",
                      "id": "data_frame_output",
                      "type": "data_frame"
                  },
                  {
                      "display_name": "This will show in dashboard output selector",
                      "id": "scalar_output",
                      "type": "scalar"
                  }
              ],
              "parameters": [
                  {
                      "display_name": "Group By",
                      "id": "group_by",
                      "options": [
                          "Day",
                          "System",
                          "Test Program",
                          "Operator",
                          "Product"
                      ],
                      "type": "string"
                  },
                  {
                      "default_display": {
                          "startedWithin": {
                              "unit": "DAYS",
                              "value": 30
                          }
                      },
                      "display_name": "Results Filter",
                      "id": "results_filter",
                      "type": "test_monitor_result_query"
                  },
              ],
              "version": 2
          },
          "tags": [
              "parameters"
          ]
      }
    4. 对于命名空间(namespaces),根据希望报告显示的位置输入以下一个或多个命名空间:
      命名空间 报告显示位置
      ni-assetmanager 设备管理器
      ni-testmanagement 测试监视器
      任何自定义的命名空间 使用命名空间查询Notebook的其他客户端
    5. 对于版本(version),根据Notebook的使用目的输入以下其中一个版本号:
      目标 版本
      • 要在“测试信息”下的“报告”中查看数据。
      • 自定义使用旧版本SystemLink安装的Notebook。
      1
      • 要用一个Notebook返回多个输出。
      • 要使用标量输出类型。
      • 要在仪表板中查看数据。
      2
  8. 查询SystemLink数据服务以查找要显示、分析或处理的数据。
    如需按升序查询测试监视器服务以获取测试结果,可使用以下代码:
    results_api = ResultsApi(api_client=ApiClient(http_client_config))
    query = ResultsAdvancedQuery(filter=filter, order_by=[ResultSortDefinitionObject(field=ResultField.STARTED_AT)])
    query_response = await results_api.query_results_v2(post_body=query)
    results = query_response.results
    
    results_list = [result.to_dict() for result in results]
  9. 根据查询结果的返回数据分组方式,对Pandas数据框数据进行格式化处理。
    要将测试结果按状态分组,可使用以下代码:
    group_names = []
    for result in results_list:
        if grouping in result:
            group_names.append(result[grouping])
    
    formatted_results = {
        'id': [result['id'] for result in results_list],
        'status': [result['status']['status_type'] for result in results_list],
        grouping: group_names
    }
    
    df_results = pd.DataFrame.from_dict(formatted_results)
  10. 配置显示、分析或处理数据的方式。

    以下是配置数据的一些方法示例。

    • 筛除不希望包含在报告中的结果。
    • 转换时间标识。
    • 计算某一时间范围内的数据。
    • 以特定方式对数据进行分组。
  11. 将Pandas数据框转换为SystemLink报告的输出格式。
    要转换Pandas数据框,可使用以下代码:
    result.append({
        'type': 'data_frame',
        'id': 'data_frame_output', 
        data': [{
            'format': 'XY',
            'x': ['2018-11-17T00:00:00', '2018-11-18T00:00:00', ...],
            'y': [94.0, 89.9, ...]
        }],
        'config': {
            'title': 'Title',
            'graph': {
                'axis_labels': ['x-axis-label', 'y-axis-label'],
                'tick_labels': [{'x': 0, 'label': 'tick label 0', ... }],
                'orientation': 'VERTICAL',
                'plot_style': ['SCATTER'],
                'plot_color': ['blue']
            }
        }
    })
    提示 为确保测试监视器支持数据框输出,请验证ID (data_frame_output)的值。该值必须在单元格内和参数代码单元格的代码元数据中均正确无误。详细信息请参阅前文第7步。
    备注 如果在Jupyter Notebook中使用V2报告格式,则只能在仪表板上可视化报告结果。
  12. 添加一个新标量输出。
    如需添加标量输出,可使用以下代码:
    result.append({
        'type': 'scalar',
        'id': 'scalar_output',
        'config': {
            'title': 'Scalar Output Title'
        },
        'value': 3
    })
    备注 有关添加标量输出的详细信息,请参阅GitHub中的SystemLink范例库。
  13. 使用Scrapbook记录结果。
    如需从SystemLink Web应用程序解析结果,可使用以下代码。
    sb.glue('result', result)
  14. 在Notebook中添加一个新单元格。
  15. 在工具栏中,从下拉菜单中选择Markdown,将代码文档添加到Notebook中。
  16. 在菜单栏上,选择运行 » 所有单元格,验证Notebook是否正确返回和处理数据。 如果Notebook返回错误,将import pdb; pdb.set_trace()连同错误添加到代码单元格。添加此代码将激活内置的Python调试器。
  17. 单击保存(Save)
  18. 可选: 如需在指定时间运行Notebook,可创建分析自动化程序并添加计划任务。
创建Notebook后,可将其作为数据源绑定至仪表板平铺图。通过将此平铺图添加至仪表板,可监测Notebook结果。有关共享Notebook的详细信息,请参阅共享Jupyter Notebook