1 или 0 на основе значений в другом столбце? [python]

#python #indexing #rolling-computation #threshold

Вопрос:

Я пытаюсь добавить столбец в фрейм данных, основанный на другом столбце в этом фрейме данных, где значения напрямую соответствуют другому столбцу. У меня много проблем с тем, чтобы хорошо сформулировать это, поэтому я просто продемонстрирую. Я работаю на Python.

У меня есть следующий фрейм данных:

            DateTime      Value
--------------------------------
2015-03-11 06:00:00          1
2015-03-11 07:00:00          2
2015-03-11 08:00:00          2
2015-03-11 09:00:00          3
2015-03-11 10:00:00          3
2015-03-11 11:00:00          2
2015-03-11 12:00:00          4
2015-03-11 13:00:00          6
2015-03-11 14:00:00          5
2015-03-11 15:00:00          3
2015-03-11 16:00:00          3
2015-03-11 17:00:00          2
2015-03-11 18:00:00          1
...
 

Теперь я хочу добавить столбец в этот фрейм данных, основанный на столбце «Значение», который называется «Value_2». Я хочу, чтобы «Value_2» отображал все значения «1», а затем находил первый экземпляр 3 или более последовательных значений >= 4 (по сути, пороговое значение), отображал значения «1» в течение первых 2 из этих 3 часов, а затем создавал все значения «0» и далее, вот так:

            DateTime      Value       Value_2
---------------------------------------------
2015-03-11 06:00:00          1             1  
2015-03-11 07:00:00          2             1
2015-03-11 08:00:00          2             1
2015-03-11 09:00:00          3             1
2015-03-11 10:00:00          3             1
2015-03-11 11:00:00          2             1 
2015-03-11 12:00:00          4             1
2015-03-11 13:00:00          6             1
2015-03-11 14:00:00          5             0
2015-03-11 15:00:00          3             0  
2015-03-11 16:00:00          3             0
2015-03-11 17:00:00          2             0  
2015-03-11 18:00:00          1             0  
...
 

Это будет представлять значение «допуска» в 2 часа, после чего еще несколько часов (последовательно) значений >= 4 приведут ко всем 0 и далее. Я пытаюсь создать код, чтобы я мог легко изменить это значение «допуска» от 2 часов до 3 часов (это означает, что после первых последовательных 3 значений >= 4 одно дополнительное последовательное значение >>= 4 приведет ко всем 0 и далее), примерно так:

            DateTime      Value       Value_2
---------------------------------------------
2015-03-11 06:00:00          1             1  
2015-03-11 07:00:00          2             1
2015-03-11 08:00:00          2             1
2015-03-11 09:00:00          3             1
2015-03-11 10:00:00          3             1
2015-03-11 11:00:00          2             1 
2015-03-11 12:00:00          4             1
2015-03-11 13:00:00          6             1
2015-03-11 14:00:00          5             1
2015-03-11 15:00:00          4             0  
2015-03-11 16:00:00          3             0
2015-03-11 17:00:00          2             0  
2015-03-11 18:00:00          1             0  
...
 

Я хотел бы иметь возможность изменить это значение «допуска» на любое число. И под «допуском» я просто подразумеваю, сколько последовательных строк значений >= 4 в столбце «Значение» может быть переведено в 1 в столбце «Значение 2», прежде чем они станут всеми 0 и далее.

Можно ли это сделать простым способом в python? До сих пор у меня есть следующее благодаря очень полезному предложению, которое я получил:

 df['helper'] = np.where(df["Value"] >= 4, 1, 0)
tolerance = 3
df['helper_sum'] = df['helper'].rolling(tolerance, min_periods=1).sum()
first_index = df.loc[df['helper_sum']==tolerance,'helper_sum'].index[0]
df['value_2'] = 0 
df.loc[df.index<=first_index, 'value_2'] = 1
 

Это работает. Однако, когда я изменяю свой порог >= 4 на >>= 7, я получаю следующую ошибку:

 IndexError: index 0 is out of bounds for axis 0 with size 0
 

Я полагаю, что это связано с тем, что в моем коротком наборе данных здесь нет значений >= 7, и поэтому код просто не понимает >>= 7, но я не уверен. Я хотел бы исправить код, чтобы он мог работать для любого порогового значения, даже если это значение не содержится в наборе данных. Для порога >= 7 я ожидал бы, что столбец > Value_2 будет содержать только 0 до конца, так как значение >= 7, конечно, никогда не встречается. Можно ли это исправить?

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

1. Что это за язык такой?

2. Ах, извините, спасибо, что указали на это. Я просто отредактировал вопрос. Это Питон.

3. Вы должны пометить его как [python]. Тогда эксперты по Python на этом сайте, скорее всего, получат ваш вопрос в своей ленте.