Как пересчитать данные с границами для каждой группы? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть много данных о двух переменных Var1 и Var2 в разных контекстах (пространство и время), которые я хочу просматривать через регулярные интервалы времени (этот интервал времени зависит от имени) с постоянной частотой (скажем, 1 секунда)).

Вот мой фрейм данных:

Name    Date          DatetimeUtc         Var1 Var2     StartTimeWanted EndTimeWanted      
Zeus 2018-01-02 2018-01-02 16:20:00.0840  1.0  2.5  2018-01-02 16:20:00   2018-01-02 16:30:00
Zeus 2018-01-04 2018-01-04 16:20:01.1470  0.1  1.7  2018-01-04 16:20:00   2018-01-04 16:30:00
Zeus 2018-01-04 2018-01-04 16:20:01.1490  1.4  0.1  2018-01-04 16:20:00   2018-01-04 16:30:00
Zeus 2018-01-04 2018-01-04 16:28:00.0010  1.4  2.9  2018-01-04 16:20:00   2018-01-04 16:30:00
....
Iris 2018-01-02 2018-01-02 16:21:32.0840  1.2  4.1  2018-01-02 16:00:00   2018-01-02 16:45:00
Iris 2018-01-06 2018-01-06 16:22:00.5487  4.1  0.1  2018-01-06 16:00:00   2018-01-06 16:45:00
Iris 2018-01-06 2018-01-06 16:22:00.9784  4.5  4.1  2018-01-06 16:00:00   2018-01-06 16:45:00
....

Я хотел бы следующий вывод:

Name     Date     BucketID  AverageVar1 AverageVar2
Zeus  2018-01-02  16:20:00     1.0         2.5
Zeus  2018-01-02  16:20:01     NaN         NaN
Zeus  2018-01-02  16:20:02     NaN         NaN
...
Zeus  2018-01-02  16:29:59     NaN         NaN
Zeus  2018-01-04  16:20:00     NaN         NaN
Zeus  2018-01-04  16:20:01     0.75        0.9
...
Zeus  2018-01-04  16:28:00     1.4         2.9
...
Zeus  2018-01-04  16:29:59     NaN         NaN
Iris  2018-01-02  16:00:00     NaN         NaN
Iris  2018-01-02  16:00:01     NaN         NaN
...
Iris  2018-01-02  16:21:32     1.2         4.1
...
Iris  2018-01-02  16:44:59     NaN         NaN
Iris  2018-01-06  16:00:00     NaN         NaN
...
Iris  2018-01-06  16:22:00     4.3         2.1
Iris  2018-01-06  16:22:01     NaN         NaN
...
Iris  2018-01-06  16:44:59     NaN         NaN

И в идеале я хотел бы заменить NaN на самые последние значениякогда это возможно:

Name     Date     BucketID  AverageVar1 AverageVar2
Zeus  2018-01-02  16:20:00     1.0         2.5
Zeus  2018-01-02  16:20:01     1.0         2.5
Zeus  2018-01-02  16:20:02     1.0         2.5
...
Zeus  2018-01-02  16:29:59     1.0         2.5
Zeus  2018-01-04  16:20:00     NaN         NaN
Zeus  2018-01-04  16:20:01     0.75        0.9
...
Zeus  2018-01-04  16:28:00     1.4         2.9
...
Zeus  2018-01-04  16:29:59     1.4         2.9
Iris  2018-01-02  16:00:00     NaN         NaN
Iris  2018-01-02  16:00:01     NaN         NaN
...
Iris  2018-01-02  16:21:32     1.2         4.1
...
Iris  2018-01-02  16:44:59     1.2         4.1
Iris  2018-01-06  16:00:00     NaN         NaN
...
Iris  2018-01-06  16:22:00     4.3         2.1
Iris  2018-01-06  16:22:01     4.3         2.1
...
Iris  2018-01-06  16:44:59     4.3         2.1

Примечание: я хотел бы использовать только векторизованные функции, а не циклы, потому что объем данных очень высок.

Я пробовал:

data_frame.set_index("DatetimeUtc").groupby(["Name", "Date", pd.Grouper(key="DatetimeUtc", freq="1s")])["Var1", "Var2"].mean().fillna(method="bfill").reset_index()

Это работает довольно хорошо, но BucketID начинается с первого DatetimeUtc группы, а не StartTimeWanted.То же самое для конца ... Но есть большая проблема: контейнеры не создаются, когда вокруг нет данных (другими словами, в выводе нет NaN).

Итак, я попытался:

data_frame.set_index("DatetimeUtc").groupby(["Name", "Date"])["Var1", "Var2"].resample("1s").mean().fillna(method="bfill").reset_index()

И это решает проблему не создаваемых сегментов, когда вокруг нет данных (теперь у меня есть NaN, как я и хотел).

Тем не менее, у меня все еще есть проблема, чтобы заставить повторную выборку начинаться в StartTimeWanted и заканчиваться в EndTimeWanted.Я понятия не имею, как использовать эти значения.Я частично решил проблему для EndTimeWanted, отбросив данные, где BucketID находится после EndTimeWanted.Но создание сегментов между StartTimeWanted и моим первым datetime для каждой группы кажется более сложным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...