Итак, у меня есть такой фрейм данных:
[5232 rows x 2 columns]
0 2
0
2018-02-01 00:00:00 2018-02-01 00:00:00 435.24
2018-02-01 00:30:00 2018-02-01 00:30:00 357.12
2018-02-01 01:00:00 2018-02-01 01:00:00 301.32
2018-02-01 01:30:00 2018-02-01 01:30:00 256.68
2018-02-01 02:00:00 2018-02-01 02:00:00 245.52
2018-02-01 02:30:00 2018-02-01 02:30:00 223.20
2018-02-01 03:00:00 2018-02-01 03:00:00 212.04
2018-02-01 03:30:00 2018-02-01 03:30:00 212.04
2018-02-01 04:00:00 2018-02-01 04:00:00 212.04
2018-02-01 04:30:00 2018-02-01 04:30:00 212.04
2018-02-01 05:00:00 2018-02-01 05:00:00 223.20
2018-02-01 05:30:00 2018-02-01 05:30:00 234.36
И что я могу сейчас сделать, это заменить часть значений (скажем, 10% случайным образом на NaN
:
df_missing.loc[df_missing.sample(frac=0.1, random_state=100).index, 2] = np.NaN
То, что я хотел бы сделать, это сделать то же самое, но со случайными блоками размера x, скажем, 10% данных должны быть заблокированы NaN
.
Например, если размер блока равен 4, а доля равна 30%, приведенный выше кадр данных может выглядеть следующим образом:
[5232 rows x 2 columns]
0 2
0
2018-02-01 00:00:00 2018-02-01 00:00:00 435.24
2018-02-01 00:30:00 2018-02-01 00:30:00 357.12
2018-02-01 01:00:00 2018-02-01 01:00:00 NaN
2018-02-01 01:30:00 2018-02-01 01:30:00 NaN
2018-02-01 02:00:00 2018-02-01 02:00:00 NaN
2018-02-01 02:30:00 2018-02-01 02:30:00 NaN
2018-02-01 03:00:00 2018-02-01 03:00:00 212.04
2018-02-01 03:30:00 2018-02-01 03:30:00 212.04
2018-02-01 04:00:00 2018-02-01 04:00:00 212.04
2018-02-01 04:30:00 2018-02-01 04:30:00 212.04
2018-02-01 05:00:00 2018-02-01 05:00:00 223.20
2018-02-01 05:30:00 2018-02-01 05:30:00 234.36
Я понял, что могу получить количество блоков с помощью:
number_of_samples = int((df.shape[0] * proporition) / block_size)
Но я не могу понять, как на самом деле создать недостающие блоки.
Я видел этот вопрос, который полезен, но имеет два предостережения:
- Он не изменяет исходный кадр данных со значениями NaN, а только возвращает образцы.
- Нет гарантии, что образцы не будут перекрываться (чего в идеале я бы хотел избежать)
Может ли кто-нибудь объяснить, как преобразовать этот ответ для указанных выше пунктов (или объяснить другое решение)?