Подмножество pandas timeseries dataframe из цикла if - PullRequest
1 голос
/ 24 мая 2019

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

Я использую Spyder, работаю над исследовательским проектом.

Мне нужно создать новую переменную в существующем фрейме данных (df), которая обеспечивает следующую логику:

  • Между временем T1 (1-е вхождение числа 1 в столбце e1) и временем T2 (2-е 1 в e1), если для любой из переменных записан 1 между T1 и T2(e2 или e3) или значение v1 между T1 и T2 больше 1, затем поместите 1 в новый столбец с именем 'result' между T1 и T2.

  • Между временем T2 (2-е вхождение числа 1 в столбце e1) и временем T3 (3-е 1 в e1), если существует запись 1 между T2 и T3 для любой из переменных (e2 или e3) или значение v1 между T2 и T3 является большимбольше 1, затем поместите 1 в новый столбец с именем «result» между T2 и T3.

между T3 и T4 и т. д. и т. д.

Следуя вышесказанному, я создам подмножество данных, основанное на всех строках, которые имеют «1» в «результате» для дальнейшего анализа.

Чтобы воссоздать небольшую часть df:

import pandas as pd
import numpy as np
import datetime


df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
                    'e2' : [np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'v1' : [1,1,1,1,1,1,1,1,1,1.2,1.5,1,1],},
                        index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))

Результат должен быть:

'result' : [1,1,1,1,1,np.nan,np.nan,np.nan,np.nan,1,1,np.nan,np.nan]

Надеюсь, это имеет смысл.

Спасибо!

Редактировать 31.05.2019

Предлагаемое решение работает в большинстве случаев, однако критически не дает результатов:

Я отредактировал данные выборки, включив в них экземпляр, в котором есть наблюдения как на e1, так и на e2 в 00:25:00..

import pandas as pd
import numpy as np
import datetime

df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
                    'e2' : [np.nan,1,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                    'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]},
                        index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))

Проблема

Проблема, с которой я столкнулся, заключается в том, что предлагаемое решение сообщает о результате в период с 00:25:00 до 00:40:00,где я хочу, чтобы результат не включал это.Я хочу, чтобы код анализировал время между 1 в столбце e1, не считая времени наблюдения в e1.

Надеюсь, это имеет смысл ...

1 Ответ

0 голосов
/ 24 мая 2019

Это можно сделать с помощью маскировки и группового:

# if there is an event at that time
events = df[['e2','e3']].notna().any(axis=1)

# if v1 > 1 at given time
v1g1 = df['v1'].gt(1)

# mask
mask = v1g1 | events

# group the events by e1 
df['result'] = mask.groupby(df.e1.fillna(0).cumsum()).transform('any')

# if you want 1 and NaN:
df['result'] = np.where(mask.groupby(df.e1.fillna(0).cumsum()).transform('any'),
                        1, np.nan)

Выход True, False кроме 1, NaN:

                        e1      e2      e3      v1      result
2019-05-02 00:00:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:05:00     NaN     1.0     NaN     1.0     True
2019-05-02 00:10:00     NaN     NaN     NaN     1.0     True
2019-05-02 00:15:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:20:00     NaN     NaN     1.0     1.0     True
2019-05-02 00:25:00     1.0     NaN     NaN     1.0     False
2019-05-02 00:30:00     NaN     NaN     NaN     1.0     False
2019-05-02 00:35:00     NaN     NaN     NaN     1.0     False
2019-05-02 00:40:00     1.0     NaN     NaN     1.0     True
2019-05-02 00:45:00     NaN     NaN     NaN     1.2     True
2019-05-02 00:50:00     NaN     NaN     NaN     1.5     True
2019-05-02 00:55:00     1.0     NaN     NaN     1.0     False
2019-05-02 01:00:00     NaN     NaN     NaN     1.0     False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...