Тест Pandas повторного появления значений на основе периода прокатки - PullRequest
0 голосов
/ 10 мая 2018
import pandas as pd
import numpy as np
df = pd.DataFrame()
df['ColN']=['AAA', 'AAA', 'AAA', 'AAA', 'ABC']
df['ColN_dt']=['03-01-2018', '03-04-2018', '03-05-2018', \
           '03-08-2018', '03-12-2018']
df['ColN_ext']=['A', 'B', 'B', 'B', 'B']
df['ColN_dt'] = pd.to_datetime(df['ColN_dt'])

Я пытаюсь решить следующую проблему на основе приведенного выше кадра данных: в течение, скажем, 5 дней, я хочу проверить, появляются ли значения ColN_ext до и после определенной строки по группе ColN.

т.е. Я пытаюсь создать флаг: df['flag'] = [NaN, 0, 1, NaN, NaN]. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 11 мая 2018

Я смог сделать это, определив пользовательскую функцию:

import numpy as np
import pandas as pd

flag_list = []

def create_flag(dt, lookupdf):
    stdt = dt - lkfwd
    enddt = dt + lkfwd
    bckset_ext = set(lookupdf.loc[(lookupdf['ColN_dt'] >= stdt) & \
                 (lookupdf['ColN_dt'] < dt)]['ColN_ext'])
    fwdset_ext = set(lookupdf.loc[(lookupdf['ColN_dt'] > dt) & \
                 (lookupdf['ColN_dt'] <= enddt)]['ColN_ext'])
    flag_list.append(bool(bckset_ext.intersection(fwdset_ext)))
    return None

# Define the rolling days
lkfwd = pd.Timedelta(days=5)
df = pd.DataFrame()
df['ColN']=['AAA', 'AAA', 'AAA', 'AAA', 'AAA', 'AAA', 'AAA', 'ABC']
df['ColN_dt']=['03-12-2018', '03-13-2018', '03-13-2018', '03-01-2018', '03-05-2018', '03-04-2018', '03-08-2018', '02-04-2018']
df['ColN_ext']=['A', 'B', 'A', 'A', 'B', 'B', 'C', 'A']

df['ColN_dt'] = pd.to_datetime(df['ColN_dt'])
dfs = df.sort_values(by=['ColN', 'ColN_dt']).reset_index(drop=True)

dfg = dfs.groupby('ColN')

for _, grpdf in dfg:
    grpdf['ColN_dt'].apply(create_flag, args=(grpdf,))

dfs['flag'] = flag_list

Это генерирует: dfs['flag'] = [False, False, False, True, False, False, False, False]

Я сейчас пытаюсь добиться того же, используя pandas.groupby + rolling + (может быть) resample

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...