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)
|