Pandas - проверка повторяющегося шаблона в кадре данных - PullRequest
0 голосов
/ 30 октября 2018

Я сейчас пытаюсь анализировать данные сети с помощью панд. Я читал другие посты, и самая близкая к моей проблеме это Панды - Найти и проиндексировать строки, которые соответствуют шаблону последовательности строк .

Мой фрейм данных выглядит так: Dataframe

Я пытаюсь проверить, потерялись ли некоторые пакеты, и посчитать количество потерянных пакетов. Поэтому я хотел бы определить окно или матрицу, здесь 2x2. Затем определите шаблон, в этом случае это будет .

Теперь я хочу проверить, является ли окно точно повторяющимся окном. Если возможно, это должно быть сделано в дополнительном столбце, давая мне false или true (или nan). Я попробовал это уже в следующих примерах моего кода.

В первом примере я попытался проверить это с помощью итерации строк. Мой третий пример больше того, что я искал: С помощью команды прокрутки я определяю окно и шаблон, код должен проверять строки, но я получаю ошибку, потому что шаблон является строкой. Вот как бы я хотел, чтобы это выглядело.

import pandas as pd

df = pd.read_csv ('hallo')

Здесь я отфильтровываю помехи

   Protocol_filtered = df[df['Protocol']== 'ICMP']
   Protocol_filtered1 = Protocol_filtered[['Time','Source','Destination','Info']] 
   Protocol_filtered1 = Protocol_filtered1.reset_index(drop=True)

Я начинаю проверять потерянные пакеты

    s0 = 0
    s1 = 1

   for row in Protocol_filtered1.iterrows():
  while s1 <= len (Protocol_filtered1):
    source = Protocol_filtered1.loc[s0,'Source']
    dest = Protocol_filtered1.loc[s1,'Destination']

    if source == dest:
        Protocol_filtered1['Check']= True
    else:
        Protocol_filtered1['Check']= False

    source1 = Protocol_filtered1.loc[s1,'Source']
    dest1 = Protocol_filtered1.loc[s0,'Destination']



    if source1 == dest1:
        Protocol_filtered1['Check1']= True
    else:
        Protocol_filtered1['Check1']= False

    s0 = s0 + 2
    s1 = s1 + 2  

Результат этого кода не тот, который я хотел, так как он дает мне, например, значение true в строке 2, где оно должно быть ложным.

Protocol_filtered1.head()

Логика следующего кода верна, но он проверяет i для каждой строки, в то время как он всегда должен проверять две последовательные строки вместе (0 & 1, 2 & 3, 4 & 5 ...):

pattern = ['192.168.20.35', '192.168.20.31']
i = (Protocol_filtered1['Source'] == '192.168.20.35') &         (Protocol_filtered1['Source'].shift(-1) == '192.168.20.31')
i &= (Protocol_filtered1['Destination'] == '192.168.20.31') & (Protocol_filtered1['Destination'].shift(-1)== '192.168.20.35')

Protocol_filtered1.index[i]

Protocol_filtered1 ['Check1'] = i

Результат здесь (Должно быть: Проверить: True, True, False, False, True, True):

enter image description here

Очень элегантное решение, которое я нашел на форуме и которое я пытался применить:

pattern = ['192.168.20.35', '192.168.20.31']
obs = len(pattern)
Protocol_filtered1['S1'] = (Protocol_filtered1['Source']
                        .rolling(window = obs, min_periods = )
                        .apply(lambda x: (x==pattern).all())
                        .astype(bool)
                        .shift(-1*(obs-1)))

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

Я был бы очень признателен за помощь! Большое спасибо!

...