Время прочтения: 3 мин.

Как собрать, обработать, проанализировать и визуализировать информацию по огромной паутине объектов транспорта нефти, а тем более построить признаки отклонения от норм оперативного учета нефти?

OPC (OLE for Process Control) – промышленный стандарт, созданный консорциумом всемирно известных производителей оборудования и программного обеспечения.

Стандарт обмена данными OPC базируется на распространенной общепринятой схеме Клиент-Сервер.

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

Наиболее интересен с точки зрения аудита протокол OPC HDA (Historical Data Access), позволяющий “прокрутить картину” происходящего в трубопроводе за интервал времени.

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

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

Для материальных потоков (в данном случае потоков нефти), также как для электрических действует закон Кирхгофа. В данном случае сумма потоков A+B+C должна равняться D.

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

Пример на Python:

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pylab
G = nx.DiGraph()
A = 5
B = 3
C = 8
D = 16
G.add_edges_from([('1', '4')], weight=A)
G.add_edges_from([('2','4')], weight=B)
G.add_edges_from([('3','4')], weight=C)
G.add_edges_from([('4','5')], weight=D)
edge_labels=dict([((u,v,),d['weight'])
                 for u,v,d in G.edges(data=True)])
if A+B+C==D:
    colors = ['blue','blue','blue','blue','blue']
else: 
    colors = ['blue','red','blue','blue','blue']
pos=nx.spring_layout(G)
nx.draw_networkx_edge_labels(G,pos,edge_labels=edge_labels)
nx.draw(G,pos, node_color = colors, node_size=1500, with_labels = True)
pylab.show()

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

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