File size: 3,256 Bytes
9d51394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import pandas as pd
import geopandas as gpd
import folium
from sklearn.ensemble import IsolationForest
import subprocess

def load_geo_traffic_data(file_path):
    """
    Загружает данные гео-трафика из CSV файла.
    CSV должен содержать колонки: latitude, longitude, traffic_intensity, timestamp.
    """
    data = pd.read_csv(file_path)
    return data

def analyze_geo_traffic(data, contamination=0.01):
    """
    Преобразует DataFrame в GeoDataFrame и применяет алгоритм обнаружения аномалий.
    contamination – процент ожидаемых аномалий (например, 1%).
    Возвращает GeoDataFrame с добавленным столбцом 'anomaly' (-1: аномалия, 1: нормальные данные).
    """
    # Создаем GeoDataFrame
    gdf = gpd.GeoDataFrame(
        data,
        geometry=gpd.points_from_xy(data.longitude, data.latitude)
    )
    
    # Применяем Isolation Forest для анализа 'traffic_intensity'
    model = IsolationForest(contamination=contamination, random_state=42)
    data['anomaly'] = model.fit_predict(data[['traffic_intensity']])
    
    # Добавляем информацию об аномалиях в GeoDataFrame
    gdf['anomaly'] = data['anomaly']
    return gdf

def create_traffic_map(gdf):
    """
    Строит карту региона с отображением точек.
    Зеленый цвет – нормальный трафик, красный – обнаруженная аномалия.
    """
    center_lat = gdf.geometry.y.mean()
    center_lon = gdf.geometry.x.mean()
    m = folium.Map(location=[center_lat, center_lon], zoom_start=10)
    
    for _, row in gdf.iterrows():
        color = 'red' if row['anomaly'] == -1 else 'green'
        folium.CircleMarker(
            location=[row.geometry.y, row.geometry.x],
            radius=3,
            color=color,
            fill=True,
            fill_color=color,
            fill_opacity=0.7
        ).add_to(m)
    return m

def run_cybersecurity_check(ruby_script_path, log_file):
    """
    Запускает Ruby-скрипт для анализа логов кибербезопасности.
    """
    subprocess.run(["ruby", ruby_script_path, log_file])

if __name__ == "__main__":
    # Этап 1: Загрузка и анализ гео-трафика (от 0% до 100% выполнения)
    file_path = 'geo_traffic.csv'  # Файл с данными трафика
    data = load_geo_traffic_data(file_path)
    gdf = analyze_geo_traffic(data, contamination=0.01)
    
    # Этап 2: Создание карты региона
    traffic_map = create_traffic_map(gdf)
    traffic_map.save("geo_traffic_map.html")
    print("Карта сохранена как 'geo_traffic_map.html'")
    
    # Этап 3: Вызов Ruby-скрипта для проверки кибербезопасности
    # Предположим, что лог-файл называется 'cyber_logs.json'
    ruby_script = 'cyber_security_check.rb'
    log_file = 'cyber_logs.json'
    run_cybersecurity_check(ruby_script, log_file)