Вопрос или проблема
У меня есть набор данных о сетевом взаимодействии, и кажется, что данные приходят из разных каналов. Поэтому одно и то же время метки повторяется для разных строк, что делает анализ временных рядов бессмысленным.
Моя цель – выяснить, есть ли способ извлечь только одни конкретный поток/канал данных и провести анализ временных рядов только на этих данных.
Нет идентификатора потока/канала, поэтому из 80 признаков я хочу проверить, есть ли столбец, который может служить идентификатором для потока.
Мне нужно сгруппировать по временной метке, проверить, есть ли столбец, который не повторяется в группе, например feature1, и если этот feature1 имеет ту же характеристику во всех других группах, что означает, что он не повторяется внутри группы по временной метке. Я написал этот код, но он дает неверные результаты.
def find_unique_features(df, timestamp_col="Timestamp", exclude_features=None):
# Установить стандартные исключаемые признаки, если они не указаны
if exclude_features is None:
exclude_features = ['Label','Flow Duration'] # продолжительность потока и метка известны как неуникальные
# Инициализировать список для хранения имен уникальных признаков
unique_features = []
# Перебирать каждый столбец в DataFrame, исключая временную метку и указанные признаки
for col in df.columns:
if col == timestamp_col or col in exclude_features:
continue
# Группировать по временной метке и подсчитывать уникальные значения в столбце для каждой группы временной метки
unique_counts = df.groupby(timestamp_col)[col].nunique()
print(f"В столбце '{col}' {unique_counts} уникальных значений для группы временной метки.") # Проверить, есть ли во всех группах уникальные значения (количество уникальных равно размеру группы)
if all(unique_counts == df.groupby(timestamp_col).size()):
unique_features.append(col)
return unique_features
Вот ссылка на часть этого набора данных: https://www.kaggle.com/datasets/rihanna1/cic2018-02-14-2018
Active Min Idle Max Fwd IAT Mean Bwd Pkts/s Fwd IAT Min Bwd IAT Max Fwd IAT Max Pkt Size Avg Fwd IAT Std Fwd Header Len ... Idle Mean Bwd IAT Mean Fwd Seg Size Min Flow IAT Max Dst Port Pkt Len Mean Bwd Header Len Active Max Rounded_Timestamp Time
0 0 56320958 5.632086e+07 0.000000 56320761 0 56320958 0.00 1.393000e+02 0 ... 56320859.5 0.000000e+00 0 56320958 0 0.000000 0 0 2018-02-14 08:31:01 08:31:01
1 0 56320814 5.632073e+07 0.000000 56320652 0 56320814 0.00 1.145513e+02 0 ... 56320733.0 0.000000e+00 0 56320814 0 0.000000 0 0 2018-02-14 08:33:50 08:33:50
2 0 56319525 5.631931e+07 0.000000 56319098 0 56319525 0.00 3.019346e+02 0 ... 56319311.5 0.000000e+00 0 56319525 0 0.000000 0 0 2018-02-14 08:36:39 08:36:39
Ответ или решение
Для решения задачи извлечения уникальных признаков из набора данных, связанного с сетевым трафиком, предлагаю вам усовершенствованный метод. Эта задача важна для вашего анализа временных рядов, так как повторяющиеся временные метки в данных могут затруднить понимание потоков информации. Основная цель – определить, есть ли в вашем наборе данных такой признак, который будет уникален в рамках каждой группы по времени.
Методика
-
Идентификация набора данных: Начнем с загрузки данных и предварительного анализа его структуры, чтобы понять, какие признаки могут представлять интерес.
-
Группировка данных: Используя группировку по временным меткам, мы можем определить количество уникальных значений для каждого признака.
-
Фильтрация уникальных признаков: На основании полученного количества уникальных значений следует определить, какие из признаков могут считаться уникальными (т.е. количество уникальных значений для каждого признака совпадает с количеством групп).
Оптимизированный код
import pandas as pd
def find_unique_features(df, timestamp_col="Timestamp", exclude_features=None):
if exclude_features is None:
exclude_features = ['Label', 'Flow Duration'] # Признаки, которые мы знаем как неуникальные
unique_features = []
for col in df.columns:
if col == timestamp_col or col in exclude_features:
continue
# Подсчитываем количество уникальных значений для каждого столбца в группе по timestamp
unique_counts = df.groupby(timestamp_col)[col].nunique()
# Проверяем, совпадает ли количество уникальных значений с количеством групп
if len(unique_counts) == df[timestamp_col].nunique() and (unique_counts.nunique() == 1):
unique_features.append(col)
return unique_features
# Пример использования
# df = pd.read_csv('ваш_файл.csv')
# уникальные_признаки = find_unique_features(df)
# print(уникальные_признаки)
Пояснение кода
-
Исключаемые признаки: Мы задаем исключаемые признаки в качестве параметров, чтобы упростить выборку. Это те признаки, которые мы заранее знаем, что они не уникальны.
-
Группировка и подсчет уникальных значений: Для каждого признака, кроме временной метки и исключаемых признаков, мы группируем данные по временной метке и подсчитываем уникальные значения.
-
Проверка уникальности: Если количество уникальных значений в столбце совпадает с количеством временных меток и, кроме того, все уникальные счетчики имеют одно значение, значит, этот признак можно считать уникальным для каждого временного интервала.
Заключение
Следуя приведенному алгоритму, мы можем эффективно выявить уникальные признаки в вашем наборе данных, что позволит сосредоточить ваши последующие временные ряды на наиболее значимых аспектах. Проводите анализ и тестирование, оптимизируя параметры, чтобы повысить качество сформированных результатов. Ваша работа с данным кодом даст возможность углубиться в данные и извлечь из них ценные инсайты.
Если у вас возникнут дополнительные вопросы или потребуется более детальная помощь, не стесняйтесь обращаться!