Dask databrame groupby завершается с ошибкой типа, но идентичный pandas groupby завершается успешно - PullRequest
0 голосов
/ 16 марта 2020

Я создал фрейм данных dask из гео pandas фьючерсов, каждый из которых дает pandas фрейм данных, следуя приведенному ниже примеру: https://gist.github.com/mrocklin/e7b7b3a65f2835cda813096332ec73ca

daskdf = dd.from_delayed(lazy_dataframes,lazy_dataframes, meta=lazy_dataframes[0].compute())

Все dtypes представляются разумными

daskdf.dtypes
left          float64
bottom        float64
right         float64
top           float64
score          object
label          object
height        float64
area          float64
geometry     geometry
shp_path       object
geo_index      object
Year            int64
Site           object
dtype: object

, но операции dd groupby не выполняются

daskdf.groupby(['Site']).height.mean().compute()
...
"/Users/ben/miniconda3/envs/crowns/lib/python3.7/site-packages/dask/dataframe/utils.py", line 577, in _nonempty_series
    data = np.array([entry, entry], dtype=dtype)
builtins.TypeError: data type not understood

, тогда как pandas не имеет проблем с тем же процессом на тех же данных.

daskdf.compute().groupby(['Site']).height.mean()
Site
SOAP    15.102355
Name: height, dtype: float64

Что может здесь происходит с типами метаданных, которые могут вызвать это. Поскольку я масштабирую свой рабочий процесс, я хотел бы выполнять распределенные операции над постоянными данными.

1 Ответ

0 голосов
/ 16 марта 2020

Проблема в том, что тип геометрии происходит от geo pandas. Мой pandas dataframe был получен при загрузке шейп-файла с использованием geo pandas .read_file (). Будущие пользователи, будьте осторожны, пропустите этот столбец при создании dask-фрейма данных. Я знаю, что когда-то была попытка 1010 * в стиле dask-geo go. За этим было труднее следовать, поскольку утверждение

daskdf.groupby(['Site']).height.mean().compute()

не включает столбец геометрии. Dask должен проверить dtypes всех столбцов, а не только те, которые используются в операции. Будьте осторожны!

Удаление столбца геометрии дает ожидаемый результат.

daskdf.drop(columns="geometry")
daskdf.groupby(['Site']).height.mean().compute()

Пометка с помощью geo pandas в надежде, что будущие пользователи смогут найти это.

...