Подмножество двух последовательных событий в pandas

#pandas #dataframe #time-series

#pandas #фрейм данных #временные ряды

Вопрос:

Я пытаюсь получить подмножество моих данных всякий раз, когда происходит последовательное возникновение двух событий в этом порядке. Событие имеет временную метку. Поэтому каждый раз, когда есть непрерывные 2, а затем непрерывные 3, я хочу подмножить это в фрейм данных и добавить его в словарь. Следующий код делает это, но я должен применить это к очень большому фрейму данных объемом более 20 миллионов obs. Это очень медленно при использовании iterrows. Как я могу сделать это быстро?

 df = pd.DataFrame({'Date': [101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],
        'Event': [1,1,2,2,2,3,3,1,3,2,2,3,1,2,3,2,3,2,2,3,3,3]})

dfb = pd.DataFrame(columns = df.columns)
C = {}
f1 = 0

for index, row in df.iterrows():
    if ((row['Event'] == 2) amp; (3 not in dfb['Event'].values)):
        dfb = dfb.append(row)
        f1 =1
    elif ((row['Event'] == 3) amp; (f1 == 1)):
        dfb = dfb.append(row)
    elif 3 in dfb['Event'].values:
        f1 = 0
        C[str(dfb.iloc[0,0])] = dfb
        del dfb
        dfb = pd.DataFrame(columns = df.columns)
        if row['Event'] == 2:
            dfb = dfb.append(row)
            f1 =1
    else:
        f1=0
        del dfb
        dfb = pd.DataFrame(columns = df.columns)

  

Редактировать: желаемый результат в основном представляет собой словарь подмножеств, показанных на изображении https://i.stack.imgur.com/ClWZs.png

Ответ №1:

  1. Если вы хотите ускорить, вам следует векторизовать свой код. Вы могли бы попробовать это так (df совпадает с вашим кодом):
 vec = df.copy()
vec['Event_y'] = vec['Event'].shift(1).fillna(0).astype(int)
vec['Same_Flag'] = float('nan')
vec.Same_Flag.loc[(vec['Event_y'] == vec['Event']) amp; (vec['Event'] != 1)] = 1
vec.dropna(inplace=True)
vec.loc[:, ('Date', 'Event')]
  

Вывод:

Дата события
3 104 2
4 105 2
6 107 3
10 111 2
18 119 2
20 121 3
21 122 3

Я думаю, это близко к тому, что вам нужно. Вы могли бы улучшить на основе этого.

  1. Я не понимаю, почему дата 104, 105, 107 не учитывается.

Комментарии:

1. Извините, это не то же самое, что мой вывод. Пожалуйста, смотрите Ссылку на Изображение в моем вопросе для получения желаемого результата.

2. ДА. Я это знаю. Итак, как я уже сказал, I think that's close to what you need. You could improve based on that.

3. По сути, они имеют одинаковое значение, но мой ответ без флага вчерашней даты. Вы могли бы добавить к нему вчерашнюю дату, тогда они будут одинаковыми.