cuDF - групповой UDF для поддержки datetime - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть фрейм данных cuDF со следующими столбцами:

columns = ["col1", "col2", "dt"]

(dt) в форме datetime64[ns].

Я хотел бы написать UDF для применения к каждой группе в этом кадре данных и получить максимум dt для каждой группы. Вот то, что я пытаюсь, но похоже, что numba не поддерживает значения datetime64[ns] в UDF.

def f1(dt, out):
   l = len(dt)
   maxvalue = dt[0]
   for i in  range(cuda.threadIdx.x, l, cuda.blockDim.x):
      if dt[i] > maxvalue:
         maxvalue = dt[i]
   out[:0] = maxvalue

gdf = df.groupby(["col1", "col2"], method="cudf")
df = gdf.apply_grouped(f1, incols={"dt": "dt"}, outcols=dict(out=numpy.datetime64))

Вот ошибка, которую я получаю:

This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: Function(<numba.cuda.compiler.DeviceFunctionTemplate object at 0x7effda063510>)
[2] During: typing of call at <string> (10)

У меня есть аналогичные функции, которые отлично работают с целыми числами и числами с плавающей точкой. Значит ли это, что numba не поддерживает datetime?

1 Ответ

0 голосов
/ 09 апреля 2020

Apply_groups не даст вам то, что я думаю, что вы после, что групповое на макс dt. Вам нужно было использовать aggs с макс. На dt. Групповые функции Кадфа сделали бы все остальное. Чтобы получить ваши значения в datetime64[ms], вы используете astype() и сохраняете его обратно на фрейм данных (очень быстро). См. Мой пример:

import cudf
a = cudf.DataFrame({"col1": [1, 1, 1, 2, 2, 2], "col2": [1, 2, 1, 1, 2, 1], "dt": [10000000, 2000000, 3000000, 100000, 2000000, 40000000]}) 
a['dt'] = a['dt'].astype('datetime64[ns]')
print(a)
a['dt'] = a['dt'].astype('datetime64[ms]')
print(a)
gdf = a.groupby(["col1", "col2"]).agg({'dt':'max'})
print(gdf.head())

dt значения столбцов будут отформатированы в интервале 0,1-40 миллисекунд в виде наносекунд с 1 января 1970 года, что даст вам отпечаток

   col1  col2                         dt
0     1     1 1970-01-01 00:00:00.010000
1     1     2 1970-01-01 00:00:00.002000
2     1     1 1970-01-01 00:00:00.003000
3     2     1 1970-01-01 00:00:00.000100
4     2     2 1970-01-01 00:00:00.002000
5     2     1 1970-01-01 00:00:00.040000

   col1  col2                      dt
0     1     1 1970-01-01 00:00:00.010
1     1     2 1970-01-01 00:00:00.002
2     1     1 1970-01-01 00:00:00.003
3     2     1 1970-01-01 00:00:00.000
4     2     2 1970-01-01 00:00:00.002
5     2     1 1970-01-01 00:00:00.040

                               dt
col1 col2                        
1    1    1970-01-01 00:00:00.010
     2    1970-01-01 00:00:00.002
2    1    1970-01-01 00:00:00.040
     2    1970-01-01 00:00:00.002
...