Примеры Python скриптов

Примеры построены на основе демо-данных. Для полноценной работы необходимо сначала установить демо данные, а также библиотеку requests и pandas (sudo apt install python3-pip && pip3 install requests && pip3 install pandas).

  1. Следующий пример получает токен авторизации, затем отправляет запрос данных в ViQube, а после этого передаёт полученные данные на виджет. Этот код можно использовать, например, для гистограммы:

    import requests host = 'http://bitest.example.com' # Адрес сервера ViQube login = 'admin' # Логин администратора password = '***' # Пароль # Запрос токена авторизации token_url = f'{host}/idsrv/connect/token' #URL для POST-запроса token_data = {'grant_type': 'password', 'scope': 'openid profile email roles viqubeadmin_api viqube_api', 'response_type': 'id_token token', 'username': login, 'password': password} #Данные для POST-запроса token_headers = {'authorization': 'Basic dmlxdWJlYWRtaW5fcm9fY2xpZW50OjcmZEo1UldwVVMkLUVVQE1reHU=', 'content-type': 'application/x-www-form-urlencoded'} #Заголовки для POST-запроса token_response = requests.post(url=token_url, headers=token_headers, data=token_data).json() #POST-Запрос на получение токена bearer_token = 'Bearer ' + token_response['access_token'] #Значение токена авторизации для дальнейших запросов в ViQube # Запрос данных в ViQube query_url = f'{host}/viqube/metadata/query'#URL для POST-запроса query_headers = {'authorization': bearer_token, 'X-API-VERSION': '3.4', #Чтобы узнать X-API-VERSION перейдите по адресу http://ip/viqube/version 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { "database": "ViQube", "groups": [ { "mgid": "Fakticheskie_prodazhi__rubli", #Группа показателей "Фактические продажи - рубли" "attributes": [ { "dimroleid": "Gorod_dostavki", #Атрибут "Город доставки" в строках "attrid": "__attr_Goroda", "axis": "ROW" }, { "dimroleid": "Gorod_prodazhi", #Атрибут "Город продажи" в столбцах "attrid": "__attr_Goroda", "axis": "COLUMN" } ], "measures": [ { "mid": "Price" #Показатель "Стоимость продажи" } ], "filters": [ [ { "attrid": "Category", #С фильтром по измерению "Продукты" на категорию "Консервы" "dimid": "Produkti", "type": "INCLUDE", "values": [ "Консервы" ] } ] ] } ] } query_response = requests.post(url=query_url, headers=query_headers, json=query_json).json() #POST-запрос в ViQube #Передача данных на виджет #-Гистограмма- my_chart = DataFrame() my_chart.cols = query_response['columns'] my_chart.rows = query_response['rows'] my_chart.values = [list(x) for x in zip(*query_response['values'])] #Значения, полученные от ViQube необходимо транспонировать



  2. Следующий пример отличается от предыдущего тем, что после получения данных из ViQube строится объект Pandas, затем производится фильтрация в Pandas и после этого данные передаются на виджет. Этот код можно использовать, например, для сводной таблицы:

    import requests import pandas host = 'http://bitest.example.com' # Адрес сервера ViQube login = 'admin' # Логин администратора password = '***' # Пароль # Запрос токена авторизации token_url = f'{host}/idsrv/connect/token' #URL для POST-запроса token_data = {'grant_type': 'password', 'scope': 'openid profile email roles viqubeadmin_api viqube_api', 'response_type': 'id_token token', 'username': login, 'password': password} #Данные для POST-запроса token_headers = {'authorization': 'Basic dmlxdWJlYWRtaW5fcm9fY2xpZW50OjcmZEo1UldwVVMkLUVVQE1reHU=', 'content-type': 'application/x-www-form-urlencoded'} #Заголовки для POST-запроса token_response = requests.post(url=token_url, headers=token_headers, data=token_data).json() #POST-Запрос на получение токена bearer_token = 'Bearer ' + token_response['access_token'] #Значение токена авторизации для дальнейших запросов в ViQube # Запрос данных в ViQube query_url = f'{host}/viqube/metadata/query'#URL для POST-запроса query_headers = {'authorization': bearer_token, 'X-API-VERSION': '3.4', #Чтобы узнать X-API-VERSION перейдите по адресу http://ip/viqube/version 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { "database": "ViQube", "groups": [ { "mgid": "Fakticheskie_prodazhi__rubli", #Группа показателей "Фактические продажи - рубли" "attributes": [ { "dimroleid": "Gorod_dostavki", #Атрибут "Город доставки" в строках "attrid": "__attr_Goroda", "axis": "ROW" }, { "dimroleid": "Gorod_prodazhi", #Атрибут "Город продажи" в столбцах "attrid": "__attr_Goroda", "axis": "COLUMN" } ], "measures": [ { "mid": "Price" #Показатель "Стоимость продажи" } ], "filters": [ [ { "attrid": "Category", #С фильтром по измерению "Продукты" на категорию "Консервы" "dimid": "Produkti", "type": "INCLUDE", "values": [ "Консервы" ] } ] ] } ] } query_response = requests.post(url=query_url, headers=query_headers, json=query_json).json() #POST-запрос в ViQube rows = list(map(lambda i: i[0], query_response['rows'])) #Для формирования индексов DataFrame в Pandas требуется массив, а данные от викуб возвращаются как массив массивов columns = list(map(lambda i: i[0], query_response['columns'])) #Для формирования заголовков DataFrame в Pandas требуется массив, а данные от викуб возвращаются как массив массивов values = query_response['values'] pandas_table = pandas.DataFrame(values, index=rows, columns=columns) #Создание Pandas DataFrame pandas_table = pandas_table[pandas_table.Иркутск > 700000] #Фильтр на данные: стоимость реализации товаров в Иркутск > 700000р. columns = [[x] for x in list(pandas_table)] #Для передачи колонок на виджет требуется массив массивов, а в Pandas это массив rows = [[x] for x in list(pandas_table.index)] #Для передачи строк на виджет требуется массив массивов, а в Pandas это массив values = pandas_table.T.to_numpy().tolist() #Для передачи значений на виджет требуется массив массивов, а в Pandas иной формат #Передача данных на виджет #-Сводная таблица- my_chart = DataFrame() my_chart.cols = columns my_chart.rows = rows my_chart.values = values
  3. Пример влияния OLAP-фильтра на запрос данных в ViQube. Для выполнения данного кода на дашборде помимо виджета "Гистограмма" необходим виджет фильтр с названием "Фильтр 1", значениями которого являются годы (например, через привязку в Viqube к измерению "Календарь" без группы показателей), фильтр может быть как обычным, так и множественным. Добавьте этот код к виджету "Гистограмма" и в "Фильтре 1" выберите год "2016"

    import requests host = 'http://bitest.example.com' # Адрес сервера ViQube bearer_token = 'Bearer ' + ACCESS_TOKEN # ACCESS_TOKEN - специальная переменная, содержащая текущий токен авторизации filter_name = 'Фильтр 1' # Название фильтра #-Гистограмма- my_chart = DataFrame() for olap_filter in olap_filters: # Цикл перебирает все фильтры на дэшборде if olap_filter.title == filter_name: # Выбирает фильтр с заданным именем selected_values = olap_filter.selected # Отбирает выбранные значения фильтра break filter_values = list(map(lambda i: i[0], selected_values)) # Преобразование массива массивов в массив для передачи в запрос # Отправка запроса на ViQube query_url = f'{host}/viqube/metadata/query' # URL для POST-запроса query_headers = {'authorization': bearer_token, 'X-API-VERSION': '3.4', #Чтобы узнать X-API-VERSION перейдите по адресу http://ip/viqube/version 'content-type': 'application/json; charset=utf-8'} # Заголовки для POST-запроса query_json = { # JSON "database": "ViQube", "groups": [ { "mgid": "Fakticheskie_prodazhi__rubli", #Группа показателей "Фактические продажи - рубли" "attributes": [ { "dimroleid": "Data_pay", #Атрибут "Дата продажи" в строках "attrid": "YEAR", "axis": "ROW" }, { "dimroleid": "Gorod_prodazhi", #Атрибут "Город продажи" в столбцах "attrid": "__attr_Goroda", "axis": "COLUMN" } ], "measures": [ { "mid": "Pribil" #Показатель "Стоимость продажи" } ], "filters": [ [ { "dimroleid": "Data_pay", "attrid": "YEAR", "type": "INCLUDE", "values": filter_values # Передача массива с выбранными в фильтре значениями } ] ] } ] } query_response = requests.post(url=query_url, headers=query_headers, json=query_json).json() # POST-запрос в ViQube my_chart.cols = query_response['columns'] my_chart.rows = query_response['rows'] my_chart.values = [list(x) for x in zip(*query_response['values'])] #Значения, полученные от ViQube необходимо транспонировать

     

  4. Следующий пример отличается от предыдущего тем, что в ViQube запрашиваются все данные, без фильтра по годам, а сама фильтрация данных осуществляется на уровне Python-кода (добавлять на виджет "Гистограмма"):

     

  5. Следующий пример с помощью простой модели добавляет в данные прогноз на основе полученных из ViQube данных, лучше всего на основе этого кода построить виджет график. Требуется установка библиотеки scikit-learn: pip3 install scikit-learn