Pandas 多处理代码中的错误 - 数据帧不可调用

温比

我正在尝试使用多处理优化大文件的距离计算。我设计了下面的代码,但谁能解释为什么它会抛出错误 ['DataFrame' object is not callable]?

这似乎与 parallelize_dataframe 中的“map”有关,可能是由于我设计 test_func 的方式造成的,但不确定如何解决。在此先感谢您的帮助。

import multiprocessing as mp

nearest_calc3 = None
nearest_calc3 = postcodes.head(1000).copy() # Test top 1000

partitions = 5
cores = mp.cpu_count()

def parallelize_dataframe(data, func):
    data_split = np.array_split(data, partitions)
    pool = mp.Pool(cores)
    data = pd.concat(pool.map(func, data_split)) # <-- Problem here?
    pool.close()
    pool.join()
    return data

def nearest(inlat1, inlon1, inlat2, inlon2, store, postcode):
    lat1 = np.radians(inlat1)
    lat2 = np.radians(inlat2)
    longdif = np.radians(inlon2 - inlon1)
    r = 6371.1009 # gives d in kilometers
    d = np.arccos(np.sin(lat1)*np.sin(lat2) + np.cos(lat1)*np.cos(lat2) * np.cos(longdif)) * r
    near = pd.DataFrame({'store': store, 'postcode': postcode, 'distance': d})
    near_min = near.loc[near['distance'].idxmin()]
    x = str(near_min['store']) + '~' + str(near_min['postcode']) + '~' + str(near_min['distance'])
    return x

def test_func(data, stores): # <-- Or maybe here?
    data['appended'] = data['lat'].apply(nearest, args=(data['long'], stores['lat'], stores['long'], stores['index'], stores['pcds']))
    data[['store','store_postcode','distance_km']] = data['appended'].str.split("~",expand=True)
    return data

if __name__ == '__main__':
    test = parallelize_dataframe(nearest_calc3, test_func(nearest_calc3, stores))

以及完整的错误:

---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 121, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 44, in mapstar
    return list(map(*args))
TypeError: 'DataFrame' object is not callable
"""

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
<ipython-input-21-501c0f76106a> in <module>
     32 #x = test_func(nearest_calc3, stores)
     33 
---> 34 test = parallelize_dataframe(nearest_calc3, test_func(nearest_calc3, stores))

<ipython-input-21-501c0f76106a> in parallelize_dataframe(data, func)
      9     data_split = np.array_split(data, partitions)
     10     pool = mp.Pool(cores)
---> 11     data = pd.concat(pool.map(func, data_split))
     12     pool.close()
     13     pool.join()

~\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py in map(self, func, iterable, chunksize)
    266         in a list that is returned.
    267         '''
--> 268         return self._map_async(func, iterable, mapstar, chunksize).get()
    269 
    270     def starmap(self, func, iterable, chunksize=None):

~\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py in get(self, timeout)
    655             return self._value
    656         else:
--> 657             raise self._value
    658 
    659     def _set(self, i, obj):

TypeError: 'DataFrame' object is not callable
M. 播放器

问题出在最后一行:

test = parallelize_dataframe(nearest_calc3, test_func(nearest_calc3, stores))

test_func(...)将返回一个数据帧,然后将其传递到parallelize_dataframe. 但是这个函数需要一个可调用的。

你想要这样的东西:

test = parallelize_dataframe(nearest_calc3, test_func)

当你想一直通storestest_funcnearest_calc3,你可以使用partial这样做:

test_func_with_stores = functools.partial(test_func, stores)

test_func_with_stores然后是一个带有单个参数的可调用对象。不幸的是从左到右partial 填充参数,所以你必须改变test_funcstores是第一个参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型错误“类”对象不可调用

Python / Pandas TypeError:“列表”对象不可调用

Python pandas DataFrame中的“ TypeError:'dict'对象不可调用”

通过分组汇总数据时出现“无法创建对不可调用对象的调用”错误

AnsibleModule对象不可调用错误

'NoneType'对象不可调用Python Pandas Dataframe

sympy错误“符号”对象不可调用

熊猫数据框:df.shape引发错误“ TypeError:'tuple'对象不可调用”

Python:pandas数据帧上的多处理错误:客户端具有非平凡的状态,该状态是本地的且无法修复

类型错误:“布尔”对象不可调用

类型错误:Int对象不可调用

错误reversed():列表不可调用

Spark中HiveContext的数据框不可调用

获取错误列表不可调用

固定错误实例对象不可调用

“列表”对象在 Python Pandas 中不可调用

出现错误;“int”对象不可调用

python pandas dict对象不可调用,解析json

重采样(反采样)在 Pandas 数据帧上产生不可预测的错误

类型错误:“生成器”对象不可调用。尝试迭代字符串数据时

类型错误:“DataFrame”对象不可调用 - 触发数据框

类型错误:“StringVar”对象不可调用

类型错误:“条目”对象不可调用

类型错误:“ShiftSerializer”对象不可调用

类型错误:“球”对象不可调用?

类型错误:“IndicesClient”对象不可调用

如何修复多处理器类型错误:“列表”对象不可调用

类型错误:“WebElement”对象不可调用

类型错误:int 对象不可调用