Python Interface
Python interfaces are a powerful tool for retrieving data for KPIs from any data source. These interfaces provide great flexibility, allowing you to use a script to fetch data from various sources. With a Python interface, you can easily customize your data retrieval process to fit the unique requirements of your project. Whether you need to extract data from a database, a web service, or any other type of data source, a Python interface can be used as a wildcard.
Configuration
After installing a new Python interface following these instructions, you are ready to configure your interface by adding your python script inside the Python Settings section.
When creating a new Python interface, a boilerplate script is generated to provide instructions on configuring your own script. This guides you through every method you need to have so Visual KPI works properly. These methods are described below:
- get_current_values: Returns one value and a timestamp for a metric, the most recent available.
- get_historical_values: Returns one value and a timestamp for a metric at a specified date or the closest to that date but not after.
- get_trend_data: Returns timeseries data for a metric within a time range ready for a trend (downsampled or aggregated).
- get_historical_data: Returns raw historical data (timeseries data).
- get_table: Returns a JSON to be turned into a table.
- verify_connection: Verifies that there is connectivity to python and also to the external resource you are accessing.
At present, the python.net integration doesn't support f strings and typing.
get_current_values
The get_current_values method receives a dictionary as parameter and returns one value and a timestamp for the most recent metric available. Below you find examples of the parameter and the expected output:
  parameter = {
    "lookups": [ "firstLookup", "secondLookup" ]
  }
  result = {
    "results": {
      "firstLookup": {
        "value": "1",
        "date":  "2020-12-31"
      },
      "secondLookup": {
        "value": "2",
        "date": "2020-12-31"
      }
    }
  }
get_historical_values
The get_historical_values method receives a dictionary as parameter and returns one value and a timestamp for a metric at a specified date or the closest to that date but not after. Below you find examples of the parameter and the expected output:
  parameter = {
  "lookups": [
      {
        "lookup": "firstLookup",
        "targetDate": "2020-12-05"
      },
      {
        "lookup": "secondLookup",
        "targetDate": "2020-12-04"
      }
    ]
  }
  result = {
    "results": {
      "firstLookup": {
        "value": "1",
        "date":  "2020-12-05"
      },
      "secondLookup": {
        "value": "2",
        "date": "2020-12-03"
      }
    }
  }
get_trend_data
The get_trend_data method receives a dictionary as parameter and returns timeseries data for a metric within a time range ready for a trend (downsampled or aggregated). Below you find examples of the parameter and the expected output:
  parameter = {
    "lookup": "secondLookup",
    "startDate": "2020-12-04",
    "endDate": "2020-12-07",
    "screenWidth": 500
  }
  result = {
    "results": [
      {
        "value": 1,
        "date": "2020-12-04"
      },
      {
        "value": 1,
        "date": "2020-12-05"
      },
      {
        "value": 1,
        "date": "2020-12-06"
      }
    ]
  }
get_historical_data
The get_historical_data method receives a dictionary as parameter and returns raw historical data (timeseries data). Below you find examples of the parameter and the expected output:
  parameter = {
    "lookup": "secondLookup",
    "startDate": "2020-12-04",
    "endDate": "2020-12-07"
  }
  result = {
    "results": [
      {
        "value": 1,
        "date": "2020-12-04"
      },
      {
        "value": 1,
        "date": "2020-12-05"
      },
      {
        "value": 1,
        "date": "2020-12-06"
      }
    ]
  }
The boilerplate script is shown below:
 Boilerplate script
Boilerplate script
    import json
    # import requests
    # this method should return one value and a timestamp for a metric, the most recent available
    def get_current_values(lookups):
        paramObject = json.loads(lookups)  # deserializes string input into object
        results = {}  # creates results dictionary
        for lookup in paramObject["lookups"]:  # loops the lookups list from the input
            results[lookup] = {
                "value": 1,
                "date": "2020-12-22T16:34:20-06:00",
            }  # appends result of one lookup to the dict
        output = {"results": results}  # creates output object with the results dictionary
        return json.dumps(output)  # returns serialized object to .NET
    # this method should return one value and a timestamp for a metric at a specified date or the closest to that date but not after.
    def get_historical_values(lookups):
        paramObject = json.loads(lookups)  # deserializes string input into object
        results = {}  # creates results dictionary
        for lookupObject in paramObject[
            "lookups"
        ]:  # loops the lookups object from the input
            lookup = lookupObject["lookup"]  # gets lookup name
            targetDateString = lookupObject["targetDate"]  # gets lookup target date
            results[lookup] = {
                "value": 1,
                "date": targetDateString,
            }  # appends result of one lookup to the dict
        output = {"results": results}  # creates output object with the results dictionary
        return json.dumps(output)  # returns serialized object to .NET
    # this method should return timeseries data for a metric within a time ragne ready for a trend (downsampled or aggregated)
    def get_trend_data(lookup):
        paramObject = json.loads(lookup)
        lookupName = paramObject["lookup"]
        startDate = paramObject["startDate"]
        endDate = paramObject["endDate"]
        screenWidth = paramObject["screenWidth"]
        results = []
        results.append({"value": "10", "date": "2020-12-07T16:34"})
        results.append({"value": 1, "date": startDate})
        results.append({"value": 2, "date": endDate})
        output = {"results": results}
        return json.dumps(output)
    # this method should return raw historical data (timeseries data)
    def get_historical_data(lookup):
        paramObject = json.loads(lookup)
        lookupName = paramObject["lookup"]
        startDate = paramObject["startDate"]
        endDate = paramObject["endDate"]
        results = []
        results.append({"value": 1, "date": startDate})
        results.append({"value": 2, "date": endDate})
        output = {"results": results}
        return json.dumps(output)
    def get_table(lookup):
        return json.dumps(
            {
                "hasData": True,
                "rowCount": 2,
                "hasError": False,
                "tables": [
                    {
                        "id": lookup,
                        "hasData": True,
                        "rowCount": 2,
                        "columns": [
                            {"name": "Title"},
                            {"name": "Type"},
                            {"name": "Organization"},
                            {"name": "URL"},
                        ],
                        "rows": [
                            {
                                "cells": [
                                    {"value": ""},
                                    {"value": "Report"},
                                    {"value": "Transpara"},
                                    {
                                        "value": '\n <a href="">\n <i class="tf tf-link16" style="font-size: 16px; line-height: 12px; position:relative; top: -1px; padding-right: 4px;"></i>\n </a>\n '
                                    },
                                ]
                            },
                            {
                                "cells": [
                                    {"value": "Title"},
                                    {"value": "test"},
                                    {"value": "Transpara"},
                                    {
                                        "value": '\n <a href="">\n <i class="tf tf-link16" style="font-size: 16px; line-height: 12px; position:relative; top: -1px; padding-right: 4px;"></i>\n </a>\n '
                                    },
                                ]
                            },
                        ],
                    }
                ],
            }
        )
    def verify_connection():
        # this metod should verify that there is connectivity to python and also to the external resource we are accessing
        # return requests.get('http://google.com').text
        return "Connection Successful"
More examples can be found inside the python interface installation folder.