Как изолировать периоды с выбросами на фрейме данных - PullRequest
1 голос
/ 30 января 2020

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

    id      epoch                      value    duration
958 1819    2018-01-01 00:00:00.000    1        20
959 1820    2018-01-01 00:20:00.000    2        20
960 1821    2018-01-01 00:40:00.000    3        20
961 1822    2018-01-01 01:00:00.000    4        20
962 1823    2018-01-01 01:20:00.000    5        20
963 1824    2018-01-01 01:20:01.000    5.05     0.01
964 1825    2018-01-01 01:40:01.000    6        20
965 1826    2018-01-01 02:00:01.000    7        20
966 1827    2018-01-01 02:00:02.000    7.0012   0.01
967 1828    2018-01-01 02:20:02.000    8        20

Итак, как вы можете видеть, у нас есть значения, которые являются 3-периодическими c, и я хочу нумеровать периоды в новом столбце игнорируя «выбросы», которые имеют очень короткую продолжительность (но не удаляя линию).

Вот что у меня есть:

    id      epoch                      value    duration    period
958 1819    2018-01-01 00:00:00.000    1        20          1
959 1820    2018-01-01 00:20:00.000    2        20          2
960 1821    2018-01-01 00:40:00.000    3        20          3
961 1822    2018-01-01 01:00:00.000    4        20          1
962 1823    2018-01-01 01:20:00.000    5        20          2
963 1824    2018-01-01 01:20:01.000    5.05     0.01        3
964 1825    2018-01-01 01:40:00.000    6        20          1
965 1826    2018-01-01 02:00:01.000    7        20          2
966 1827    2018-01-01 02:00:02.000    7.0012   0.01        3
967 1828    2018-01-01 02:20:02.000    8        20          1

И вот что я хочу:

    id      epoch                      value    duration    period
958 1819    2018-01-01 00:00:00.000    1        20          1
959 1820    2018-01-01 00:20:00.000    2        20          2
960 1821    2018-01-01 00:40:00.000    3        20          3
961 1822    2018-01-01 01:00:00.000    4        20          1
962 1823    2018-01-01 01:20:00.000    5        20          2
963 1824    2018-01-01 01:20:01.000    5.05     0.01        2
964 1825    2018-01-01 01:40:00.000    6        20          3
965 1826    2018-01-01 02:00:01.000    7        20          1
966 1827    2018-01-01 02:00:02.000    7.0012   0.01        1
967 1828    2018-01-01 02:20:02.000    8        20          2

Я уже сделал это с помощью 2 для циклов, но поскольку размер информационного кадра велик, я ищу более быстрый способ сделать это.

Заранее благодарен

Редактировать: I добавлено еще несколько строк. Чтобы быть более понятным: некоторые точки «дублируются» (они имеют почти то же значение, что и предыдущий), так что мне нужно поместить их в тот же период, что и его двойник. Кроме того, я не могу удалить их (может быть временно?), Мне нужно, чтобы они были в окончательном фрейме данных.

1 Ответ

1 голос
/ 30 января 2020

Быстрое решение, учитывая данные, которые вы предоставляете, намного быстрее, чем использование for и учитывая ожидаемый результат, использует np.where():

import pandas as pd
import numpy as np
d = {'value':[1,2,3,4,5,5.05,6],'dur':[20,20,20,20,20,0.01,20],'period':[1,2,3,1,2,3,1]}
df = pd.DataFrame(d)
df['period'] = np.where(df['dur']-df['dur'].astype(int) == 0,df['period'],df['period']-1)
print(df)

Вывод:

   value    dur  period  aux
0   1.00  20.00       1    1
1   2.00  20.00       2    2
2   3.00  20.00       3    3
3   4.00  20.00       1    1
4   5.00  20.00       2    2
5   5.05   0.01       3    2
6   6.00  20.00       1    1
...