Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中的并行排列(熊猫或dask)_Python_Multiprocessing_Itertools_Dask - Fatal编程技术网

Python 数据帧中的并行排列(熊猫或dask)

Python 数据帧中的并行排列(熊猫或dask),python,multiprocessing,itertools,dask,Python,Multiprocessing,Itertools,Dask,我需要在一个数据帧中按列计算所有可能的行差异排列 使用itertools置换是可行的,但对于大小问题,我需要解决的时间太长了。使用多处理时出错。假设错误有一个解决方案,“多处理”是一种最佳方式还是dask有办法解决规模问题 #我天真的方法 作为pd进口熊猫 将numpy作为np导入 从itertools导入置换 列=列表(范围(1,50)) 索引=列表(范围(1,10)) df=pd.DataFrame(index=index,columns=columns,data=np.random.ran

我需要在一个数据帧中按列计算所有可能的行差异排列

使用itertools置换是可行的,但对于大小问题,我需要解决的时间太长了。使用多处理时出错。假设错误有一个解决方案,“多处理”是一种最佳方式还是dask有办法解决规模问题

#我天真的方法
作为pd进口熊猫
将numpy作为np导入
从itertools导入置换
列=列表(范围(1,50))
索引=列表(范围(1,10))
df=pd.DataFrame(index=index,columns=columns,data=np.random.randn(len(index),len(columns)))
count_perm=列表(排列(df.索引,2))
比较\u df=pd.DataFrame(columns=df.columns)
对于排列中的a,b(df.索引,2):
比较_df.loc['({}{})'.format(a,b)]=df.loc[a]-df.loc[b]
#我的多重处理尝试
作为pd进口熊猫
将numpy作为np导入
从itertools导入置换
从multiprocessing.dummy导入池作为线程池
列=列表(范围(15000))
索引=列表(范围(1100))
df=pd.DataFrame(index=index,columns=columns,data=np.random.randn(len(index),len(columns)))
count_perm=列表(排列(df.索引,2))
池=线程池(4)#线程数
比较\u df=pd.DataFrame(columns=df.columns)
aux_val=[(a,b)表示置换中的a,b(df.index,2)]
def op(tupx):
比较_df.loc[”({}',{}')。格式(tupx[0],tupx[1])]=(df.loc[tupx[0]]-df.loc[tupx[1]]
池图(操作,辅助值)
错误:

Traceback (most recent call last):

  File "<ipython-input-69-20c917ebefd7>", line 30, in <module>
    pool.map(op, aux_val)

  File "/home/justaguy/anaconda3/lib/python3.7/multiprocessing/pool.py", line 268, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()

  File "/home/justaguy/anaconda3/lib/python3.7/multiprocessing/pool.py", line 657, in get
    raise self._value

  File "/home/justaguy/anaconda3/lib/python3.7/multiprocessing/pool.py", line 121, in worker
    result = (True, func(*args, **kwds))

  File "/home/justaguy/anaconda3/lib/python3.7/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))

  File "<ipython-input-69-20c917ebefd7>", line 26, in op
    comparison_df.loc["('{}', '{}')".format(tupx[0],tupx[1])]  = (df.loc[tupx[0]] - df.loc[tupx[1]])

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 190, in __setitem__
    self._setitem_with_indexer(indexer, value)

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 451, in _setitem_with_indexer
    self.obj._data = self.obj.append(value)._data

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py", line 6692, in append
    sort=sort)

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 229, in concat
    return op.get_result()

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 426, in get_result
    copy=self.copy)

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 2065, in concatenate_block_managers
    return BlockManager(blocks, axes)

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 114, in __init__
    self._verify_integrity()

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 311, in _verify_integrity
    construction_error(tot_items, block.shape[1:], self.axes)

  File "/home/justaguy/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 1691, in construction_error
    passed, implied))

ValueError: Shape of passed values is (604, 4999), indices imply (602, 4999)
回溯(最近一次呼叫最后一次):
文件“”,第30行,在
池图(操作,辅助值)
文件“/home/justagy/anaconda3/lib/python3.7/multiprocessing/pool.py”,地图第268行
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中第657行的文件“/home/justagy/anaconda3/lib/python3.7/multiprocessing/pool.py”
提升自我价值
worker中的第121行文件“/home/justagy/anaconda3/lib/python3.7/multiprocessing/pool.py”
结果=(True,func(*args,**kwds))
mapstar中的文件“/home/justagy/anaconda3/lib/python3.7/multiprocessing/pool.py”,第44行
返回列表(映射(*args))
文件“”,第26行,在op中
比较_df.loc[”({}',{}')。格式(tupx[0],tupx[1])]=(df.loc[tupx[0]]-df.loc[tupx[1]]
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/index.py”,第190行,在__
self.\u setitem\u和索引器(索引器,值)
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/index.py”,第451行,在带有索引器的setitem中
self.obj.\u数据=self.obj.append(值)。\u数据
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/frame.py”,第6692行,在附录中
排序=排序)
concat中的文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/restrape/concat.py”,第229行
返回操作获取结果()
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/restrape/concat.py”,第426行,在get_result中
复制=自我复制)
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/internal/managers.py”,第2065行,连接块管理器
返回块管理器(块、轴)
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/internal/managers.py”,第114行,在__
自我验证完整性()
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/internals/managers.py”,第311行,输入“验证完整性”
构造错误(总项目、块形状[1]、自轴)
文件“/home/justagy/anaconda3/lib/python3.7/site packages/pandas/core/internal/managers.py”,第1691行,在施工错误中
通过,暗示)
ValueError:传递值的形状为(6044999),索引暗示(6024999)

正如我在评论中建议的那样,您可能会认为使用
组合
而不是
排列
。这样做可以将计算量减少一半免责声明:我的代码正在计算列的差异,而不是像您的示例中那样计算索引

将熊猫作为pd导入
将numpy作为np导入
从itertools导入排列、组合
导入操作系统
将多处理作为mp导入
#生成数据
列=列表(范围(1,50))
##我认为你不应该从1开始索引
索引=列表(范围(1,10))
df=pd.DataFrame(index=index,
列=列,
data=np.random.randn(len(索引),len(列)))
单线
%%timeit-n 10
df1=pd.DataFrame()
对于排列中的a,b(df.索引,2):
df1[“{}-{}”.format(a,b)]=df[a]-df[b]
#每个回路37.1 ms±726µs(7次运行的平均值±标准偏差,每个10个回路)
%%timeit-n 10
df1=pd.DataFrame()
对于排列中的a,b(df.索引,2):
df1[“{}-{}”。格式(a,b)]=df[a]。值df[b]。值
df1.index=df1.index+1
#每个回路25.6 ms±1.2 ms(7次运行的平均值±标准偏差,每个10个回路)
单线程使用组合
%%timeit-n 10
df1=pd.DataFrame()
对于组合中的a、b(测向指数,2):
df1[“{}-{}”.format(a,b)]=df[a]-df[b]
#每个回路18.6 ms±1.07 ms(7次运行的平均值±标准偏差,每个10个回路)
%%timeit-n 10
df1=pd.DataFrame()
对于组合中的a、b(测向指数,2):
df1[“{}-{}”。格式(a,b)]=df[a]。值df[b]。值
df1.index=df1.index+1
#每个回路13.2 ms±819µs(7次运行的平均值±标准偏差,每个10个回路)
多处理 <>这在这种情况下不会更快,但您可以考虑其他应用程序。

def并行化(fun、vec、cores):
mp.池(核心)作为p:
res=p.map(乐趣,vec)
返回res
(五):
a、 b=v
cols=[“{}-{}”.format(a,b)]
df_out=pd.DataFrame(data=df[a]。值df[b]。值,
列=列)
返回dfu
vec=[(a,b)表示置换中的a,b(df.index,2)]
cores=os.cpu\u计数()
%%timeit-n10
df1=并行化(fun、vec、核心)
df1=pd.concat(df1,轴=1)
#每个回路260毫秒±10.7毫秒(