Красноярск - наше место силы

Оператор Матвей Никитин.

1

Учимся смотреть от лица бота

Учимся смотреть от лица бота

Смотрим диалоги от лица бота в телеграм!

И снова тренировка!!!Оттачиваем навыки

😁😉

И снова тренировка!!!

Оттачиваем навыки 🔤🔤

1

«ВнеУрока» и Гимназия №2: история одной школьной забавы

Гимназия №2 г. Раменское – это место, где я провел треть своей жизни. В этой школе я учился 11 классов, оставался после уроков, творил, пробовал себя в новых хобби, экспериментировал – в общем, занимался тем, чем хочется заниматься любопытным школьникам. С гимназии начался мой путь дизайнера. Именно здесь я участвовал в своем первом кейсе — в творч…

«ВнеУрока» и Гимназия №2: история одной школьной забавы
8

Из PDF в Excel, когда не все так просто…

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

Разные шаблоны документов затрудняют процесс извлечения данных и…

9

Использование алгоритма COPOD для поиска аномалий

С каждым годом data driven подход становится все более популярным. Объем данных увеличивается вместе с потребностью извлечения полезной информации из бесконечного потока данных. Передовые компании мира все чаще используют машинное обучение для обнаружения инсайтов и аномалий в больших данных.

Хочу поделиться опытом использования алгоритма CO…

2

Сравнение инструментов для Graph Mining

Graph Mining – одно из направлений интеллектуального анализа данных, в котором объемные комплексные данные представлены в виде графов. Задачей Graph Mining является обнаружение в графе типовых шаблонов. Общепринятым видом таких шаблонов являются часто встречающиеся подграфы. В области Data Science и аналитике также используются графы для моделирова…

4
):\n df = pd.read_excel(filename)\n if df.empty: # если пустой файл то записываем в пустые\n empty.append(filename)\n continue\n df.dropna(how='all', inplace=True)\n df.reset_index(drop=True, inplace=True)\n cols = list(df.columns) #выделяем колонки из таблицы в файле\n cols = clean(cols)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Далее удаляем ненужные поля (для примера допустим, что в шаблоне dd_eirs_2 присутствует столбец 'Акт сдачи-приемки')

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"if 'Акт сдачи-приемки' in df.columns[0]:\n df.drop(df.columns[0], axis=1, inplace=True)\n df.columns = df.loc[0]\n df = df[1:]\n cols = list(df.columns)\n cols = clean(cols)\n if cols == dd_eirs_2: #смотрим подходят ли колонки каждому шаблону\n for i in df.index:\n if 'ИТОГО (' in str(df.loc[i, 'ИТ-услуга ТП']):\n df = df[:i]\n break\n df.columns = cols\n df['filename'] = os.path.basename(filename)\n df_eirs = pd.concat([df_eirs, df]) #если установили соответствие с шаблоном то записываем в общий файл\n find.append(filename)\n elif cols == dd_eirs_1: # если шаблону не подошло то сравниваем с другими\n for i in df.index:\n if 'ИТОГО (' in str(df.loc[i, 'ИТ-услуга ТП']):\n df = df[:i]\n break\n df.columns = cols\n df['filename'] = os.path.basename(filename)\n df_eirs = pd.concat([df_eirs, df])\n find.append(filename)\n else … #<обработка других шаблонов>","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В результате получили сводную таблицу для проведения дальнейшего анализа:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"886df1d7-f645-5124-a5f3-089328b166e7","width":725,"height":175,"size":17789,"type":"png","color":"e2e3df","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAQUGCf/EAB8QAAIBBAMBAQAAAAAAAAAAAAECAwAEBRESMVEhcf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAMAwEAAhEDEQA/AND8nPkbPMPYw3960PFW3vZHwHvkPfKkqIMXBLBHIL+8YOgYEy6J2PymgLrGY2e7NxNj7aSXiBzaJS3XpG6CZQokcSRxqFVVAVQNAADoVB//2Q=="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Второй способ - поиск паттернов в шаблонах.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Данный способ позволяет выделять общие паттерны в каждом документе. Главное отличие от предыдущего способа заключается в том, что не надо обрабатывать каждый шаблон отдельно, а можно использовать набор функций, который поможет извлечь нужную информацию из значительного объёма документов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

О применении данного способа расскажем на примере обработки 2-х заказ-нарядов на ремонт автомобиля, оформленных по разным шаблонам. Задача: узнать у каких машин, когда были совершены ремонтные работы, а также детальную информацию по работам (детали, их количество, вид работ, стоимость и т.д.).

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"a828bf9d-2d5b-56fe-b5b2-3ed77b52ae3c","width":1045,"height":641,"size":306781,"type":"png","color":"d3d0d0","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQMJ/8QAIhAAAgEDAwUBAAAAAAAAAAAAAQIDAAQRBhIxBSEjJFFh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEDBP/EABoRAAIDAQEAAAAAAAAAAAAAAAABAhESIUH/2gAMAwEAAhEDEQA/ANErXrnpvfxaVgjMY3B45WBBP4V5rO68OrKk60WR9RMisYLjJAJ81LZMwBEd57pxO7SBoxncc55+1RFtPgTJdXSuyrcygAkABz2oSz//2Q=="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Можно заметить, что в документах есть вся нужная информация, но представлена она в разных форматах (столбцы называются по-разному, номер машины расположен в разных местах листа, в одном случае отсутствует номер договора и т.д.). Соответственно, нельзя просто извлечь и соединить таблицы из этих документов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

При обработке данных вторым способом мы использовали другой алгоритм действий:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- из каждого документа извлекался весь текст, т.к. часть нужной информации находится вне таблицы. Для этого использовали регулярные выражения.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Отметим, что для таких данных, как номер автомобиля или номер заказа, написать общие регулярные выражения несложно.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"def get_info_from_pdf(row):\n try:\n f = fitz.open(row['FilePath'])\n text = ''\n for page in f:\n text += page.get_text()\n text = text.lower()\n text = re.sub(r'\\n', ' ', text)\n#выделяем текст из файла, в тексте ищем интересующую нас информацию с помощью регулярных выражений\n zakaz = re.findall(r'(заказ-наряд)|(наряд-заказ)|(заказ-наряда)|(наряд-заказа)|(наряд-заказу)|(заказ-наряду)', text)\n if len(zakaz)==0:\n if len(re.findall(r'пробег\\D*\\d+', text))!= 0:\n row['Пробег'] = re.findall(r'пробег\\D*\\d+', text)[0]\n if len(re.findall(r'sd\\d+', text)) != 0: \n row['Номер SD'] = re.findall(r'sd\\d+', text)[0]\n return row\n except:\n return row","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- с помощью Python в документах были найдены и извлечены все таблицы;

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- для идентификации данных по каждой колонке проводился поиск ключевого слова. Если слово найдено, то информация из столбца записывалась в соответствующий столбец сводной таблицы.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"def extract_table(o):\n table = tables[o].df\n table.columns = [ str(x).lower().translate(str.maketrans('','',string.punctuation)) for x in table.columns] # выделяем названия колонок в таблице\n df = pd.DataFrame()\n for i in table.columns: #итерируемся по каждой колонке\n for j in range(len(table)):\n data = str(table[i][j]).lower().translate(str.maketrans('','',string.punctuation))\n data = [i] + data.split()\n for d in data:\n\t\t#смотрим встречается ли в данных колонки слова маркеры нужных нам данных\n if d in ['код']:\n df[\"Код\"] = table[i] # если нужный маркер найден, то данные из колонки записываются в соответствующую колонку общего файла\n if d in ['наименованиие', 'работ', 'работы', 'услуги', 'услуг', 'услуга']:\n df[\"Работы\"] = table[i]\n if d in ['время']:\n df[\"Время\"] = table[i]\n if d in ['нч']:\n df[\"Н/ч\"] = table[i]\n if d in ['колво','кол']:\n df[\"Кол-во\"] = table[i]\n if d in ['цена']:\n df[\"Цена\"] = table[i]\n if d in ['сумма']:\n df[\"Сумма\"] = table[i].drop([j])\n return df.dropna(how='any')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В результате была получена следующая таблица для проведения дальнейшего анализа:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"3ac57b62-0654-5e1b-be3d-2b287db3cc70","width":868,"height":157,"size":49970,"type":"png","color":"d7d7d4","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAgUHCf/EACIQAAEDBAICAwAAAAAAAAAAAAECAxEABAUSBiETMVGRwf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A0ZxuYzPIH/E9fPY/xIK5t9Rt3EK3CgfnqPygSXnI+TJu30t5K5SkOKCQnWAJ9CRUVQYEzHdVAFtskktp+qD/2Q=="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Оба способа имеют свои плюсы и минусы.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Для первого способа характерна бОльшая точность выходных данных. Однако, он требует проведения ручного анализа.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Для второго способа использование регулярных выражений позволяет снизить трудозатраты. Поиск подходящего выражения или ключевого слова занимает не так много времени, является более универсальным и не требует доработки при добавлении новых вариантов документов. Однако, при применении данного инструмента, могут встречаться некоторые артефакты выходных данных (например, номер машины: ъ000уъ00, дата договора 20.07.2024 и т.д.), которые могут усложнить дальнейший анализ.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

При анализе 100 пакетов документов, содержащих разнородные таблицы, я получил следующую статистику:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"c5f71589-f1e4-5193-8932-acbfc957d450","width":983,"height":215,"size":16403,"type":"png","color":"0e0e0e","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAJQAlAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAKAAoBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAABQQJ/8QAJRAAAgEDAwIHAAAAAAAAAAAAAQIDAAQRBQYhEzEUIjIzQVFh/9oACAEBAAA/ANJLTburxW8oudw3rSzAxIXn9vv5sA4J7fNRHb25VJUazqjAcZ8SnP766VtFVIFVFCjqMcAY5yaLmtLUzOTbREliSSg+6//Z"}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Как видно из сравнительной таблицы, ручная обработка даёт высокую точность обработки данных, но требует большего количества времени, чем поиск паттернов. Очевидно, чем более однородные таблицы приводятся к единому виду, тем выше точность данных и скорость обработки.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В дальнейшем данные подходы хотим применить для создания более сильного инструмента, который позволит пользователю автоматически группировать всю нужную информацию, задавая лишь путь до документов и вид таблиц, который ему нужен.

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":0,"reposts":0,"views":1106,"hits":10451,"reads":null,"online":0},"dateFavorite":0,"hitsCount":10451,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id447345/862553-iz-pdf-v-excel-kogda-ne-vse-tak-prosto","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":9}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":384002,"customUri":null,"subsiteId":447345,"title":"Использование алгоритма COPOD для поиска аномалий","date":1648021464,"dateModified":1648021464,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

С каждым годом data driven подход становится все более популярным. Объем данных увеличивается вместе с потребностью извлечения полезной информации из бесконечного потока данных. Передовые компании мира все чаще используют машинное обучение для обнаружения инсайтов и аномалий в больших данных.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Хочу поделиться опытом использования алгоритма COPOD в рамках аудита интеллектуального управления электропитанием устройств предприятия. Целью поставленной задачи был поиск возможностей по оптимизации потребления электроэнергии и сокращения расходов в рамках ESG-стратегии.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Основные достоинства алгоритма:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- Скорость работы

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- Легкость интерпретации

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- Возможность использовать алгоритм без обучающих данных

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

- Возможность обучения алгоритма на поиск аномалий по шаблонам

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

COPOD находится внутри пакета PyOD (https://github.com/yzhao062/pyod).

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Данные:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

200 тысяч единиц техники. В рамках политик управления электропитанием устройств к различным типам техники (ПК, ЖК-панели и т.п.) применяется свой уникальный план электропитания. В каждом плане свои особенности и настройки, где регулируется перевод в спящий режим, гибернация, отключения экранов, временные интервалы переходов из одного режима в другой.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В столбце «тип_устройства_подр» под каждой цифрой имеется в виду один тип устройств (например, 0 - ПК, 1 - ЖК-панель, 3 - Кондиционер и т.п.). Столбец «ночные _режимы» содержит ночной план электропитания для каждого типа устройств (например, 8 - ПК, 1 - ЖК-панель, и т.п.). «Срок_непрерывной_работы» содержит класс периода бесперебойной работы (например, 0 – неделя, 1 – месяц, и т.п.).

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"83e51eae-f96a-5d0e-850b-f3d0b3c77cd7","width":980,"height":366,"size":15137,"type":"png","color":"f3f2f2","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Применение:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"# Импортируем библиотеку\nfrom pyod.models.copod import COPOD\nsearcher = COPOD()","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В данном случае у нас нет шаблонов аномалий, следовательно, мы будем использовать функцию поиска decision_function:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"data_times_anom['anomalies'] = searcher.decision_function(data_times_anom)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Визуально исследуем результат детекции аномалий (синий – норма, оранжевый – аномалия):

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"sns.pairplot(data_times_anom, hue='anomalies', diag_kind='hist')","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"fa23e975-1bd1-5cb4-a704-1dc80f63fc65","width":827,"height":370,"size":26543,"type":"png","color":"e1d9d8","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Как видим, на изображении в данных имеется большой набор аномалий по всем признакам. Черные точки – это нормальное (типичное) состояние. Например, для устройств класса 0 – нормальный режим работы – 8,6. На гистограмме справа видно, что самое большое количество устройств работают в режиме 8, однако, так же видно, что на диаграмме присутствуют и аномальные устройства в режиме 8 и не только. На графике слева видно, что в режиме 8 так же работают и другие типы устройств (так быть не должно согласно нормативным документам). Для более глубокого понимания так же можно рассмотреть каждый тип устройств в отдельности.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Алгоритм позволяет глубже разобраться в данных и выяснить, по какой причине то или иное устройство идентифицируется алгоритмом, как аномалия. Для этого используем функцию explain_outlier

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Разделим данные на выборки\ny = data_times_anom['anomalies']\nX = data_times_anom.drop('anomalies', axis=1)\n\n#Создадим классификатор и обучим его\nclf = COPOD()\nclf.fit(X)\n\n#Будем использовать флаг аномальности\noutliers = np.where(y==1)[0]\n\n#Построим график\nfor anomalies in outliers:\n\tclf.explain_outlier(anomalies, cutoffs=None, feature_names=X.columns)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Синим цветом обозначены оценки выбросов. По оси X отложены признаки, по Y – оценка аномалии. Оранжевым и зеленым – оценки аномалий в 90-м и 99-м процентилях. На изображении 1 видим, что устройство по признаку 3 (ночной режим) превышает 90-ый процентиль и граничит с 99, данный факт является основанием пометить данное устройство, как аномальное. На других изображениях схожие ситуации, но с другими устройствами и по другим признакам.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"715f32ff-3780-5a51-9ece-2c2ad98cf2aa","width":702,"height":518,"size":32016,"type":"png","color":"d2d3ce","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Для построения гипотез требуется более глубокое исследование аномалий в конкретных признаках. Выгрузим срез данных по двум признакам:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Смотрим срез по данным\ndata_times_anom[data_times_anom['anomalies']==1][['тип_устройства_подр', 'ночные_режимы']].value_counts().head(60)","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"77753a4f-4e23-57b8-bcdb-1873bd1cd19d","width":804,"height":497,"size":21043,"type":"png","color":"2bb452","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Из среза следует подтверждение аномалий: устройства типа 0 имеют режимы работы 8 (31 280 единиц техники), 0 (7007 единиц техники), 4 (4171 единица техники), 1 (1939 единиц техники). ПК работают в режимах: ПК, Сервера, Устройства видеонаблюдения, ЖК-дисплей. Так же дела обстоят с устройствами типа 8. Уточнять допустимость работы устройства в «чужом» режиме необходимо у ответственных подразделений. В рамках данного исследования мы решали задачу детекции аномалий в режимах работы и устройствах.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Правильная настройка и эффективное управление электропитанием позволяет снизить расходы на электроэнергию, что в свою очередь может сэкономить до 20% бюджета, затрачиваемого на электричество.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

COPOD является быстрым, мощным, со сложной математикой под капотом и простым в использовании на практике алгоритмом, с возможностью адаптировать его под большое количество признаков и различные типы задач детекции аномалий и выбросов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Источники:

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

· pyod/copod_example.py в ветке master · yzhao062/pyod · GitHub (https://github.com/yzhao062/pyod/blob/master/examples/copod_example.py)

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

· [2009.09463] COPOD: Copula-Based Outlier Detection (arxiv.org) (https://arxiv.org/abs/2009.09463)

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":0,"reposts":0,"views":16,"hits":860,"reads":null,"online":0},"dateFavorite":0,"hitsCount":860,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id447345/384002-ispolzovanie-algoritma-copod-dlya-poiska-anomalii","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":2}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":347023,"customUri":null,"subsiteId":447345,"title":"Сравнение инструментов для Graph Mining","date":1642059528,"dateModified":1642059528,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

Graph Mining – одно из направлений интеллектуального анализа данных, в котором объемные комплексные данные представлены в виде графов. Задачей Graph Mining является обнаружение в графе типовых шаблонов. Общепринятым видом таких шаблонов являются часто встречающиеся подграфы. В области Data Science и аналитике также используются графы для моделирования многих задач.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Одной из популярных библиотек Python для построения графов является NetworkX. Она написана на языке Python, служит для создания, обработки, анализа и визуализации графов с помощью Matplotlib.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Основные особенности NetworkX:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["возможность работы с разными видами графов (простые, ориентированные и др.);","работа со всеми распространенными форматами для хранения графов;","работа с любой структурой данных для создания узлов (из текстовых данных, изображений или XML-файлов);","есть возможности расчета множества характеристик: высоты, диаметра, радиуса и др.;","визуализация объемных и плоских графиков."],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Разработчики NetworkX заявляют, что библиотека способна работать с большими графами (10 000 000 узлов, 100 000 000 ребер).

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Рассмотрим использование NetworkX на Python на примере обезличенных данных по обучающим курсам, которые прошли сотрудники и их должностям.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Импортируем библиотеки\nimport pandas as pd\nimport networkx as nx\nimport matplotlib.pyplot as plt\n\n#Загружаем наши данные\ndf = pd.read_excel('Данные.xlsx')","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"65e714f6-be5e-5d1c-8315-e6cbbb976cd8","width":604,"height":573,"size":50759,"type":"png","color":"eff0f1","hash":"","external_service":[]}}}]}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Создаем экземпляр класса\ngraph = nx.Graph()\n\n#Задаем вершины\ncourse_list=df['Курс '].unique()\nfor c in course_list:\n G.add_node(c, title=c,lable=c, color='blue')\nprof_list=df['Должность'].unique()\nfor p in prof_list:\n G.add_node(p, title=p,lable=p, color=PROFF_COLOR)\nid_list=df['id сотрудника'].unique()\nfor i in id_list:\n G.add_node(i, title=i,lable=i, color=ID_COLOR)\n\n#Смотрим сколько получилось вершин\nG.number_of_nodes()","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"091b99e8-5f76-5994-b0e9-59bff6f8eb04","width":624,"height":69,"size":3170,"type":"png","color":"eeeded","hash":"","external_service":[]}}}]}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Пишем цикл для создания ребер\nfor i in id_list: \n for c in course_list:\n G.add_edge(c, i, color='black')\n for p in prof_list:\n G.add_edge(i, p, color='black')\n\n#Рисуем граф\nnx.draw(G)","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"d58736dc-f6cc-5346-8ab8-d52d71f33c91","width":624,"height":360,"size":38364,"type":"png","color":"3f5763","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

PyViz – библиотека Python, которая предназначена для быстрого создания визуальных сетевых графиков с минимальным кодом на Python, имеет интеграцию с NetworkX.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Построим граф с помощью pyviz на тех же данных (требуется интернет соединение):

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"# Импортируем библиотеку\nfrom pyvis.network import Network\n\n#Создаем граф на тех же данных из датафрейма\nnet = Network(notebook=True)\ncourse_list=df['Курс'].unique()\nfor c in course_list:\n net.add_node(c)\nprof_list=df['Должность'].unique()\nfor p in prof_list:\n net.add_node(p)\nid_list=df['id сотрудника'].unique()\nfor i in id_list:\n net.add_node(i)\nfor i in id_list:\n for c in course_list:\n net.add_edge(c, i)\n for p in prof_list:\n net.add_edge(i, p)\nnet.show_buttons(filter_=True)\nnet.show('example.html')","lang":""}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"faef7d8e-3653-5d90-9dca-8ad418b4fafd","width":529,"height":271,"size":15784,"type":"png","color":"e5e8ec","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Файл ‘example.html’ сразу сохраняется в ту же директорию, и его можно открывать как страничку в интернете вот в таком удобном виде и менять настройки:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"056677dd-4286-5356-9664-79c1c8379adf","width":624,"height":332,"size":32975,"type":"png","color":"e4ebed","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Для визуализации графов существует множество программ: Gephi, Graphviz и др.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Чаще на практике используютGephi. Она написана на языке Java, позволяет манипулировать элементами графов с помощью мыши. Помимо визуализации есть возможность вычисления статистических характеристик графа и преобразование топологии.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вот как выглядит граф на тех же данных, визуализированный в Gephi:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"fa6c14a8-7ebf-5813-99f5-eb2bae09cd5b","width":551,"height":293,"size":18691,"type":"png","color":"e9e9ea","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"7812f5ad-4fc9-5f87-afaa-693c7d9ee9bb","width":553,"height":296,"size":35899,"type":"png","color":"e0e1e4","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Итак, можно сформировать сравнительную таблицу всех этих библиотек:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"467ac4e7-b32c-523b-8892-69b16af899d2","width":1155,"height":617,"size":44139,"type":"png","color":"f3f3f1","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Таким образом, если вы впервые занялись построением графа или пользовались только какой-либо одной библиотекой при построении, данная статья будет крайне полезна для понимания плюсов и минусов разных инструментов.

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":2,"reposts":0,"views":11,"hits":1682,"reads":null,"online":0},"dateFavorite":0,"hitsCount":1682,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id447345/347023-sravnenie-instrumentov-dlya-graph-mining","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764923267,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":4}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"ogTitle":null,"ogDescription":null,"isAnonymized":true}};