По мере роста информационной системы (далее ИС) и количества ее пользователей в ней ощутимо увеличивается количество выданных разрешений. Усложнение ролевой модели, увеличение количества условий и объектов в ИС усложняет предоставление пользователям уникальных разрешений. Поэтому, в общей концепции анализа модели предоставления прав в ИС важную роль играет анализ предоставленных разрешений. Проведение этого анализа путем группировки для упрощения анализа с помощью групп, а не отдельных разрешений, практически лишено смысла из-за наличия множества уникальных разрешений. Однако, анализ возможен путем сравнения векторов предоставленных разрешений. Далее представлен подобный метод анализа на примере предоставленных разрешений в Tessa.
Выгрузка данных из БД Tessa¶
Далее представлен код MS SQL, предназначенный для выгрузки данных из базы данных (далее БД) Tessa, которые требуются для кластерного анализа модели предоставления прав в Tessa. Однако, в целях обеспечения безопасности эксплуатационных данных для разработки кластерного анализа предлагается использовать тестовые данные, сгенерированные с помощью генератора датафреймов, разработанного в Microsegment.ru.
-- Все правила доступа с русским переводом параметров
SELECT kp.ID AS [ID правила доступа],
kp.Caption AS [Название правила доступа],
CASE WHEN kp.IsDisabled ='1' THEN 'True' ELSE 'False' END AS [Правило отключено],
CASE WHEN kp.IsRequired ='1' THEN 'True' ELSE 'False' END AS [Всегда проверять правило],
CASE WHEN kp.IsExtended ='1' THEN 'True'ELSE 'False' END AS [РПД],
CASE WHEN kp.Conditions LIKE '%ConditionTypeID%' THEN 'True' ELSE 'False' END AS [Типы условий],
-- Разрешения из правил доступа
CASE WHEN kp.CanCreateCard ='1' THEN 'True' ELSE 'False' END AS [Создание карточки],
CASE WHEN kp.CanReadCard ='1' THEN 'True' ELSE 'False' END AS [Чтение карточки],
CASE WHEN kp.CanEditCard ='1' THEN 'True' ELSE 'False' END AS [Редактирование карточки],
CASE WHEN kp.CanEditFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование файлов],
CASE WHEN kp.CanAddFiles ='1' THEN 'True' ELSE 'False' END AS [Добавление файлов],
CASE WHEN kp.CanEditRoute ='1' THEN 'True' ELSE 'False' END AS [Редактирование маршрута],
CASE WHEN kp.CanDeleteCard ='1' THEN 'True' ELSE 'False' END AS [Удаление карточки],
CASE WHEN kp.CanStartProcess ='1' THEN 'True' ELSE 'False' END AS [Инициация типового процесса отправки задач],
CASE WHEN kp.CanEditNumber ='1' THEN 'True' ELSE 'False' END AS [Ручное редактирование номера],
CASE WHEN kp.CanCreateResolutions ='1' THEN 'True' ELSE 'False' END AS [Создание резолюций],
CASE WHEN kp.CanDeleteFiles ='1' THEN 'True' ELSE 'False' END AS [Удаление всех файлов],
CASE WHEN kp.CanEditOwnFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование собственных файлов].
CASE WHEN kp.CanDeleteownFiles ='1' THEN 'True'ELSE 'False' END AS [Удаление собственных файлов],
CASE WHEN kp.CansignFiles ='1' THEN 'True' ELSE 'False' END AS [Подписание файлов],
CASE WHEN kp.CanAddTopics ='1' THEN 'True'ELSE 'False'END AS [Создание обсуждений].
CASE WHEN kp.CanSuperModeratorMode ='1' THEN 'True'ELSE 'False' END AS [Права супермодератора],
CASE WHEN kp.CanSubscribeForNotifications = '1' THEN 'True' ELSE 'False' END AS [Подписка на уведомления],
CASE WHEN kp.CanCreateTemplateAndCopy ='1' THEN 'True' ELSE 'False' END AS [Создание шаблона и копирование],
CASE WHEN kp.CanSkipStages ='1' THEN 'True' ELSE 'False' END AS [Пропуск этапов],
CASE WHEN kp.CanFullRecalcRoute ='1' THEN 'True' ELSE 'False' END AS [Полный пересчет маршрута].
CASE WHEN kp.CanEditMyMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование своих сообщений],
CASE WHEN kp.CanEditAllMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование всех сообщений],
CASE WHEN kp.CanReadAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение обсуждений],
CASE WHEN kp.CanReadAndSendMessageInAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение и отправка сообщений]
FROM KrPermissions (NOLOCK) kp;
-- Обогащение правил доступа дополнительными данными о ролях
SELECT DISTINCT
-- Правила доступа
kpr.ID AS [ID правила доступа],
-- Роли
kpr.RoleID AS [ID роли],
kpr.RoleName AS [Название роли]
FROM krPermissionRoles (NOLOCK) kpr;
-- Обогащение правил доступа дополнительными данными о типах документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Тип карточки
kpt.TypeCaption AS [ID ЛФО типа карточки]
dbo.Localize(kpt.TypeCaption, 25) AS [Тип карточки]
FROM KrPermissionTypes (NOLOCK) kpt;
-- Обогащение правил доступа дополнительными данными о состояниях документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Состояние карточки
kps.StateName AS [ID ЛФО состояния карточки]
dbo.Localize(kps.StateName, 25) AS [Состояние карточки]
FROM KrPermissionStates (NOLOCK) kps
-- Расширенные правила доступа (РПД)
SELECT
DISTINCT
-- Правила доступа
kp.ID AS [ID правила доступа],
-- Параметры РПД
kpecr.SectionName AS [РПД. Секция карточки].
kpecrf.FieldName AS [РПД. Поле карточки],
kpecr.AccessSettingName AS [РПД. Разрешение],
dbo.Localize(kpecr.AccesssettingName, 25) AS [РПД. Разрешение (рус)]
FROM KrPermissions AS kp
LEFT JOIN KrPermissionExtendedcardRules (NOLOCK) kpecr ON kpecr.ID = kp. ID
LEFT JOIN KrPermissionExtendedcardRuleFields (NOLOCK) kpecrf ON kpecrf. ID = kp.ID;
-- Вхождение PersonalRoles в любые Roles, кроме ContextRoles
SELECT pr.ID AS [ID пользователя],
pr.Name AS [Имя пользователя],
pr.Position AS [Должность пользователя],
pr.AccessLevelID AS [Уровень доступа пользователя],
pr.LoginTypeID AS [Тип учетной записи пользователя],
pr.Login AS [Логин пользователя],
CASE WHEN pr.Blocked ='1' THEN 'True' END AS [Блокировка учетной записи пользователя],
r.ID AS [ID роли],
r.Name AS [Название роли],
r.TypeID AS [Тип роли]
FROM Roles (NOLOCK)r
LEFT JOIN RoleUsers (NOLOCK) ru ON ru.ID = r.ID
LEFT JOIN PersonalRoles (NOLOCK) pr ON pr.ID - ru.UserID
WHERE (ru. IsDeputy = O OR ru.IsDeputy IS NULL)
ORDER BY pr.Name, r.Name;
-- ContextRoles
SELECT cr.ID AS [ID роли],
cr.SqlText AS [Код SQL]
FROM ContextRoles (NOLOCK) cr;
-- Для выявления вхождения идентификаторов ролей в коды контекстных ролей
-- (очень долгая операция, лучше реализовать локально на Python)
--LEFT JOIN Roles (NOLOCK) r ON cr.SqlText LIKE '%'+CONVERT(VARCHAR(50), .ID)+'%'
Загрузка библиотек¶
import pandas as pd
import numpy as np
# ML методы библиотеки Sklearns
from sklearn.preprocessing import StandardScaler
# TF-IDF для векторизации текстов и расчета частотности слов в них
from sklearn.feature_extraction.text import TfidfVectorizer
# Нормализация векторов (L2 - для косинусных расстояний)
from sklearn.preprocessing import normalize
# Вычисление расстояний между объектами (косинусное и евклидово)
from sklearn.metrics.pairwise import cosine_distances, euclidean_distances, cosine_similarity
# Вычисление расстояния по Левенштейну
#from Levenshtein import distances as Lev_distances
Загрузка данных¶
# Данные из таблицы KrPermissions, предварительно выгруженные из БД Tessa
kr_permissions = pd.read_csv('files/KrPermissions.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(kr_permissions.info())
kr_permissions.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 188 entries, 0 to 187 Data columns (total 30 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 188 non-null object 1 Название правила доступа 188 non-null object 2 Правило отключено 188 non-null bool 3 Всегда проверять правило 188 non-null bool 4 РПД 188 non-null bool 5 Типы условий 188 non-null bool 6 Создание карточки 188 non-null bool 7 Чтение карточки 188 non-null bool 8 Редактирование карточки 188 non-null bool 9 Удаление карточки 188 non-null bool 10 Добавление файлов 188 non-null bool 11 Редактирование собственных файлов 188 non-null bool 12 Редактирование файлов 188 non-null bool 13 Удаление собственных файлов 188 non-null bool 14 Удаление всех файлов 188 non-null bool 15 Инициация типового процесса отправки задач 188 non-null bool 16 Редактирование маршрута 188 non-null bool 17 Пропуск этапов 188 non-null bool 18 Полный пересчет маршрута 188 non-null bool 19 Ручное редактирование номера 188 non-null bool 20 Создание резолюций 188 non-null bool 21 Подписание файлов 188 non-null bool 22 Создание обсуждений 188 non-null bool 23 Права супермодератора 188 non-null bool 24 Подписка на уведомления 188 non-null bool 25 Создание шаблона и копирование 188 non-null bool 26 Редактирование своих сообщений 188 non-null bool 27 Редактирование всех сообщений 188 non-null bool 28 Чтение обсуждений 188 non-null bool 29 Чтение и отправка сообщений 188 non-null bool dtypes: bool(28), object(2) memory usage: 8.2+ KB None
| ID правила доступа | Название правила доступа | Правило отключено | Всегда проверять правило | РПД | Типы условий | Создание карточки | Чтение карточки | Редактирование карточки | Удаление карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2b4b240e-bbdc-4c45-a3d7-0a321ed4c8a3 | Правило 0 | True | False | False | False | True | True | True | True | … | False | False | False | False | False | False | False | False | False | False |
| 1 | b293b470-2c6d-4fb4-af50-b9cec58f0a04 | Правило 1 | False | True | False | False | True | True | True | True | … | False | False | False | False | False | False | False | False | False | False |
| 2 | b60fd2ba-d8d4-4f36-aef7-98b46c942f02 | Правило 2 | False | False | False | False | False | True | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 3 | 3c3540ed-2bd6-4305-8a9d-30436b1c0a42 | Правило 3 | True | False | False | False | False | False | True | True | … | True | False | False | False | False | False | False | False | False | False |
| 4 | 930e82a3-f2cd-4ad1-907f-94ca4a90a90d | Правило 4 | False | False | False | False | False | True | False | False | … | False | True | False | False | False | False | False | False | False | False |
5 rows × 30 columns
# Данные из таблицы KrPermissionRoles, предварительно выгруженные из БД Tessa
kr_permission_roles = pd.read_csv('files/KrPermissionRoles.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(kr_permission_roles.info())
kr_permission_roles.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 316 entries, 0 to 315 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 316 non-null object 1 ID роли 316 non-null object 2 Название роли 316 non-null object dtypes: object(3) memory usage: 7.5+ KB None
| ID правила доступа | ID роли | Название роли | |
|---|---|---|---|
| 0 | 6cd7278b-eff2-4623-a049-24cb4c7a7b17 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. |
| 1 | af63229f-8e43-4643-8dfe-87460da58b10 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов |
| 2 | af63229f-8e43-4643-8dfe-87460da58b10 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов |
| 3 | af63229f-8e43-4643-8dfe-87460da58b10 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов |
| 4 | af63229f-8e43-4643-8dfe-87460da58b10 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов |
# Данные из таблицы KrPermissionTypes, предварительно выгруженные из БД Tessa
kr_permission_types = pd.read_csv('files/KrPermissionTypes.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(kr_permission_types.info())
kr_permission_types.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 176 entries, 0 to 175 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 176 non-null object 1 ID типа карточки 138 non-null object 2 Тип карточки 138 non-null object dtypes: object(3) memory usage: 4.3+ KB None
| ID правила доступа | ID типа карточки | Тип карточки | |
|---|---|---|---|
| 0 | c0427778-a191-43ce-aabf-ded5ce1ca9f4 | NaN | NaN |
| 1 | 0960eff0-5aa9-4dbb-944b-52521df84726 | 9cdbc874-1915-4dd6-a079-3a1bdedfc225 | Исходящий |
| 2 | 5b33da88-0973-47c9-842d-e4a91f38884b | 9cdbc874-1915-4dd6-a079-3a1bdedfc225 | Исходящий |
| 3 | 8500f5f7-8c9c-40e1-b244-adb872875bfb | e6ba32b1-239d-475a-988a-95ea2b663877 | Входящий |
| 4 | 765174f3-c447-450e-b9e8-0eaae13e42a2 | e6ba32b1-239d-475a-988a-95ea2b663877 | Входящий |
# Данные из таблицы KrPermissionStates, предварительно выгруженные из БД Tessa
kr_permission_states = pd.read_csv('files/KrPermissionStates.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(kr_permission_states.info())
kr_permission_states.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 183 entries, 0 to 182 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 183 non-null object 1 ID состояния карточки 143 non-null object 2 Состояние карточки 143 non-null object dtypes: object(3) memory usage: 4.4+ KB None
| ID правила доступа | ID состояния карточки | Состояние карточки | |
|---|---|---|---|
| 0 | f980df84-776b-4955-a664-129bd65bc6e1 | c440d897-eb6e-4530-9465-495da749fd33 | Зарегистрирован |
| 1 | 921d8be7-7169-469e-8afd-16106faf85e8 | e97d981e-c1f5-43de-bf86-a34ef9a3022b | На обработке |
| 2 | a6ee4a9a-526e-43d3-aa99-2599964b2676 | NaN | NaN |
| 3 | 0960eff0-5aa9-4dbb-944b-52521df84726 | 03b29683-2129-417a-b419-96f1d567dd9e | На подписании |
| 4 | fc7694fa-a347-4d71-b423-180ed96ae9ff | 03b29683-2129-417a-b419-96f1d567dd9e | На подписании |
# Данные из таблицы KrPermissionExtendedcard, предварительно выгруженные из БД Tessa
kr_permission_extended_card_rules = pd.read_csv('files/KrPermissionExtendedCardRules.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(kr_permission_extended_card_rules.info())
kr_permission_extended_card_rules.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 5 non-null object 1 РПД. Секция карточки 5 non-null object 2 РПД. Поле карточки 5 non-null object 3 РПД. Разрешение 5 non-null object 4 РПД. Разрешение (рус) 5 non-null object dtypes: object(5) memory usage: 332.0+ bytes None
| ID правила доступа | РПД. Секция карточки | РПД. Поле карточки | РПД. Разрешение | РПД. Разрешение (рус) | |
|---|---|---|---|---|---|
| 0 | 2b4b240e-bbdc-4c45-a3d7-0a321ed4c8a3 | Document | DocumentText | Write | Редактирование |
| 1 | b293b470-2c6d-4fb4-af50-b9cec58f0a04 | GeneralInformation | CreationDate | DenyWrite | Запрещено редактировать |
| 2 | b60fd2ba-d8d4-4f36-aef7-98b46c942f02 | EmployeeCard | Salary | Read | Чтение |
| 3 | 3c3540ed-2bd6-4305-8a9d-30436b1c0a42 | ApprovalStage | Comments | Append | Добавление комментариев |
| 4 | 930e82a3-f2cd-4ad1-907f-94ca4a90a90d | BasicData | Subject | DenyDelete | Запрещено удалять |
# Данные из таблицы RoleUsers, предварительно выгруженные из БД Tessa
role_users = pd.read_csv('files/RoleUsers.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(role_users.info())
role_users.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 477 entries, 0 to 476 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID пользователя 477 non-null object 1 Имя пользователя 477 non-null object 2 Должность пользователя 477 non-null object 3 Уровень доступа пользователя 449 non-null float64 4 Тип учетной записи пользователя 449 non-null float64 5 Логин пользователя 477 non-null object 6 Блокировка учетной записи пользователя 361 non-null object 7 ID роли 477 non-null object 8 Название роли 477 non-null object 9 Тип роли 477 non-null int64 dtypes: float64(2), int64(1), object(7) memory usage: 37.4+ KB None
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | c7216461-3677-4b6e-9ea4-33e10c862c7b | Соколов О.С. | Начальник отдела | 0.0 | 1.0 | sokolovos | False | 1b8b51c2-fc59-413a-93bc-7410e6b7b8ea | Отдел продаж | 2 |
| 1 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | Начальник отдела | 0.0 | 2.0 | petrovamb | NaN | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 |
| 2 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | Младший специалист | 0.0 | 0.0 | gerasimovari | NaN | 2e2bc2e8-10bd-4ef9-8ac5-bf911b16ceaf | Руководство | 2 |
| 3 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | Начальник отдела | 1.0 | NaN | morozovart | True | d79e1c6d-b187-4413-a955-873d337ce325 | Бухгалтерия | 2 |
| 4 | 7cb26649-5758-46bd-962f-13136b53cbd2 | Алексеева Р.Д. | Начальник отдела | 1.0 | 2.0 | alekseevard | False | 0b314d6d-6fda-416f-8908-9fa95c0d799b | Отдел кадров | 2 |
# Данные из таблицы ContextRoles, предварительно выгруженные из БД Tessa
context_roles = pd.read_csv('files/ContextRoles.csv').drop('Unnamed: 0', axis=1)#, sep=';', encoding='utf-8-sig')
print(context_roles.info())
context_roles.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID роли 5 non-null object 1 Код SQL 5 non-null object dtypes: object(2) memory usage: 212.0+ bytes None
| ID роли | Код SQL | |
|---|---|---|
| 0 | 1db2f573-d8ae-46cb-98f7-e61d7d29b90d | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 1 | 8aa247e6-312e-4d0a-961e-1e03c738b921 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 2 | 4361c606-20f0-4cd7-bb79-3e6975a85614 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 3 | 23a95773-fedc-4b16-be7e-80d387834602 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 4 | aad1d32b-c445-4311-b8b2-80edc6f67ccb | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
Предобработка данных¶
# Создание отдельного датафрейма с ФИО и ID пользователей
user_data = role_users[['ID пользователя', 'Имя пользователя']].dropna().drop_duplicates()
print(user_data.info())
user_data.head(5)
<class 'pandas.core.frame.DataFrame'> Index: 215 entries, 0 to 214 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID пользователя 215 non-null object 1 Имя пользователя 215 non-null object dtypes: object(2) memory usage: 5.0+ KB None
| ID пользователя | Имя пользователя | |
|---|---|---|
| 0 | c7216461-3677-4b6e-9ea4-33e10c862c7b | Соколов О.С. |
| 1 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. |
| 2 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. |
| 3 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. |
| 4 | 7cb26649-5758-46bd-962f-13136b53cbd2 | Алексеева Р.Д. |
Векторный анализ¶
Возможные варианты решения:
- Базовое решение: объединение данных о правилах, разрешениях, типах и состояниях карточек, ролях и сотрудниках.
- Решение для большого количества данных: разделение всего массива данных на отдельные чанки в виде датафреймов по ролям, с последующим сохранением их в файлы. Одна роль — одна чанка — один датафрейм — один файл.
- Решение для очень большого количества данных: разделение всего массива данных на отдельные чанки в виде датафреймов по сотрудникам, с последующим сохранением их в файлы. Один сотрудник — одна чанка — один датафрейм — один файл.
Потребность в анализе предоставленных разрешений появляется при значительном росте ИС, при котором образуется очень большое количество данных для анализа. Исходя из этого, далее будет использовано разделение данных для анализа на чанки по сотрудникам.
Функции для векторного анализа¶
# Функция создания поля чанки для векторного анализа
def values_tolist(df, col, cols):
df[col] = ''
for c in cols:
df[col] = df[col] + '__' + str(df[c])
# Сортировка всей чанки по
df = df.sort_values(['values_tolist'])
return df
# Функция векторного анализа (с использованием индексов строк)
def simple_vector_analisis_long_format(df_source, text_column, n_matches=1):
# Создание копии чанки исходного датафрейма
df = df_source.copy()
# Предобработка данных
texts = df[text_column].fillna('').tolist()
indexes = df.index
# Вексторизация текстов
vectorizer = TfidfVectorizer(
lowercase=True # Приведение текстов к нижнему регистру
)
vectors = vectorizer.fit_transform(texts)
# L2-нормализация векторов для улучшения работы с косинусными расстояниями
vectors_normalize = normalize(vectors, norm='l2', axis=1)
# Матрицы евклидовых и косинусных расстояний
#euclidean_dists = euclidean_distances(vectors.toarray())
cosine_dists = cosine_similarity(vectors.toarray())
# Создание результатов в длинном формате
results = []
#for i in range(len(texts)):
for i in indexes:
# Исходный объект
#original_id = i
original_text = texts[i]
# Исходные расстояния за исключением самого объекта
#euc_dists = euclidean_dists[i].copy()
cos_dists = cosine_dists[i].copy()
#euc_dists[i] = np.inf
cos_dists[i] = np.inf
# Определяем количество совпадений
#if n_matches is None:
if n_matches == 1:
n_matches = len(df) - 1
# Находим наиболее близкие объекты по метрике
#euc_top_idx = np.argsort(euc_dists)[:n_matches]
cos_top_idx = np.argsort(-cos_dists)[:n_matches]
# Добавляем сам объект в качестве первой строки
results.append({
'Исходный индекс': i, #original_id,
'Исходное значение': original_text,
'Сопоставленный индекс': i,
'Сопоставленное значение': original_text,
'Тип расстояния': 'Косинусное',
'Расстояние': 0
})
# Для каждого совпадения создаем отдельную строку
'''
# Сопоставления по евклидовому расстоянию
for match_mnum, idx in enumerate(euc_top_idx):
results.append({
'Исходное значение': original_text,
'Исходный ID': i, #original_id,
'Сопоставленное значение': texts[idx],
'Сопоставленный ID': indexes[idx],
'Тип расстояния': 'Евклидово',
'Расстояние': euc_dists[idx]
})
'''
# Косинусные расстояния не тесте показали условно лучше результат
# DeepSeek считает его более подходящим для коротких текстов с учетом семантики
for match_mnum, idx in enumerate(cos_top_idx):
results.append({
'Исходный индекс': i, #original_id,
'Исходное значение': original_text,
'Сопоставленный индекс': idx,
'Сопоставленное значение': texts[idx],
'Тип расстояния': 'Косинусное',
'Расстояние': cos_dists[idx]
})
# Создание датафрейма с отсортированными результатами
df_results = pd.DataFrame(results)
df_results = df_results[df_results['Расстояние'] > .5].sort_values(['Исходное значение', 'Тип расстояния', 'Расстояние'])
return df_results
# Функция сравнения исходных и сопоставленных разрешений
def access_rules_comparisons(df, df1):
# Датафреймы с исходными и сопоставленными данными
original_df = df.iloc[df1['Исходный индекс']].reset_index(drop=True)
matched_df = df.iloc[df1['Сопоставленный индекс']].reset_index(drop=True)
# Сравнение датафреймов с исходными
# и сопоставленными данными
comparison_df = original_df == matched_df
comparison_df = comparison_df.iloc[0:, 7:]
# Добавление данных о расстояниях
comparison_df['Расстояние'] = df1['Расстояние'].reset_index(drop=True)
# Переименование полей сопоставленного датафрейма
matched_df.rename(columns={
'ID роли': 'ID сопоставленной роли',
'Название роли':'Название сопоставленной роли',
'Тип роли':'Тип сопоставленной роли',
'ID правила доступа':'ID сопоставленного правила доступа',
'Название правила доступа':'Название сопоставленного правила доступа'
}, inplace=True)
# Сборка итогового датафрейм с исходными,
# сопоставленными данными, сравнением разрешений и расстоянием
df3 = original_df.iloc[0:, :7]
df3 = pd.concat([df3, matched_df.iloc[0:, 2:7]], axis=1)
df3 = pd.concat([df3, comparison_df.iloc[0:, 8:]], axis=1)
# Удаление дублей строк и поля `values_tolist`
df3 = df3.drop('values_tolist', axis=1)
# Удаление одинаковых сопоставленных объектов
# "роль-правило доступа" и "сопоставленная роль-сопоставленное правило доступа"
df3 = df3[
(df3['ID роли'] != df3['ID правила доступа']) |
(df3['ID сопоставленной роли'] != df3['ID сопоставленного правила доступа']).drop_duplicates()
]
# Сброс индексов
df3 = df3.reset_index(drop=True)
return df3
# Добавление ссылок на карточки ролей и правил доступа
# на основе имеющихся идентификаторов
def links_to_card(df, cols, base_link='tessa://tessaclient.tessa/?Action=OpenCard&ID='):
df[cols] = base_link + df[cols]
return df
Проведение векторного анализа чанками по сотрудникам¶
# Решение для очень большого количества данных (разделение всего массива данных на отдельные датафреймы и потом файлы по сотрудникам)
# Создание отдельного датафрейма для каждого пользователя
n = 0
for i in user_data['ID пользователя']:
# Создание датафрейма сотрудника.
# Объединение данных о пользователях и ролях
# с ID правил доступа, где используются роли
df = pd.merge(
role_users[role_users['ID пользователя'] == i].sort_values([
'Имя пользователя',
'Название роли'
])[[
'ID пользователя',
'Имя пользователя',
'ID роли',
'Название роли',
'Тип роли'
]],
kr_permission_roles[['ID роли', 'ID правила доступа']].sort_values('ID роли'),
on='ID роли',
how='inner'
)
# Выход из цикла, если роль не используется в правилах
if len(df) == 0: continue
# Добавление данных о типах карточек,
# используемых в правилах вместе с ролями
df = pd.merge(
df,
kr_permission_types,#[['ID правила доступа', 'ID типа карточки']],
on='ID правила доступа',
how='left'
)
# Добавление данных о состояниях карточек
df = pd.merge(
df,
kr_permission_states,#[['ID правила доступа', 'ID состояния карточки']],
on='ID правила доступа',
how='left'
)
# Добавление подробностей о правилах доступа,
# в том числе разрешений
df = pd.merge(
df,
kr_permissions.sort_values('ID правила доступа'),
on='ID правила доступа',
how='left'
)
# Создание строкового поля со всеми данными объекта
# для векторного анализа
df = values_tolist(df, 'values_tolist', [
'ID типа карточки', 'ID состояния карточки',
'Создание карточки', 'Чтение карточки',
'Редактирование карточки', 'Добавление файлов',
'Редактирование собственных файлов', 'Редактирование файлов',
'Удаление собственных файлов', 'Удаление всех файлов',
'Инициация типового процесса отправки задач',
'Редактирование маршрута', 'Пропуск этапов', 'Полный пересчет маршрута',
'Подписание файлов', 'Ручное редактирование номера',
'Создание шаблона и копирование', 'Создание резолюций',
'Подписка на уведомления', 'Права супермодератора', 'Создание обсуждений',
'Редактирование своих сообщений', 'Редактирование всех сообщений',
'Чтение обсуждений', 'Чтение и отправка сообщений'
])
# Изменение порядка столбцов
df = df.iloc[:,[
0, 1, 2, 3, 4, 5, 10, 6, 7, 8, 9,
11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39
]]
# Присвоение собственных индексов датафрейму
#df = df.reset_index(drop=True)
# Векторный анализ чанки сотрудника
df1 = simple_vector_analisis_long_format(
df[['ID типа карточки', 'ID состояния карточки', 'values_tolist']],
'values_tolist', 5
)
# Сравнение исходных и сопоставленных правил доступа
df3 = access_rules_comparisons(df, df1)
# Сохранение чанки пользователя
# и результатов сравления в файлы
user_name = user_data[user_data['ID пользователя'] == i]['Имя пользователя'].values[0]
df.iloc[:, :-1].to_excel(f'users/{user_name} ({i}).xlsx')
if len(df1) > 0 and len(df3) > 0:
df3.to_excel(f'users/{user_name} ({i}, сопоставление).xlsx')
print()
print('=='*5, user_data[user_data['ID пользователя'] == i]['Имя пользователя'].values[0], f'(ID: {i})', '=='*5)
print()
print('-'*5, f'Чанка данных пользователя (количество объеков: {len(df)})', '-'*5)
display(df.iloc[:, :-1].head(5))
if len(df1) > 0:
print()
print('-'*5, f'Вескторные расстояния (количество объектов: {len(df1)})', '-'*5)
display(df1.head(5))
if len(df3) > 0:
print()
print('-'*5, f'Сопоставленные разрешений (количество объектов: {len(df3)})', '-'*5)
display(df3.head(5))
# Принудительная остановка расчетов для теста
if n == 4: break
else: n = n + 1
========== Петрова М.Б. (ID: fac7bf2e-a803-4b9d-acb0-83776c41f2ac) ========== ----- Чанка данных пользователя (количество объеков: 94) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID типа карточки | Тип карточки | ID состояния карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 74f58bdb-e07b-49dd-b171-da1b87180aff | Правило 175 | 73efdd18-96a0-48de-be66-560f4bb2de79 | Служебная записка | 4061e826-3531-4462-b826-40b7ba2f99c6 | … | False | True | True | False | False | False | False | False | False | False |
| 67 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | NaN | NaN | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 66 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | NaN | NaN | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 65 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | NaN | NaN | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 64 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | af63229f-8e43-4643-8dfe-87460da58b10 | Правило 62 | 52f6e9dc-a4d2-4e83-90b4-570462792dfa | Счёт | c3c533b7-645f-4c1d-9799-95f338586213 | … | False | False | False | False | False | False | False | False | False | False |
5 rows × 39 columns
----- Вескторные расстояния (количество объектов: 470) -----
| Исходный индекс | Исходное значение | Сопоставленный индекс | Сопоставленное значение | Тип расстояния | Расстояние | |
|---|---|---|---|---|---|---|
| 2 | 0 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | 67 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | Косинусное | 1.0 |
| 3 | 0 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | 66 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | Косинусное | 1.0 |
| 4 | 0 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | 65 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | Косинусное | 1.0 |
| 5 | 0 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | 64 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | Косинусное | 1.0 |
| 8 | 67 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | 65 | __0 73efdd18-96a0-48de-be66-560f4bb2de79\n… | Косинусное | 1.0 |
----- Сопоставленные разрешений (количество объектов: 470) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID сопоставленной роли | Название сопоставленной роли | Тип сопоставленной роли | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | Расстояние | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 74f58bdb-e07b-49dd-b171-da1b87180aff | Правило 175 | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | … | False | False | True | True | True | True | True | True | True | 1.0 |
| 1 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 74f58bdb-e07b-49dd-b171-da1b87180aff | Правило 175 | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | … | False | False | True | True | True | True | True | True | True | 1.0 |
| 2 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 74f58bdb-e07b-49dd-b171-da1b87180aff | Правило 175 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | … | False | True | True | True | True | True | True | True | True | 1.0 |
| 3 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 74f58bdb-e07b-49dd-b171-da1b87180aff | Правило 175 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | … | False | True | True | True | True | True | True | True | True | 1.0 |
| 4 | fac7bf2e-a803-4b9d-acb0-83776c41f2ac | Петрова М.Б. | fa0be277-8a2a-49a8-a051-1ba40d6e8685 | Руководство | 2 | 5b5e2e25-2fe8-4f25-a283-cb0d3407a80b | Правило 29 | 8212cc85-3fb3-4587-ac6b-152366901c02 | Согласующий финансовых документов | 0 | … | True | False | True | True | True | True | True | True | True | 1.0 |
5 rows × 37 columns
========== Герасимова Р.И. (ID: a37dc52c-0868-4af4-9537-94718eb438a9) ========== ----- Чанка данных пользователя (количество объеков: 3) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID типа карточки | Тип карточки | ID состояния карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | e6ba32b1-239d-475a-988a-95ea2b663877 | Входящий | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 1 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | 9cdbc874-1915-4dd6-a079-3a1bdedfc225 | Исходящий | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 2 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | 52f6e9dc-a4d2-4e83-90b4-570462792dfa | Счёт | NaN | … | True | False | False | False | False | False | False | False | False | False |
3 rows × 39 columns
----- Вескторные расстояния (количество объектов: 9) -----
| Исходный индекс | Исходное значение | Сопоставленный индекс | Сопоставленное значение | Тип расстояния | Расстояние | |
|---|---|---|---|---|---|---|
| 3 | 0 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | 1 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | Косинусное | 1.0 |
| 7 | 1 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | 0 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | Косинусное | 1.0 |
| 2 | 0 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | 2 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | Косинусное | 1.0 |
| 6 | 1 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | 2 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | Косинусное | 1.0 |
| 10 | 2 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | 0 | __0 e6ba32b1-239d-475a-988a-95ea2b663877\n1… | Косинусное | 1.0 |
----- Сопоставленные разрешений (количество объектов: 9) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID сопоставленной роли | Название сопоставленной роли | Тип сопоставленной роли | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | Расстояние | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 1 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 2 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 3 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 4 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | 2bd4a610-8a20-46bc-ab04-c38c589de09f | Правило 99 | a37dc52c-0868-4af4-9537-94718eb438a9 | Герасимова Р.И. | 1 | … | True | True | True | True | True | True | True | True | True | 1.0 |
5 rows × 37 columns
========== Морозова Р.Т. (ID: d6ed545a-c1c6-4ca4-8514-6f2be3b17198) ========== ----- Чанка данных пользователя (количество объеков: 1) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID типа карточки | Тип карточки | ID состояния карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | 1 | 6cd7278b-eff2-4623-a049-24cb4c7a7b17 | Правило 133 | 52f6e9dc-a4d2-4e83-90b4-570462792dfa | Счёт | NaN | … | False | False | False | False | False | False | False | False | False | False |
1 rows × 39 columns
----- Вескторные расстояния (количество объектов: 1) -----
| Исходный индекс | Исходное значение | Сопоставленный индекс | Сопоставленное значение | Тип расстояния | Расстояние | |
|---|---|---|---|---|---|---|
| 1 | 0 | __0 52f6e9dc-a4d2-4e83-90b4-570462792dfa\nN… | 0 | __0 52f6e9dc-a4d2-4e83-90b4-570462792dfa\nN… | Косинусное | inf |
----- Сопоставленные разрешений (количество объектов: 1) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID сопоставленной роли | Название сопоставленной роли | Тип сопоставленной роли | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | Расстояние | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | 1 | 6cd7278b-eff2-4623-a049-24cb4c7a7b17 | Правило 133 | d6ed545a-c1c6-4ca4-8514-6f2be3b17198 | Морозова Р.Т. | 1 | … | True | True | True | True | True | True | True | True | True | inf |
1 rows × 37 columns
========== Соколова О.О. (ID: 5e4a0e2f-fcdc-4eff-90cb-6f68a9e5eaaa) ========== ----- Чанка данных пользователя (количество объеков: 1) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID типа карточки | Тип карточки | ID состояния карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 5e4a0e2f-fcdc-4eff-90cb-6f68a9e5eaaa | Соколова О.О. | 3c11cde8-9099-4e56-baca-a93d763dce61 | IT-отдел | 2 | 2e9e7d07-49fd-450a-a3ec-b2e306bb9d2f | Правило 80 | NaN | NaN | NaN | … | False | False | False | False | False | False | False | False | False | False |
1 rows × 39 columns
----- Вескторные расстояния (количество объектов: 1) -----
| Исходный индекс | Исходное значение | Сопоставленный индекс | Сопоставленное значение | Тип расстояния | Расстояние | |
|---|---|---|---|---|---|---|
| 1 | 0 | __0 NaN\nName: ID типа карточки, dtype: obj… | 0 | __0 NaN\nName: ID типа карточки, dtype: obj… | Косинусное | inf |
----- Сопоставленные разрешений (количество объектов: 1) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID сопоставленной роли | Название сопоставленной роли | Тип сопоставленной роли | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | Расстояние | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 5e4a0e2f-fcdc-4eff-90cb-6f68a9e5eaaa | Соколова О.О. | 3c11cde8-9099-4e56-baca-a93d763dce61 | IT-отдел | 2 | 2e9e7d07-49fd-450a-a3ec-b2e306bb9d2f | Правило 80 | 3c11cde8-9099-4e56-baca-a93d763dce61 | IT-отдел | 2 | … | True | True | True | True | True | True | True | True | True | inf |
1 rows × 37 columns
========== Голубева К.Д. (ID: 7159e86f-0694-4a40-bcfc-8f0fcda0024c) ========== ----- Чанка данных пользователя (количество объеков: 41) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID типа карточки | Тип карточки | ID состояния карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | NaN | NaN | NaN | … | True | False | False | False | False | False | False | False | False | False |
| 22 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | b60fd2ba-d8d4-4f36-aef7-98b46c942f02 | Правило 2 | NaN | NaN | c3c533b7-645f-4c1d-9799-95f338586213 | … | False | False | False | False | False | False | False | False | False | False |
| 23 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | b60fd2ba-d8d4-4f36-aef7-98b46c942f02 | Правило 2 | NaN | NaN | c3c533b7-645f-4c1d-9799-95f338586213 | … | False | False | False | False | False | False | False | False | False | False |
| 24 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | b60fd2ba-d8d4-4f36-aef7-98b46c942f02 | Правило 2 | NaN | NaN | c3c533b7-645f-4c1d-9799-95f338586213 | … | False | False | False | False | False | False | False | False | False | False |
| 25 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 93be1184-ca98-4e85-b400-7b5ec580d00a | Правило 135 | NaN | NaN | NaN | … | False | False | False | False | False | False | False | False | False | False |
5 rows × 39 columns
----- Вескторные расстояния (количество объектов: 205) -----
| Исходный индекс | Исходное значение | Сопоставленный индекс | Сопоставленное значение | Тип расстояния | Расстояние | |
|---|---|---|---|---|---|---|
| 3 | 0 | __0 NaN\n… | 2 | __0 NaN\n… | Косинусное | 1.0 |
| 4 | 0 | __0 NaN\n… | 23 | __0 NaN\n… | Косинусное | 1.0 |
| 5 | 0 | __0 NaN\n… | 24 | __0 NaN\n… | Косинусное | 1.0 |
| 8 | 22 | __0 NaN\n… | 0 | __0 NaN\n… | Косинусное | 1.0 |
| 9 | 22 | __0 NaN\n… | 23 | __0 NaN\n… | Косинусное | 1.0 |
----- Сопоставленные разрешений (количество объектов: 205) -----
| ID пользователя | Имя пользователя | ID роли | Название роли | Тип роли | ID правила доступа | Название правила доступа | ID сопоставленной роли | Название сопоставленной роли | Тип сопоставленной роли | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | Расстояние | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 1 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 2 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 34ec5d3a-c625-497d-b5b4-98cb16a1c5c5 | Правило 157 | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 3 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 93be1184-ca98-4e85-b400-7b5ec580d00a | Правило 135 | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | … | True | True | True | True | True | True | True | True | True | 1.0 |
| 4 | 7159e86f-0694-4a40-bcfc-8f0fcda0024c | Голубева К.Д. | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | 93be1184-ca98-4e85-b400-7b5ec580d00a | Правило 135 | 65839cfa-cede-4a0b-a2d7-6e10563f9441 | Контролер качества | 0 | … | True | True | True | True | True | True | True | True | True | 1.0 |
5 rows × 37 columns
