Как уменьшить частоту данных временных рядов в пандах? - PullRequest
0 голосов
/ 19 октября 2018

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

id    time    value
 1       0        2
 1       1        4
 1       2        5
 1       3       10
 1       4       15
 1       5       16
 1       6       18
 1       7       20
 2      15        3
 2      16        5
 2      17        8
 2      18       10
 4       6        5
 4       7        6

Я хочу время понижающей дискретизации от 1 минуты до 3 минут для каждого идентификатора группы.И значение является максимумом группы (идентификатор и 3 минуты).

Выходные данные должны быть такими:

id    time    value
 1       0        5
 1       1       16
 1       2       20
 2       0        8
 2       1       10
 4       0        6

Я попытался зациклить, это займет много времени.

Любая идея, как решить эту проблему для больших данных?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы можете преобразовать вашу серию time в фактическую timedelta, а затем использовать resample для векторизованного решения:

t = pd.to_timedelta(df.time, unit='T')
s = df.set_index(t).groupby('id').resample('3T').last().reset_index(drop=True)
s.assign(time=s.groupby('id').cumcount())

   id  time  value
0   1     0      5
1   1     1     16
2   1     2     20
3   2     0      8
4   2     1     10
5   4     0      6
0 голосов
/ 19 октября 2018

Используйте np.r_ и .iloc с groupby:

df.groupby('id')['value'].apply(lambda x: x.iloc[np.r_[2:len(x):3,-1]])

Вывод:

id    
1   2      5
    5     16
    7     20
2   10     8
    11    10
4   13     6
Name: value, dtype: int64

Пройдем немного дальше с именами столбцов и т. Д.

df_out = df.groupby('id')['value']\
           .apply(lambda x: x.iloc[np.r_[2:len(x):3,-1]]).reset_index()
df_out.assign(time=df_out.groupby('id').cumcount()).drop('level_1', axis=1)

Выход:

   id  value  time
0   1      5     0
1   1     16     1
2   1     20     2
3   2      8     0
4   2     10     1
5   4      6     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...