Spaces:
Build error
Build error
Create app,py
Browse files
app,py
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import geopandas as gpd
|
3 |
+
import folium
|
4 |
+
from sklearn.ensemble import IsolationForest
|
5 |
+
import subprocess
|
6 |
+
|
7 |
+
def load_geo_traffic_data(file_path):
|
8 |
+
"""
|
9 |
+
Загружает данные гео-трафика из CSV файла.
|
10 |
+
CSV должен содержать колонки: latitude, longitude, traffic_intensity, timestamp.
|
11 |
+
"""
|
12 |
+
data = pd.read_csv(file_path)
|
13 |
+
return data
|
14 |
+
|
15 |
+
def analyze_geo_traffic(data, contamination=0.01):
|
16 |
+
"""
|
17 |
+
Преобразует DataFrame в GeoDataFrame и применяет алгоритм обнаружения аномалий.
|
18 |
+
contamination – процент ожидаемых аномалий (например, 1%).
|
19 |
+
Возвращает GeoDataFrame с добавленным столбцом 'anomaly' (-1: аномалия, 1: нормальные данные).
|
20 |
+
"""
|
21 |
+
# Создаем GeoDataFrame
|
22 |
+
gdf = gpd.GeoDataFrame(
|
23 |
+
data,
|
24 |
+
geometry=gpd.points_from_xy(data.longitude, data.latitude)
|
25 |
+
)
|
26 |
+
|
27 |
+
# Применяем Isolation Forest для анализа 'traffic_intensity'
|
28 |
+
model = IsolationForest(contamination=contamination, random_state=42)
|
29 |
+
data['anomaly'] = model.fit_predict(data[['traffic_intensity']])
|
30 |
+
|
31 |
+
# Добавляем информацию об аномалиях в GeoDataFrame
|
32 |
+
gdf['anomaly'] = data['anomaly']
|
33 |
+
return gdf
|
34 |
+
|
35 |
+
def create_traffic_map(gdf):
|
36 |
+
"""
|
37 |
+
Строит карту региона с отображением точек.
|
38 |
+
Зеленый цвет – нормальный трафик, красный – обнаруженная аномалия.
|
39 |
+
"""
|
40 |
+
center_lat = gdf.geometry.y.mean()
|
41 |
+
center_lon = gdf.geometry.x.mean()
|
42 |
+
m = folium.Map(location=[center_lat, center_lon], zoom_start=10)
|
43 |
+
|
44 |
+
for _, row in gdf.iterrows():
|
45 |
+
color = 'red' if row['anomaly'] == -1 else 'green'
|
46 |
+
folium.CircleMarker(
|
47 |
+
location=[row.geometry.y, row.geometry.x],
|
48 |
+
radius=3,
|
49 |
+
color=color,
|
50 |
+
fill=True,
|
51 |
+
fill_color=color,
|
52 |
+
fill_opacity=0.7
|
53 |
+
).add_to(m)
|
54 |
+
return m
|
55 |
+
|
56 |
+
def run_cybersecurity_check(ruby_script_path, log_file):
|
57 |
+
"""
|
58 |
+
Запускает Ruby-скрипт для анализа логов кибербезопасности.
|
59 |
+
"""
|
60 |
+
subprocess.run(["ruby", ruby_script_path, log_file])
|
61 |
+
|
62 |
+
if __name__ == "__main__":
|
63 |
+
# Этап 1: Загрузка и анализ гео-трафика (от 0% до 100% выполнения)
|
64 |
+
file_path = 'geo_traffic.csv' # Файл с данными трафика
|
65 |
+
data = load_geo_traffic_data(file_path)
|
66 |
+
gdf = analyze_geo_traffic(data, contamination=0.01)
|
67 |
+
|
68 |
+
# Этап 2: Создание карты региона
|
69 |
+
traffic_map = create_traffic_map(gdf)
|
70 |
+
traffic_map.save("geo_traffic_map.html")
|
71 |
+
print("Карта сохранена как 'geo_traffic_map.html'")
|
72 |
+
|
73 |
+
# Этап 3: Вызов Ruby-скрипта для проверки кибербезопасности
|
74 |
+
# Предположим, что лог-файл называется 'cyber_logs.json'
|
75 |
+
ruby_script = 'cyber_security_check.rb'
|
76 |
+
log_file = 'cyber_logs.json'
|
77 |
+
run_cybersecurity_check(ruby_script, log_file)
|