У меня есть DataFrame, в котором есть столбец, состоящий из групп значений 1
и 0
(проиндексированных по рабочим дням). Пример в виде массива приведен ниже.
x = np.array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0.,
0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0.,
0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1.])
Я пытаюсь применить некоторую функцию к каждой группе 1
. В этом случае каждая группа из 1
затухает в соответствии с некоторой экспоненциальной функцией. В настоящее время я определил следующее для достижения этой цели.
# Find where the array switches from 1 to 0 and vice versa.
# prepend was used to maintain the original array size.
change = np.abs(np.diff(x, prepend=x[0]))
# split the array into groups of `1` and `0` values.
split = np.split(x, np.flatnonzero(change))
# transform groups of 1's to np.arange
_range = [np.arange(arr.size) if arr[0] == 1 else arr for arr in split]
# concatenate the transformed arrays
new_x = np.concatenate([np.exp(-arr) if arr[-1] != 0 else arr for arr in _range])
Предоставление следующего (используя .round(3)
)
array([1. , 0.368, 0.135, 0.05 , 0.018, 0.007, 0.002, 0.001, 0. , 0. , 0. , 0. , 0. , 0.
, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 1. ,
0.368, 0.135, 0.05 , 0.018, 0.007, 0.002, 0.001, 0. , 0. ,0. , 0. , 0. , 0. , 0.
, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,0. , 0. , 0. , 0. , 0.
, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.
, 1. , 0.368, 0.135, 0.05 , 0.018])
Есть ли лучший способ использовать панды или numpy дляsplit-apply-Объединить столбец DataFrame, но «перезапустить» некоторые функции для каждой отдельной группы / окна значений? Как упоминалось выше, данные представляют собой временные ряды, поэтому каждая группа из 1
или 0
определяет начало и конец нового, но схожего процесса.