Примеры построены на основе демо данных. Для полноценной работы необходимо сначала установить демо данные.
Следующий пример получает токен авторизации, затем отправляет запрос данных в 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.0', 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { "database": "Magazin", #ID базы данных "groups": [ { "mgid": "Fakticheskie_prodazhi_v_rublyah", #Группа показателей "Фактические продажи в рублях" "attributes": [ { "dimrole": "Gorod_otpravki", #Атрибут "Город отправки" в строках "attrid": "Gorod", "axis": "ROW" }, { "dimrole": "Gorod_polucheniya", #Атрибут "Город получения" в столбцах "attrid": "Gorod", "axis": "COLUMN" } ], "measures": [ { "mid": "Stoimost_realizatsii" #Показатель "Стоимость реализации" } ], "filters": [ { "dimrole": "Produkt", #С фильтром по измерению "Продукт" на категорию "Консервы" "attrid": "Kategoriya", "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 необходимо транспонировать
Следующий пример отличается от предыдущего тем, что после получения данных из 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.0', 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { "database": "Magazin", #ID базы данных "groups": [ { "mgid": "Fakticheskie_prodazhi_v_rublyah", #Группа показателей "Фактические продажи в рублях" "attributes": [ { "dimrole": "Gorod_otpravki", #Атрибут "Город отправки" в строках "attrid": "Gorod", "axis": "ROW" }, { "dimrole": "Gorod_polucheniya", #Атрибут "Город получения" в столбцах "attrid": "Gorod", "axis": "COLUMN" } ], "measures": [ { "mid": "Stoimost_realizatsii" #Показатель "Стоимость реализации" } ], "filters": [ { "dimrole": "Produkt", #С фильтром по измерению "Продукт" на категорию "Консервы" "attrid": "Kategoriya", "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
Пример влияния OLAP-фильтра на запрос данных в ViQube. Для выполнения данного кода на дашборде помимо основ необходим виджет фильтр с названием "Фильтр 1", значениями которого являются годы, фильтр может быть как обычным, так и множественным:
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.0', 'content-type': 'application/json; charset=utf-8'} # Заголовки для POST-запроса query_json = { # JSON "database": "Magazin", "groups": [ { "mgid": "Fakticheskie_prodazhi_v_rublyah", "attributes": [ { "dimrole": "Data_otgruzki", "attrid": "YEAR", "axis": "ROW" }, { "dimrole": "Gorod_otpravki", "attrid": "Gorod", "axis": "COLUMN" } ], "measures": [ { "mid": "Pribil" } ], "filters": [ { "dimrole": "Data_otgruzki", "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 необходимо транспонировать
Следующий пример отличается от прерыдущего тем, что в ViQube запрашиваются все данные, без фильтра по годам, а сам фильтрация данных осуществляется на уровне Python-кода:
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], olap_filter.selected)) # Преобразование массива массивов в массив для передачи в запрос # Отправка запроса на ViQube query_url = f'{host}/viqube/metadata/query' # URL для POST-запроса query_headers = {'authorization': bearer_token, 'X-API-VERSION': '3.0', 'content-type': 'application/json; charset=utf-8'} # Заголовки для POST-запроса query_json = { # JSON "database": "Magazin", "groups": [ { "mgid": "Fakticheskie_prodazhi_v_rublyah", "attributes": [ { "dimrole": "Data_otgruzki", # Значения в строках - годы "attrid": "YEAR", "axis": "ROW" }, { "dimrole": "Gorod_otpravki", "attrid": "Gorod", "axis": "COLUMN" } ], "measures": [ { "mid": "Pribil" } ] } ] } query_response = requests.post(url=query_url, headers=query_headers, json=query_json).json() # POST-запрос в ViQube cols_from_request = query_response['columns'] rows_from_request = query_response['rows'] values_from_request = query_response['values'] cols = [] rows = [] values = [] for value in filter_values: # Перебор выбранных значений фильтра for i in range(len(rows_from_request)): # Отбор строк со значениями из фильтра if rows_from_request[i][0] == value: # Здесь проверяется [0]й элемент, т.к. в ответе на запрос год стоит на 0й позиции, если бы города были тое в строках, проверялся бы [1]й элемент rows.append(rows_from_request[i]) values.append(values_from_request[i]) cols = cols_from_request values = [list(x) for x in zip(*values)] #Значения, полученные от ViQube необходимо транспонировать my_chart.cols = cols my_chart.rows = rows my_chart.values = values
Следующий пример с помощью простой модели добавляет в данные прогноз на основе полученных из ViQube данных, лучше всего на основе этого кода построить виджет график:
import requests from sklearn.linear_model import LinearRegression host = 'http://bitest.example.com' # Адрес сервера ViQube bearer_token = 'Bearer ' + ACCESS_TOKEN # ACCESS_TOKEN - специальная переменная, содержащая текущий токен авторизации # Отправка запроса на ViQube query_url = f'{host}/viqube/metadata/query'#URL для POST-запроса query_headers = {'authorization': bearer_token, 'X-API-VERSION': '3.0', 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { "database": "Magazin", "groups": [ { "mgid": "Fakticheskie_prodazhi_v_rublyah", "attributes": [ { "dimrole": "Data_otgruzki", "attrid": "YEAR", "axis": "ROW" } ], "measures": [ { "mid": "Stoimost_realizatsii" } ] } ] } query_response = requests.post(url=query_url, headers=query_headers, json=query_json).json() #POST-запрос в ViQube rows = query_response['rows'] cols_done = [['Факт'], ['Прогноз']] values = query_response['values'] predict_years = [] # Переменная для годов прогноза for i in range(len(rows)): rows[i][0] = int(rows[i][0]) # Преобразование годов из строк в числа, т.к. для модели необходим тип int, а в ответе на запрос приходят строки predict_years.append(rows[i]) # Заполнение годов прогноза predict_years.append([int(rows[-1][0])+1]) predict_years.append([int(rows[-1][0])+2]) # Добавление двух лет для прогноза model = LinearRegression() model.fit(rows, values) # Обучение модели predict_target = model.predict(predict_years) # Создание прогноза values.append([None]) values.append([None]) # Корректировка значений из-за добавления двух годов values_done = [] values_done.append(list(map(lambda i: i[0], values))) predict_target = list(map(lambda i: i[0], predict_target)) values_done.append(predict_target) # Добавление колонки с прогнозом к значениям for i in range(len(predict_years)): predict_years[i][0] = str(predict_years[i][0]) rows_done = predict_years #Передача данных на виджет #-Гистограмма- my_chart = DataFrame() my_chart.cols = cols_done my_chart.rows = rows_done my_chart.values = values_done