#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 на этом сайте, скорее всего, получат ваш вопрос в своей ленте.