Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

Анализ предоставленных разрешений в Tessa

Анализ предоставленных разрешений в Tessa
Системы

По мере роста информационной системы (далее ИС) и количества ее пользователей в ней ощутимо увеличивается количество выданных разрешений. Усложнение ролевой модели, увеличение количества условий и объектов в ИС усложняет предоставление пользователям уникальных разрешений. Поэтому, в общей концепции анализа модели предоставления прав в ИС важную роль играет анализ предоставленных разрешений. Проведение этого анализа путем группировки для упрощения анализа с помощью групп, а не отдельных разрешений, практически лишено смысла из-за наличия множества уникальных разрешений. Однако, анализ возможен путем сравнения векторов предоставленных разрешений. Далее представлен подобный метод анализа на примере предоставленных разрешений в 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)+'%'

Загрузка библиотек¶

In [7]:
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

Загрузка данных¶

In [9]:
# Данные из таблицы 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
Out[9]:
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

In [10]:
# Данные из таблицы 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
Out[10]:
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 Согласующий финансовых документов
In [11]:
# Данные из таблицы 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
Out[11]:
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 Входящий
In [12]:
# Данные из таблицы 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
Out[12]:
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 На подписании
In [13]:
# Данные из таблицы 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
Out[13]:
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 Запрещено удалять
In [14]:
# Данные из таблицы 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
Out[14]:
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
In [15]:
# Данные из таблицы 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
Out[15]:
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 …

Предобработка данных¶

In [17]:
# Создание отдельного датафрейма с ФИО и 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
Out[17]:
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 Алексеева Р.Д.

Векторный анализ¶

Возможные варианты решения:

  1. Базовое решение: объединение данных о правилах, разрешениях, типах и состояниях карточек, ролях и сотрудниках.
  2. Решение для большого количества данных: разделение всего массива данных на отдельные чанки в виде датафреймов по ролям, с последующим сохранением их в файлы. Одна роль — одна чанка — один датафрейм — один файл.
  3. Решение для очень большого количества данных: разделение всего массива данных на отдельные чанки в виде датафреймов по сотрудникам, с последующим сохранением их в файлы. Один сотрудник — одна чанка — один датафрейм — один файл.

Потребность в анализе предоставленных разрешений появляется при значительном росте ИС, при котором образуется очень большое количество данных для анализа. Исходя из этого, далее будет использовано разделение данных для анализа на чанки по сотрудникам.

Функции для векторного анализа¶

In [21]:
# Функция создания поля чанки для векторного анализа
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
In [22]:
# Функция векторного анализа (с использованием индексов строк)
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
In [23]:
# Функция сравнения исходных и сопоставленных разрешений
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
In [24]:
# Добавление ссылок на карточки ролей и правил доступа
# на основе имеющихся идентификаторов
def links_to_card(df, cols, base_link='tessa://tessaclient.tessa/?Action=OpenCard&ID='):
    df[cols] = base_link + df[cols]
    return df

Проведение векторного анализа чанками по сотрудникам¶

In [26]:
# Решение для очень большого количества данных (разделение всего массива данных на отдельные датафреймы и потом файлы по сотрудникам)

# Создание отдельного датафрейма для каждого пользователя
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

In [ ]:
 

анализ информационная система корпоративная информационная система практика

Предыдущая статьяУдаленная диагностика сети

Рубрики

Метки

abc abcd AI-Ready платформа Data Lakehouse ELT excel ms sql pandas PostgreSQL PowerShell Python sql tessa VBA xyz анализ виртуальный помощник гибридное хранилище данных данные знания информационная система информация кластерный анализ комбинаторика компетенции корпоративная информационная система маркетинг математика медальон-архитектура модель предоставления прав мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель сеть; теория теория вероятностей тесса тест юмор языки программирования

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)