Примеры построены на основе демо-данных. Для полноценной работы необходимо сначала установить демо данные, а также библиотеку requests и pandas (sudo apt install python3-pip && pip3 install requests && pip3 install pandas).
Следующий пример получает токен авторизации, затем отправляет запрос данных в ViQube, а после этого передаёт полученные данные на виджет. Этот код можно использовать, например, для гистограммы:
Блок кода language py
...
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 необходимо транспонировать
Следующий пример отличается от предыдущего тем, что после получения данных из ViQube строится объект Pandas, затем производится фильтрация в Pandas и после этого данные передаются на виджет. Этот код можно использовать, например, для сводной таблицы:
Блок кода language py
...
...
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
Пример влияния OLAP-фильтра на запрос данных в ViQube. Для выполнения данного кода на дашборде помимо
...
виджета "Гистограмма" необходим виджет фильтр с названием "Фильтр 1", значениями которого являются годы (например, через привязку в Viqube к измерению "Календарь" без группы показателей), фильтр может быть как обычным, так и множественным
...
. Добавьте этот код к виджету "Гистограмма" и в "Фильтре 1" выберите год "2016"
Блок кода language py
...
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 необходимо транспонировать
Следующий пример отличается от предыдущего тем, что в ViQube запрашиваются все данные, без фильтра по годам, а сама фильтрация данных осуществляется на уровне Python-кода (добавлять на виджет "Гистограмма"):
Блок кода language py
...
Блок кода | ||||
---|---|---|---|---|
| ||||
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.4', #Чтобы узнать X-API-VERSION перейдите по адресу http://ip/viqube/version
'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса
#JSON для получения данных из ViQube
query_json = { # JSON
"database": "ViQube",
"groups": [
{
"mgid": "Fakticheskie_prodazhi__rubli", #Группа показателей "Фактические продажи - рубли"
"attributes": [
{
"dimroleid": "Data_pay", #Атрибут "Дата продажи" в строках
"attrid": "YEAR",
"axis": "ROW"
}
],
"measures": [
{
"mid": "Pribil" #Показатель "Стоимость продажи"
}
]
}
]
}
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
|
Примеры построены на основе демо-данных. Для полноценной работы необходимо сначала установить демо данные.
Следующий пример получает токен авторизации, затем отправляет запрос данных в 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 необходимо транспонировать
|
Следующий пример отличается от предыдущего тем, что после получения данных из 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
|
Пример влияния 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.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 необходимо транспонировать
|
Следующий пример отличается от предыдущего тем, что в 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.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" #Показатель "Стоимость продажи"
}
]
}
]
}
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 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.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" #Показатель "Стоимость продажи" } ] } ] } 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 данных, лучше всего на основе этого кода построить виджет график. Требуется установка библиотеки scikit-learn:
...
pip3 install scikit-learn
Блок кода language py 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.4', #Чтобы узнать X-API-VERSION перейдите по адресу http://ip/viqube/version 'content-type': 'application/json; charset=utf-8'} #Заголовки для POST-запроса #JSON для получения данных из ViQube query_json = { # JSON "database": "ViQube", "groups": [ { "mgid": "Fakticheskie_prodazhi__rubli", #Группа показателей "Фактические продажи - рубли" "attributes": [ { "dimroleid": "Data_pay", #Атрибут "Дата продажи" в строках "attrid": "YEAR", "axis": "ROW" } ], "measures": [ { "mid": "Pribil" #Показатель "Стоимость продажи" } ] } ] } 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