Как динамически указать начало и конец набора условий в пределах DataFrame? - PullRequest
0 голосов
/ 12 февраля 2019

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

  1. Найти самую раннюю дату, когда запись представляет собой 1(1/3/2019) и пометьте окно как 1.
  2. Окно остается 1 до тех пор, пока выход не станет равным 1 (05.01.2009).
  3. Окно становится 0, пока не найдет следующее значениезаписи, равной 1 (1/8/2019).
  4. Процесс повторяется до самой последней даты в DataFrame.

Так что для столбца Window должен следовать выходзапись или для каждой записи в конечном итоге будет выход (см. пример ниже).Также обратите внимание, что индекс даты находится в обратном порядке.

df = pd.DataFrame({'C1':[5,3,4,5,4,2,1,4,5,4,2,3],
                    'C2':[3,3,2,3,4,1,3,2,3,5,3,3]},
                   index = pd.date_range('1/1/2019',periods = 12))
df1 = df.iloc[::-1]

# Create function to add entry and exit criteria
def window_range(df):
    crit1 = ((df['C1'] >2) & (df['C1'].shift(-1) < df['C1']))
    crit2 = (df['C2'].shift(-1)==3)
    entry = crit1&crit2
    df['Entry'] = np.where(entry,1,0)
    exit = (df['C1'] < df['C1'].shift(-1))
    df['Exit'] = np.where(exit,1,0)
    return df
df2 = window_range(df1)
df2
# The Column I'd like to add
window = list([1,0,1,1,1,0,0,1,1,1,0,0])
df2['window'] = pd.Series(window, index=df2.index)
df3 = df2
# Desired Final Output
df3

enter image description here

1 Ответ

0 голосов
/ 12 февраля 2019

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

df = pd.DataFrame({'C1':[5,3,4,5,4,2,1,4,5,4,2,3],
                    'C2':[3,3,2,3,4,1,3,2,3,5,3,3]},
                   index = pd.date_range('1/1/2019',periods = 12))

df2 = window_range(df)  # using your func

res, window = [], False
for row in df2.iterrows():
    if row[1]['Entry']:
        window = True
    if row[1]['Exit']:
        window = False
    res.append(window)
df2['window'] = numpy.array(res).astype(int)
df2


           C1  C2 Entry Exit window
2019-01-01  5   3   1   0   1
2019-01-02  3   3   0   1   0
2019-01-03  4   2   0   1   0
2019-01-04  5   3   0   0   0
2019-01-05  4   4   0   0   0
2019-01-06  2   1   0   0   0
2019-01-07  1   3   0   1   0
2019-01-08  4   2   0   1   0
2019-01-09  5   3   0   0   0
2019-01-10  4   5   1   0   1
2019-01-11  2   3   0   1   0
2019-01-12  3   3   0   0   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...