-1

我正在尝试使用代码(在下面的链接中提供)将纬度/经度坐标映射到纽约市行政区:

https://www.kaggle.com/muonneutrino/nyc-taxis-eda-and-mapping-position-to-borough

我正在处理低内存本地 Jupyter 环境,因此我已将带有 Taxi lat/long 数据的大型 .csv 文件导入到 dask 数据框中。

首先,我使用此处找到的 2016 年 6 月 Yellow Cab 数据创建了一个 dask 数据框:并将子集设置为 atest_day以使集合更小:

import pandas as pd
import dask.dataframe as dd
import dask.array as da

from dask.distributed import Client
client = Client(processes=False)
%pylab inline

cols= ['pickup_longitude', 'pickup_latitude', 'tpep_pickup_datetime',]
ddf = dd.read_csv('yellow_tripdata_2016-06.csv',blocksize=13e7,assume_missing=True, usecols=cols)
ddf['tpep_pickup_datetime'] = dd.to_datetime(ddf.tpep_pickup_datetime, errors='ignore')
ddf['pickup_day'] = ddf.tpep_pickup_datetime.dt.day
td = ddf.loc[ddf.pickup_day == 10]
td = td.rename(columns={'pickup_longitude':'plon',
                    'pickup_latitude':'plat'} )

我首先声明值 latmin、lonmin、latmax 和 lonmax 并创建 numpy 数组 map_tracts:

xmin = 40.48
ymin = -74.28
xmax = 40.93
ymax = -73.65
dlat = (xmax-xmin) / 199
dlon = (ymax-ymin) / 199
td['lat_idx'] = (np.rint((td['plat'] - latmin) / dlat))
td['lon_idx'] = (np.rint((td['plon'] - lonmin) / dlon ))  
map_tracts = ([[34023007600, 34023007600, 34023007500, 34031246300,
        34031246300, 34031246300],
       [34023007600, 34023007600, 34023007600, 34031246300,
        34031246300, 34031246300],
       [34023007600, 34023007600, 34023007600, 34031246300,
        34031246300, 34031246300],
       [          0,           0,           0, 36059990200,
        36119007600, 36119007600],
       [          0,           0,           0, 36059990200,
        36059990200, 36119007600]])

然后我尝试运行一个 dask 数组 where 子句:

td['pu_tracts'] = da.where(((xmin < td.plat < xmax) & 
                            (ymin < td.plong < ymin)),
                            (map_tracts[td.lat_idx, td.lon_idx]),0)

但是收到一个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-24-5228e3ec653a> in <module>
----> 1 td['pu_tracts'] = np.where(((xmin < td.plat < xmax) & 
      2                                  (ymin < td.plong < ymin)),
      3                                  (map_tracts[td_day.lat_idx, td.lon_idx]),0)

~/anaconda3/lib/python3.7/site-packages/dask/dataframe/core.py in __bool__(self)
    441         raise ValueError("The truth value of a {0} is ambiguous. "
    442                          "Use a.any() or a.all()."
--> 443                          .format(self.__class__.__name__))
    444 
    445     __nonzero__ = __bool__  # python 2

ValueError: The truth value of a Series is ambiguous. Use a.any() or a.all().

这是一个问题吗?

4

1 回答 1

2

更新:在 OP 的代码和 MCVE 反复来回之后,结果证明map_tracts[lon_idx,lat_idx]它甚至不是一个函数,而是一个dask.DataFrame或可能是一个np.ndarray(OP:它是什么?!type(map_tracts[lon_idx,lat_idx])请给我们看看。)

UPDATE2:map_tracts[lon_idx,lat_idx]甚至dask.DataFrame/Series都不是,它是从切片(numpy.ndarray)中获得的单个(numpy)值map_tracts,然后OP从这些列表理解中构建一个np.ndarray。

如果要将 numpy 数组返回到 dask DataFrame,则可能需要将其包装为dask.DataFrame包含单个系列的另一个(参见 dask 文档)。


我没有使用过 dask,但是您的例外情况下的快速 Google 在 github 上发现了以下 dask 已知问题(已关闭,不会修复):

#4429: 将 dask.DataFrame 与 dask.Series 加入 “有人可以告诉我如何将 dask 数据帧与 dask 系列对象加入。”

建议“尝试to_frame方法”已关闭(大概不会修复)。

您的函数get_tract又调用map_tracts了您没有提供代码的函数(那是第三方库吗?numpy 调用?您自己的一些代码您没有显示?)关键是我们看不到它的返回类型是否为dask.Series, dask.DataFrame, numpy.ndarray, pandas.Series, 基本 Python 列表等。这很重要。

解决方案:假设map_tracts()返回 a dask.Series,您可能需要通过调用来包装它dask.Series._to_frame()

他们永远不会修复这些甚至不让它们开放以供将来版本考虑的态度听起来很弱,您应该对该问题发表评论,尝试重新打开(包括指向此 SO 问题的链接),我也建议在他们身上打开一个 dask docbug,至少他们的文档需要显示如何正确执行此操作的代码示例;合并列是相当基本的东西。

(老实说,Databricks 最近(4/2019)推出了koalas作为 pandas 的 Spark 替代品,所以我预计一部分性能关键的 Python/pandas 用户切换到 dask 可能会迁移到 Spark/koalas。)

于 2019-06-28T19:42:17.997 回答