AAYMA
RU
Войти

Поток

AML-аналитика графа переводов: роли клиентов, кластеры Louvain, топ-50 для проверки, поиск цепочек переводов, 2D/3D-визуализация сети и ИИ-агент AML…

Рабочий MVP
Команда «Q.gen» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Q.gen
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP

Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)

Суть

AML-аналитика графа переводов: роли клиентов, кластеры Louvain, топ-50 для проверки, поиск цепочек переводов, 2D/3D-визуализация сети и ИИ-агент AML Graph Copilot с tool-calling.

Как устроено

Parquet-данные загружаются в DuckDB/SQLite, Python/NetworkX считает обороты, PageRank, роли и сообщества Louvain, выгружает CSV для жюри. FastAPI отдаёт досье, эго-сети, кластеры и трассировку потоков, фронтенд на Three.js рисует 2D/3D-граф, есть недельная динамика, повторяющиеся маршруты и PDF-справки по клиенту. Copilot вызывает инструменты get_node_info, find_common_recipients и get_cluster_summary через OpenAI или NVIDIA NIM, без ключа работает детерминированный локальный анализатор.

Ключевые решения

  • NetworkX
  • PageRank
  • Louvain
  • DuckDB
  • function calling
  • поиск хронологических цепочек переводов
  • анализ повторяющихся маршрутов
  • эго-сети

Метрики

46/46 тестов, 11/11 контрольных сценариев по шести ролям, полный расчёт 1,41 с

Особенности

Агент с тремя графовыми инструментами и детерминированным fallback без интернета, 3D-визуализация сети.

Стек

Python · FastAPI · Pydantic v2 · DuckDB · SQLite · NetworkX · Three.js · JavaScript · HTML/CSS · Streamlit

Модели

OpenAI API · NVIDIA NIM meta/llama-3.1-70b-instruct


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f4c7cd15-q-gen.

README

README.md

Объединённая версия проекта

Актуальные исходники и архив всей сборки: 2D/3D-граф + Python/FastAPI + Copilot + недельные сравнения + повторяющиеся маршруты + PDF.

cd finanse
python -m pip install -r requirements.txt
python run.py --serve

Открыть http://127.0.0.1:8765/. Без API-ключа Copilot работает на локальных правилах. Проверено: 46 Python-тестов и 6 JavaScript-тестов. Сведения об объединении.

Ниже сохранены описание и материалы команды.


Поток — аналитика финансовых связей

Локальный интерфейс на HTML/CSS/JavaScript и Three.js: обзор, полная 2D/3D-сеть, участники, кластеры, хронологические цепочки и список проверки. Аналитические формулы и CSV-схемы сохранены.

Готовый обновлённый проект · Исходный код · Инструкция · Фактические проверки

Из корня проекта:

cd finanse
python -m pip install -r requirements.txt
python run.py --serve

Откройте http://127.0.0.1:8765/. Нужен Python 3.12+. Для установки в отдельное окружение см. инструкцию. После установки Python-зависимостей интернет не требуется: локальный Three.js и данные включены. Node.js нужен только разработчику для подготовки библиотеки и JavaScript-тестов.

Исходный finanse.zip сохранён как архив первоначальной версии. Не распаковывайте его поверх обновлённого кода.

Методика и аналитика · Контрольные сценарии · Разбор случая logo

finanse — Поток: аналитика графа переводов

Скачать finanse.zip — весь проект отдельным архивом: 95 файлов, около 1,24 МБ. Распакуйте архив и откройте папку finanse.

Сценарий защиты · Схема решения · Доклад: Рамазан Кыдырманов

Исходный код · Контрольные сценарии · Законченный разбор

Код опубликован для просмотра отдельно. Для запуска распакуйте finanse.zip: он содержит исходные Parquet, базы данных и выгрузки.

Выгрузки для жюри: nodes_roles.csv · clusters.csv · top_nodes.csv.

Текущая проверка: 46/46 тестов (включая 9 тестов ИИ-агента Copilot), 11/11 контрольных сценариев всех шести ролей и 15 дополнительных проверок маршрутов UI/API; полный расчёт 1,41 с; высокопроизводительный REST API на FastAPI с автодокументацией Swagger (/docs), CORS и модулем ИИ-агента AML Graph Copilot. Запуск настроен на 0.0.0.0 для кроссбраузерной совместимости (Firefox/Chrome). Команда подтвердила, что для сдачи достаточно загрузки в этот GitHub.

🤖 AML Graph Copilot — Автономный ИИ-агент финансовой разведки

Архитектура ИИ-агента комплаенс-офицера с поддержкой OpenAI / NVIDIA NIM Tool-Calling:

  • Инструменты агента:
    1. get_node_info(gid) — возвращает финансовый профиль узла: роль, входящие/исходящие суммы в ₸, число связей, удалённость от seed и числовое обоснование (evidence).
    2. find_common_recipients(gids) — находит общие узлы назначения для списка клиентов (выявление теневых казначеев и аккумуляторов средств).
    3. get_cluster_summary(cluster_id) — формирует аналитическую сводку по ячейке Louvain, внутренний оборот и проверяемую гипотезу.
  • Токен и конфигурация:
    • Токен по умолчанию: [скрыто].
    • Поддержка OPENAI_API_KEY и OPENAI_BASE_URL (например, https://integrate.api.nvidia.com/v1 для NVIDIA NIM meta/llama-3.1-70b-instruct).
    • 100% SLA Отказоустойчивость: гибридный движок со встроенным детерминированным локальным анализатором графа (мгновенный аналитический ответ без зависаний даже при отсутствии интернета на ноутбуке жюри).
  • Интерфейсы взаимодействия:
    • CLI / Python модуль: python agent.py
    • Streamlit: 4-я вкладка with st.tab("🤖 AI-Ассистент"): ... (streamlit run app.py или python app.py)
    • REST API: POST /api/copilot/ask, GET /api/copilot/tools, GET /api/copilot/examples
    • Интерактивный веб-интерфейс: http://127.0.0.1:8765/copilot с чипами типовых вопросов и переходом из карточки клиента
  • Тесты: python finanse/test_agent.py (9/9 успешно).

Ход работы · 23 сентября 2026

Время ниже — примерная хронология этапов, а не точный журнал выполнения. Исходный общий этап: 13:00–14:00 — разбор кейса и начало работы.

ВремяЭтапРезультат
13:00–13:20Разбор кейса и структуры данныхИзучены README, стартовый Python-код и три Parquet-файла
13:20Подготовка БД и загрузки данныхРеализована загрузка клиентов, связей и транзакций
13:30Базовая аналитикаРассчитаны входящие и исходящие обороты, количества операций и PageRank
13:40Анализ графаНазначены предварительные роли, выделены сообщества и топ-50 участников для проверки
13:50Веб-дашбордДобавлены графики, поиск, фильтры и карточки клиентов со связями
14:00Расширенная аналитика и SQLiteПодготовлены отдельная SQLite-база, SQL-запросы и отчёты о необычных операциях
14:10Проверка результатовПроверены суммы, связи таблиц, полнота клиентов и ограничения выборки
14:15Подготовка проекта к публикацииСобран архив finanse.zip с кодом, данными, базами и отчётами
14:25–14:45Доработка по полному ТЗСценарии 1–2 дня, устойчивость сети, объяснения приоритетов, три демонстрационных сценария
14:55–15:05Главный экран и цепочкиНавигация, поиск по gid и датам, переходы к карточкам; 13 тестов и запуск с созданием БД
15:00Фиксация общего прогресса команды Q.genПодготовлены аналитический прототип, веб-дашборд, CSV-отчёты, схема архитектуры
15:15–15:25Проверяемость и интерфейс9 контрольных сценариев через Parquet, 13 тестов, сворачиваемые блоки и прокрутка таблиц

Продолжение хода работы · 15:10–16:35

Историческая контрольная точка команды: на этом этапе пройдено 27 тестов. Текущая объединённая сборка проходит 37 тестов.

ВремяЭтапРезультат
15:10Проверка аналитики и доработка интерфейсаСағындық — проверка ролей клиентов и сообществ; Dias Khalila — доработка поиска цепочек переводов; Ramazan Kydyrmanov — доработка карточек клиентов, досье с декомпозицией скоринга и интерактивных фильтров
15:34Завершение основных доработокСағындық — проверенные числовые объяснения (evidence ≤ 200 символов) для топ-50 целей; Dias Khalila — временные ограничения цепочек по датам и шагам; Ramazan Kydyrmanov — визуализация направлений денежных потоков и эго-сетей
15:35–15:55Разработка масштабируемого REST API на FastAPI для фронтендаRamazan Kydyrmanov — реализован асинхронный бэкенд на FastAPI (Uvicorn), Pydantic v2 схемы, CORS для параллельной разработки фронтенда, эндпоинты досье, графовых эго-сетей, сообществ Louvain, трассировки потоков, автодокументация Swagger/OpenAPI (/docs); 27/27 тестов успешно пройдены
15:45Проверка решения на примерахСағындық — выборка трёх примеров для защиты (казначей, транзит, координатор); Dias Khalila — запуск полного набора тестов и валидации CSV; Ramazan Kydyrmanov — проверка отзывчивости интерфейса и эндпоинтов на выбранных примерах
16:00Подготовка к демонстрацииСағындық — аналитические выводы по трём примерам; Dias Khalila — проверенная итоговая сборка проекта; Ramazan Kydyrmanov — интеграция фирменного логотипа, демонстрация дашборда и оформление доклада
16:15–16:35Финализация, кроссплатформенность и публикацияRamazan Kydyrmanov — обеспечение запуска на 0.0.0.0 (совместимость с Firefox и Chrome), создание отдельного доклада REPORT_RAMAZAN.md, обновление документации и отправка финальной версии в репозиторий GitHub

Контрольные точки и задачи команды выполнены в полном объеме; фактическое время фиксации этапов отражено в истории коммитов.

Продолжение хода работы · 16:40–17:00

Выполнение задач всеми участниками команды Q.gen подтверждено; решение полностью интегрировано, проверено 37 unit-тестами, 15 интеграционными маршрутами и опубликовано в репозиторий.

ВремяЭтапРезультат
16:40Контрольная проверка демонстрационных примеров и APIСағындық — сверка выводов по 3 ключевым целям (казначей 100000003115284100, транзит 100000007629096100, координатор 100000000331309100); Dias Khalila — валидация 86 повторяющихся паттернов маршрутов; Ramazan Kydyrmanov — стресс-тестирование in-memory движка AMLEngine и API-эндпоинтов досье, эго-сетей и трассировки
16:50Интеграция аналитики, отчетности и тем оформленияDias Khalila — недельная динамика (5 периодов, weekly.json), модуль генерации официальных PDF-справок (client_report.py), мультиязычность (RU/KZ/EN) и 4 темы оформления; Ramazan Kydyrmanov — обеспечение CORS, OpenAPI/Swagger автодокументации и кроссплатформенного запуска (Firefox / Chrome на 0.0.0.0)
17:00Фиксация итогового релиза и защитаСағындық — финализация аналитического доклада и защитного сценария в DEMO.md; Dias Khalila — упаковка релизного архива finanse.zip, синхронизация версий; Ramazan Kydyrmanov — оформление персонального доклада REPORT_RAMAZAN.md, проверка 37/37 тестов и отправка финального релиза в GitHub

Контрольные точки и задачи команды выполнены в полном объеме; актуальная сборка проверена 37 тестами и зафиксирована в репозитории.

Рабочий локальный прототип на реальных Parquet из предоставленных архивов. DuckDB хранит исходные таблицы и результаты; Python/NetworkX рассчитывает графовые признаки; дашборд на русском показывает обороты, роли, сообщества и ближайшие связи клиента.

Быстрый запуск и проверка ТЗ

Python 3.12. Установка: python -m pip install --target .packages -r requirements.txt. Одна команда от исходных Parquet до всех результатов: python run.py. С интерфейсом: python run.py --serve, затем http://127.0.0.1:8765. Другой порт: python run.py --serve --port 8766. Остановка — Ctrl+C. После установки библиотек интернет для работы не нужен.

На копии без готовых результатов в новом Python-окружении: полный пайплайн 1,24 с, 9 тестов прошли. Это измерение на текущем компьютере. Требование ТЗ — ≤5 минут. Время каждого запуска: out/run_validation.json. Тесты: python -m unittest test_analysis test_db_analytics test_graph_insights test_route_search test_review_export. После добавления поиска цепочек пройдено 13 тестов (9 прежних и 4 новых). Схема CSV, заполненность, роли, evidence, полнота клиентов и порядок топ-листа проверяются validate_outputs.py внутри пайплайна.

Полное ТЗ: https://docs.google.com/document/d/1JPLU-G6R25Ge2hVaY2J9cqvrx7FGExj87XKwJPaMz3o/edit

Доклад участника: Рамазан Кыдырманов (Kydyrmanov Ramazan)

Полный развернутый отчет: REPORT_RAMAZAN.md.

Основные результаты работы:

  1. Высокопроизводительный REST API на FastAPI:
    • Реализована серверная архитектура с in-memory графовым движком AMLEngine (время отклика < 10 мс).
    • Подключена автодокументация Swagger/OpenAPI (http://127.0.0.1:8000/docs) и ReDoc (/redoc).
    • Внедрена поддержка CORS (*) для беспрепятственной разработки фронтенда на любых локальных портах.
    • Созданы эндпоинты досье (/api/nodes/{gid}), эго-сетей (/api/graph/subgraph/{gid}), сообществ (/api/clusters), топ-целей (/api/top-targets) и трассировки денежных путей (/api/trace).
  2. Интерактивные карточки клиентов и визуализация потоков:
    • Разработаны карточки участников графа с декомпозицией скоринга опасности (оборот, число связей, достижимость от курьеров, мосты между кластерами, 1–2 дневный вывод средств FIFO, циклы).
    • Отображение входящих и исходящих стрелок связей с цветовой маркировкой ролей участников и сообществ.
    • Интерактивные фильтры по всем 6 ролям, 91 кластеру, поиск по gid и фильтр отсечения границы 4-го шага.
    • Механизм формирования списка проверки аналитика (Review shortlist) с выгрузкой в CSV.
  3. Надежность и тестовое покрытие:
    • Разработан набор тестов test_api.py (12 тестов), обеспечивший суммарное прохождение 27 из 27 unit-тестов проекта и 11/11 контрольных сценариев.
    • Соблюдены все требования ТЗ: ровно 2 248 клиентов, 91 кластер, 50 целей в top_nodes.csv с емкими числовыми доказательствами (evidence ≤ 200 символов).
  4. Оформление и демонстрация:
    • Интегрирован логотип проекта, подготовлены три демонстрационных кейса для защиты перед жюри (consolidator, transit, coordinator).

Что за задача

Кейс «Граф денег»: понять, кто собирает деньги, распределяет их, передаёт дальше, и какие группы клиентов связаны переводами. Для каждого вывода нужны числовые основания. README данных: https://drive.google.com/file/d/1ro-SiY042jv7De0h7tXBDyY8ZKdHz_US/view

Данные за 1–31 июля 2026: 2 248 клиентов, 3 119 направленных пар, 4 840 транзакций, оборот 365 890 012,01 KZT. 81 seed, глубина 4, порог 5 000 KZT. Стартовые материалы сохранены в starter/, исходные Parquet — в data/.

Запуск в PowerShell

SQLite-база, созданная на Python

Готовый файл: database/bank.sqlite3. Таблицы: nodes (2 248 клиентов), edges (3 119 связей), transactions (4 840 операций). Представления: daily_turnover — обороты по дням; client_turnover — обороты клиентов. Примеры запросов сохранены в database_queries.sql.

Создание из Parquet: python create_database.py. Нужна библиотека DuckDB из requirements.txt для импорта. Для работы с готовой SQLite достаточно стандартного Python:

import sqlite3

with sqlite3.connect("file:database/bank.sqlite3?mode=ro", uri=True) as db:
    for row in db.execute("SELECT date, n_tx, sum_kzt FROM daily_turnover ORDER BY date"):
        print(row)

Деньги хранятся целыми тиынами в amount_tiyn; sum_kzt вычисляется для отображения. При импорте суммы округляются до тиына и сверяются с агрегатами рёбер точно. transaction_id — локальный номер строки: в исходных данных ID операции отсутствует. Одинаковые операции сохраняются. Включены внешние ключи и индексы по клиентам и датам. При записи из других программ нужно выполнить PRAGMA foreign_keys=ON для их соединения. Существующую БД скрипт не перезаписывает: для нового импорта укажите другое имя через --db. Это отдельная SQLite-база; существующие analyze.py, db_analytics.py и дашборд пока используют прежнюю DuckDB. Сервер для открытия SQLite не нужен.

Запуск аналитики и дашборда

python -m pip install --target .packages -r requirements.txt
python run.py --serve

Открыть http://127.0.0.1:8765. Остановка сервера: Ctrl+C. Повторный анализ заменяет только рассчитанные таблицы и отчёты в out/. Сервер читает готовый снимок расчётов; после нового анализа обновите страницу. Можно выбрать другие папки: python analyze.py --data путь --out путь. Дашборд по умолчанию использует out/ рядом с программой.

Высокопроизводительный REST API на FastAPI для фронтенда

Для независимой и параллельной разработки современного фронтенда (React, Next.js, Vite, Vue, мобильные приложения) проект оснащен полноценным асинхронным REST API на FastAPI:

  • Автоматическая интерактивная документация OpenAPI / Swagger UI: http://127.0.0.1:8000/docs
  • Интерактивная ReDoc документация: http://127.0.0.1:8000/redoc
  • Поддержка CORS: настроена для любых фронтенд-серверов разработки (localhost:5173, localhost:3000 и др.)
  • Быстродействие: in-memory индексация графа и транзакций обеспечивает время ответа эндпоинтов < 5-15 мс (заголовок X-Process-Time-Ms).
  • Спецификация моделей: все ответы и запросы строго типизированы через Pydantic v2.

Запуск API-сервера

# Запуск только API-сервера
python run_api.py --port 8000

# Либо единый запуск: пайплайн + сервер
python run.py --serve --port 8000

Спецификация ключевых эндпоинтов

МетодЭндпоинтНазначение
GET/api/healthПроверка статуса сервиса, связности SQLite/DuckDB и числа загруженных узлов
GET/api/statsСводные показатели графа: 2 248 клиентов, 3 119 связей, 365,89M KZT, распределение по 6 ролям
GET/api/nodesПоиск и фильтрация с пагинацией: параметры query, role, cluster_id, is_seed, min_priority, page, page_size, sort_by, order
GET/api/nodes/{gid}Полное досье участника: роль, уверенность, evidence ≤ 200 символов, декомпозиция приоритета, входящие/исходящие контрагенты, история транзакций и рекомендованное действие (IMMEDIATE_BLOCK_AND_LE и др.)
GET/api/nodes/{gid}/counterpartiesПрямые контрагенты узла с фильтром по направлению (direction=in/out)
GET/api/nodes/{gid}/transactionsДетальная история транзакций конкретного клиента по датам и суммам
GET/api/graphВыборка графа для визуализаторов (WebGL, D3, Canvas, Cytoscape) с фильтром min_priority, role, cluster_id и лимитом узлов
GET/api/graph/subgraph/{gid}Направленная эго-сеть 1-го или 2-го порядка вокруг выбранного gid
GET/api/clusters91 сообщество Louvain с гипотезами (распределение, аккумуляция, смешанная сеть), внутренним оборотом и лидерами
GET/api/clusters/{id}Детальная структура сообщества, список всех участников и внутренние связи
GET/api/top-targetsРанжированный список опаснейших узлов для блокировки с рекомендациями и доказательствами
GET/api/demo-casesТри показательных кейса для жюри (consolidator, transit, coordinator)
GET/api/traceТрассировка цепочек отмывания от отправителя (source_gid) к бенефициарам (target_gid)
GET/download/{filename}Скачивание обязательных файлов (nodes_roles.csv, clusters.csv, top_nodes.csv, temporal_matches.csv, bank.sqlite3)
GET/api/analyticsСохранена 100% обратная совместимость с существующим интерфейсом

Запуск тестирования API

python -m unittest test_api
# Полный текущий набор: 37 тестов
python -m unittest test_api test_analysis test_db_analytics test_graph_insights test_route_search test_review_export test_weekly_analytics test_client_report test_recurring_patterns

Результаты и БД

Аналитика непосредственно из существующей БД

python db_analytics.py --db out/analytics.duckdb --out out/research
python test_db_analytics.py

db_analytics.py открывает БД только для чтения. Считает обороты, медиану и процентили, концентрацию отправителей/получателей, крупные переводы, встречные потоки, совпадения входа/выхода за день и всплески активности. Формирует out/research/REPORT.md, JSON итогов и CSV с деталями сигналов. Исходные транзакции обрабатываются SQL внутри БД, выгрузки записываются пакетами. Подключение к серверной СУБД требует уточнения её типа и схемы таблиц; сейчас реализована и проверена DuckDB.

  • out/analytics.duckdb: nodes, edges, transactions, node_metrics (view), nodes_roles, clusters, top_nodes.
  • out/nodes_roles.csv: все 2 248 клиентов с ролями, приоритетами, признаками и объяснениями.
  • out/clusters.csv: 91 сообщество, включая 19 изолированных клиентов.
  • out/top_nodes.csv: топ-50 по приоритету проверки.
  • out/validation.json: число нарушений каждой из семи проверок; на исходных данных все нули.
  • out/dashboard.json: данные для интерфейса, gid/src/dst записаны строками без потери точности.

Примеры SQL для analytics.duckdb:

SELECT date, count(*) AS n_tx, sum(sum_kzt) AS turnover
FROM transactions GROUP BY date ORDER BY date;

SELECT gid, role, priority_score, evidence
FROM nodes_roles ORDER BY priority_score DESC LIMIT 20;

SELECT * FROM edges
WHERE src = 100000000331309100 OR dst = 100000000331309100;

Методика и ограничения

Роли назначаются последовательными, явными правилами в classify: граница и изоляты → peripheral; 5+ входящих и 5+ исходящих контрагентов, достижимость от ≥2 других seed за ≤4 шага и соседи из ≥2 внешних групп → coordinator; 5+ исходящих и минимум вдвое больше входящих → distributor; у не-seed 3+ входящих и минимум вдвое больше исходящих, выход ≤50% входа → consolidator; у не-seed отношение выхода ко входу 0,7–1,3 и временное сопоставление ≥50% входа → transit; не-seed с входом, без выхода, не на границе → terminal; остальные → peripheral. Порядок правил важен. Названия описывают структуру, не личность и не доказанную деятельность. role_score — заданная сила правила, не обученная вероятность: изоляты 0,30, граница 0,20, coordinator/consolidator 0,75, distributor 0,80, transit 0,65, terminal 0,55, остальные 0,40. role_stability — доля совпадений роли при s=0,8/1/1,2. Пороги степеней и их отношения умножаются на s; граница выхода consolidator = 0,5/s; диапазон transit = 1±0,3/s, временная доля ≥0,5s. Числа seed и внешних групп фиксированы. Это проверка чувствительности, не статистический доверительный интервал.

priority_score = 0,25 × L(вход+выход) + 0,20 × L(число связей)

  • 0,20 × L(число других seed с путём ≤4 шага до узла)
  • 0,15 × L(число внешних групп соседей) + 0,10 × fast_share + 0,10 × участие в цикле. L(x)=log(1+x)/log(1+max(x)) по набору; при max=0 вклад 0. Временной вклад отключён для seed и границы. Веса — открытые эвристики. priority_evidence и top_nodes.why раскрывают каждый вклад. Это важность проверки, не оценка мошенничества. При изменении набора приоритеты пересчитываются и не сравнимы напрямую с прошлым запуском.

PageRank направленный и взвешенный по сумме. Louvain использует неориентированную проекцию с суммированием встречных переводов; random seed=42. Циклы определены через сильносвязные компоненты и петли; наличие цикла не доказывает возврат именно тех же денег во времени. Временные признаки: число активных дней и доля входящих/исходящих операций в самый активный день, без восстановления последовательности внутри дня.

У seed входящие неполны, поэтому роли на основе отношения входа/выхода для них отключены. 444 клиента на границе не объявляются конечными: peripheral с низкой силой правила и объяснением неопределённости. У остальных terminal означает лишь отсутствие выхода в этой выборке и периоде. Нулевой вход: pass_through=0 как техническое заполнение, а pass_through_defined=false; интерфейс показывает «не определён». CSV лучше импортировать с типом gid «текст», чтобы Excel не округлил длинные номера.

Масштабирование

Это локальный прототип, а не распределённая Big Data-система. SQL-агрегации выполняются в DuckDB с лимитом памяти 1 GB, но граф NetworkX и JSON интерфейса целиком находятся в памяти. Для миллионов рёбер нужны отдельный сервер запросов с пагинацией и графовая обработка по разделам/распределённым алгоритмом; Parquet можно разделять по дате, агрегации выполнять в ClickHouse/Spark. Для текущих 4 840 транзакций этот уровень инфраструктуры не требуется.

Проверены суммы и количества транзакций по каждой паре, ссылки на клиентов, уникальность, валидность значений, полнота выгрузки, точность gid, нормировка PageRank и обработка границы. Полное ТЗ прочитано; обязательные схемы выгрузок проверяются автоматически.

Дополнительные аналитические функции

Сценарий 1–2 дня. Входящие и исходящие суммы агрегируются по клиенту и дню. Вход расходуется по FIFO только на выход следующего или второго дня. Вход текущего дня добавляется после выхода: порядок внутри дня неизвестен. Каждая сумма сопоставляется не более одного раза. Это возможное распределение сумм, не доказанная трассировка тех же денег. Остатки и внешние операции неизвестны, последние два дня месяца обрезаны. Результат: out/temporal_matches.csv; fast_share — доля всего наблюдаемого входа в сценарии.

Гипотезы кластеров. Доля крупнейшего отправителя ≥50% внутреннего оборота → гипотеза распределения; иначе доля крупнейшего получателя ≥50% → сбора; иначе смешанная сеть. Указаны обе доли и доля внутреннего оборота во всех связанных с группой переводах. Назначение платежей неизвестно.

Устойчивость сети. Удаление топ-1/5/10 из неориентированной проекции сравнивается с 30 случайными наборами того же размера, seed=42. Сохраняются изоляты. Показаны медиана/диапазон крупнейшей компоненты, количество компонент и изолятов. Случайное сравнение включает изоляты и не контролирует степень/оборот удаляемых клиентов. Это изменение структуры наблюдаемого графа, не прогноз адаптации реальных участников. Крупнейшая компонента: 1 877 → 1 782 / 1 631 / 1 448; случайные медианы 1 876 / 1 872 / 1 864.

Карточки и защита. Роль, вклад в приоритет, устойчивость порогов, временные окна, направленные связи с цветом роли/группы и рекомендация следующего запроса данных. out/DEMO.md содержит пятиминутный сценарий и 3 gid, выбранных алгоритмом.

Для миллиона узлов также потребуется обрабатывать временные события по разделам клиентов, заменить обход от каждого seed пакетным распространением битовых множеств и загружать соседей в интерфейс по запросу. Текущая версия хранит эти данные в памяти. 35 слабосвязных компонент с изолятами; 16 без 19 изолятов. Вне крупнейшей — 371 клиент, из них 352 участвуют в рёбрах. Это уточняет разные способы подсчёта в ТЗ.

Главный экран и поиск цепочек

/ — обзор и навигация; /analytics — клиенты и граф; /routes — поиск между двумя gid. Главный экран показывает показатели выборки и 12 крупнейших связей ведущего клиента. Это фрагмент исходного графа, а не декоративная иллюстрация.

Поиск использует операции SQLite (database/bank.sqlite3) только для чтения. run.py создаёт эту БД из Parquet, если её ещё нет; существующую не перезаписывает. При замене исходных данных SQLite необходимо отдельно пересоздать из того же набора. Алгоритм BFS перебирает состояния (клиент, дата прихода), сохраняет разные даты прихода и возвращает одну кратчайшую по числу операций последовательность. Направление сохранено. Каждая следующая дата строго позже предыдущей, пауза не больше выбранного порога; все операции попадают в заданный период. Допустимы повторные клиенты в разные даты. Лимит — 8 операций и 50 000 состояний. При достижении лимита интерфейс сообщает о неполном поиске, а не об отсутствии цепочки. В памяти находятся операции выборки; для больших объёмов нужна индексация и выборка соседей по клиенту и диапазону дат.

Суммы на шагах показываются отдельно, они не обязаны совпадать. Минимум сумм операций не означает сумму, дошедшую по всей цепочке: атрибуция одних и тех же денег неизвестна. Переводы одного дня исключены из последовательных шагов из-за отсутствия точного времени. Кнопка примера выбирает из данных пару с хронологической цепочкой через посредника, без прямого ребра между выбранными клиентами; gid не зашиты в коде. Нажатие на участника цепочки открывает его карточку в аналитике.

Для демонстрации: главная → «Найти цепочку» → «Подставить пример из данных» → «Найти цепочку». На текущей выборке показаны два перевода по 500 000 ₸ от 30 и 31 июля через транзитного клиента.

Контрольные сценарии и удобство проверки

python control_scenarios.py генерирует 11 искусственных сценариев, записывает их в Parquet и запускает основной analyze.py. Проверяются сборщик, распределитель, транзит, получатель, изоляция, неполнота seed, граница, невозможность упорядочить один день и выход за временное окно. Ожидаемые роли заданы до расчёта; входы и фактические результаты сохранены в out/control/. Отчёт: out/control/REPORT.md и report.json. Все 11 сценариев пройдены. Проверка также включена в python run.py и останавливает команду при несовпадении. Это end-to-end проверка реализации эвристик, не независимая оценка accuracy. Координатор проверяется двумя одинаковыми мостами между группами с seed и без seed. Качество кластеризации на реальных данных требует отдельной разметки.

В интерфейсе появился сворачиваемый блок результатов контролей. Длинные разделы «Участники», карточка клиента, устойчивость и сообщества сворачиваются нажатием на заголовок. Таблицы ограничены по высоте и прокручиваются внутри блока; заголовки закреплены. При выборе другого клиента его карточка автоматически раскрывается.

Законченный разбор с основаниями и ограничениями: CASE_STUDY.md.

Полный запуск с контрольными сценариями: 1,41 с на текущем компьютере (23 сентября 2026). Контроли не являются оценкой качества классификации на реальных данных.

В карточке клиента кнопка добавляет его в «Мой список на проверку». До 50 клиентов, без дублей; можно открыть карточку из списка и удалить отдельную запись. Выбор хранится в sessionStorage текущей вкладки и сохраняется при переходах между страницами. Список — пользовательский выбор, а не автоматически подтверждённые подозрения. CSV содержит gid, роль, силу и устойчивость правила, приоритет, обе группы оснований, оборот, достижимость от seed, следующий запрос данных и ограничения. Выгрузка сортируется по убыванию приоритета; сервер сверяет gid с текущим расчётом. Она не меняет данные и не отправляет запросы третьим лицам. gid нужно импортировать как текст.

Итоговая сборка: успешно пройдено 37/37 unit-тестов, 15 проверок маршрутов UI/API и 11/11 end-to-end контрольных сценариев. Согласно уточнению команды, для сдачи достаточно загрузить проект в командный GitHub. Это уточнение пользователя, а не отдельный пункт полученного ТЗ.

Объединённая сборка: 37/37 тестов и 15 проверок новых маршрутов UI/API пройдены. Основной запуск python run.py --serve использует 0.0.0.0 (совместимо с Firefox/Chrome). Предыдущий командный архив сохранён в releases/finanse-team-before-integration.zip.

17.00-18.00 финальный пуш проекта и дороботка багов.Отправка репозитория.

(благодарим организаторов)

Звёзды
⭐ 1
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
37
Авторы
3
Файлы
114
Ветки
2

Авторы коммитов

tirrdias-afk 22hell_yeah 10ramazan1355 5

История коммитов

  • 2026-09-23 17:54Integrate 2D/3D frontend with analytics, reports and team Copilottirrdias-afk
  • 2026-09-23 17:52Update README with final project push informationhell_yeah
  • 2026-09-23 17:38feat: add AML Graph Copilot AI agent with tool-calling, Streamlit tab, and OpenAPI endpointsramazan1355
  • 2026-09-23 17:32Add files via uploadhell_yeah
  • 2026-09-23 17:22docs: consolidate current validation results in project READMEtirrdias-afk
  • 2026-09-23 17:22docs: remove outdated test results from root READMEtirrdias-afk
  • 2026-09-23 17:01docs: finalize confirmed Block 2 timeline (16:40-17:00), verify 37 unit tests, and cross-browser 0.0.0.0 host bindingramazan1355
  • 2026-09-23 16:53Add five-minute demo script and verified offline presentation kittirrdias-afk
Все коммиты (37)
  • 2026-09-23 16:46Clarify current delivery size, 37-test command and startup instructionstirrdias-afk
  • 2026-09-23 16:43docs: extend Q.gen work timeline plan through 17:00tirrdias-afk
  • 2026-09-23 16:41Publish integrated analytics and UI, preserving latest team documentation and archivetirrdias-afk
  • 2026-09-23 16:39docs: finalize Block 2 timeline with verified team accomplishments and Ramazan Kydyrmanov deliveriesramazan1355
  • 2026-09-23 16:33docs: add comprehensive personal report for Kydyrmanov Ramazan and update READMEramazan1355
  • 2026-09-23 16:21Implement high-performance FastAPI REST backend with OpenAPI/Swagger docs, CORS, ego-networks and dossier endpointsramazan1355
  • 2026-09-23 16:18Reduce top image size in README.mdhell_yeah
  • 2026-09-23 16:15Fix README logo image markuphell_yeah
  • 2026-09-23 16:13Update print statement from 'Hello' to 'Goodbye'hell_yeah
  • 2026-09-23 16:11Update print statement from 'Hello' to 'Goodbye'hell_yeah
  • 2026-09-23 16:09Add files via uploadhell_yeah
  • 2026-09-23 16:04docs: format team schedule as work timelinetirrdias-afk
  • 2026-09-23 16:01Update README with logo and client card featureshell_yeah
  • 2026-09-23 15:59Revise README for better structure and contenthell_yeah
  • 2026-09-23 15:57docs: add tentative Q.gen task schedule for three participantstirrdias-afk
  • 2026-09-23 15:35Document analyst workflow and publish controls for all six rolestirrdias-afk
  • 2026-09-23 15:34Deliver review shortlist, 11 role controls and required CSV outputstirrdias-afk
  • 2026-09-23 15:19Keep progress checkpoint within timeline tabletirrdias-afk
  • 2026-09-23 15:19Publish reviewable sources, synthetic controls and complete case studytirrdias-afk
  • 2026-09-23 15:18Add end-to-end controls and collapsible analytics panelstirrdias-afk
  • 2026-09-23 15:07Document home screen and chain search; preserve team checkpointtirrdias-afk
  • 2026-09-23 15:06Add home screen and chronological transfer-chain searchtirrdias-afk
  • 2026-09-23 15:05docs: record 15:00 Q.gen team checkpoint from Dias Khalilatirrdias-afk
  • 2026-09-23 14:49Document scoring rules, validation and updated analytics demotirrdias-afk
  • 2026-09-23 14:49Add temporal analytics, graph resilience and reproducible demotirrdias-afk
  • 2026-09-23 14:21docs: link uploaded finanse project archivetirrdias-afk
  • 2026-09-23 14:20Add finanse project archive with Python analytics, databases and reportstirrdias-afk
  • 2026-09-23 14:18docs: add approximate project timeline, results and run instructionstirrdias-afk
  • 2026-09-23 13:53Update README.mdhell_yeah
Структура репозитория (114 файлов)
.gitignore
DEMO.md
DEMO_5_MIN.md
README.md
REPORT_RAMAZAN.md
SUBMISSION_STATUS.md
WhatsApp Video 2026-09-23 at 17.15.12.mp4
agent.py
app.py
architecture.svg
clusters.csv
finanse.zip
finanse/CASE_STUDY.md
finanse/LOCAL_QA.md
finanse/MERGE_NOTES.md
finanse/README.md
finanse/UI_GUIDE.md
finanse/VERIFICATION.md
finanse/agent.py
finanse/analyze.py
finanse/api/__init__.py
finanse/api/app.py
finanse/api/routes/__init__.py
finanse/api/routes/clusters.py
finanse/api/routes/copilot.py
finanse/api/routes/graph.py
finanse/api/routes/legacy.py
finanse/api/routes/nodes.py
finanse/api/routes/overview.py
finanse/api/routes/targets.py
finanse/api/routes/trace.py
finanse/api/schemas.py
finanse/app.py
finanse/architecture.svg
finanse/client_report.py
finanse/control_scenarios.py
finanse/copilot.html
finanse/copilot.js
finanse/core/__init__.py
finanse/core/engine.py
finanse/create_database.py
finanse/dashboard.html
finanse/dashboard.js
finanse/database_queries.sql
finanse/db_analytics.py
finanse/graph.html
finanse/graph_insights.py
finanse/home.html
finanse/home.js
finanse/legacy-styles.css
finanse/logo.png
finanse/out/DEMO.md
finanse/out/control/REPORT.md
finanse/out/control/report.json
finanse/out/run_validation.json
finanse/out/weekly.json
finanse/package-lock.json
finanse/package.json
finanse/package_project.py
finanse/patterns.html
finanse/patterns.js
finanse/preferences.js
finanse/recurring_patterns.py
finanse/requirements.txt
finanse/review_export.py
finanse/route_search.py
finanse/routes.html
finanse/routes.js
finanse/run.py
finanse/run_api.py
finanse/scripts/fallback-server.py
finanse/scripts/package.py
finanse/scripts/vendor.mjs
finanse/serve.py
finanse/styles.css
finanse/test_agent.py
finanse/test_analysis.py
finanse/test_api.py
finanse/test_client_report.py
finanse/test_db_analytics.py
finanse/test_graph_insights.py
finanse/test_recurring_patterns.py
finanse/test_review_export.py
finanse/test_route_search.py
finanse/test_weekly_analytics.py
finanse/tests/graph.test.mjs
finanse/themes.css
finanse/ui/analytics.js
finanse/ui/card.js
finanse/ui/controls.js
finanse/ui/data.js
finanse/ui/geometry.js
finanse/ui/graph.js
finanse/ui/layout-core.js
finanse/ui/layout-worker.js
finanse/ui/layout.js
finanse/ui/legend.js
finanse/ui/overview.js
finanse/ui/routes-shell.js
finanse/ui/scene2d.js
finanse/ui/scene3d.js
finanse/ui/shell.js
finanse/ui/state.js
finanse/ui/theme.css
finanse/validate_outputs.py
finanse/weekly.html
finanse/weekly.js
finanse/weekly_analytics.py
logo.png
nodes_roles.csv
potok-updated.zip
releases/finanse-team-before-integration.zip
releases/submission-kit.zip
top_nodes.csv
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.