Python Dask AttributeError: у объекта 'module' нет атрибута 'broadcast_to' - PullRequest
0 голосов
/ 01 ноября 2018

Я написал код, чтобы опробовать Dask для использования нескольких процессоров на моем Unix-сервере, как показано ниже:

import pandas as pd
import sys
import dask.dataframe as dd
from dask.multiprocessing import get


numbers = pd.read_csv("head_5_22SNPs_CMI.txt", sep="\t", header=None)

combinations = pd.read_csv("all_combinations_5snps.txt", sep=" ", header=None)

data_dask = dd.from_pandas(combinations, npartitions=5)

pop = int(1 + 5)

score_col, freq_col = [], []

def score_freq(line):
    score=0
    freq=1
    for j in range(len(line)):
        if line[j][1] != numbers.values[j][1]:   # homozygous for ref
            score+=0
            freq*=(float(1-float(numbers.values[j][pop]))*float(1-float(numbers.values[j][pop])))
        elif line[j][0] != numbers.values[j][1] and line[j][1] == numbers.values[j][1]: # heterozygous
            score+=(float(numbers.values[j][5]))
            freq*=(2*(float(1-float(numbers.values[j][pop]))*float(numbers.values[j][pop])))
        elif line[j][0] == numbers.values[j][1]:
            score+=2*(float(numbers.values[j][5]))
            freq*=(float(numbers.values[j][pop])*float(numbers.values[j][pop]))

        if freq < 1e-5:   # threshold to stop loop in interest of efficiency 
            break


    return pd.Series([score, freq])

res = data_dask.map_partitions(lambda df: df.apply((lambda row: score_freq(row)), axis=1)).compute(scheduler=get)

res.to_csv('dask_test.txt', index=False)

Я получаю сообщение об ошибке при запуске этого кода на моем Unix-сервере:

Traceback (most recent call last):
  File "compute_scores_pandas+dask_testing.py", line 3, in <module>
    import dask.dataframe as dd
  File "/hpc/home/lsiwzyj/anaconda/lib/python2.7/site-packages/dask/dataframe/__init__.py", line 4, in <module>
    from .core import (DataFrame, Series, Index, _Frame, map_partitions,
  File "/hpc/home/lsiwzyj/anaconda/lib/python2.7/site-packages/dask/dataframe/core.py", line 19, in <module>
    from .. import array as da
  File "/hpc/home/lsiwzyj/anaconda/lib/python2.7/site-packages/dask/array/__init__.py", line 5, in <module>
    from .core import (Array, block, concatenate, stack, from_array, store,
  File "/hpc/home/lsiwzyj/anaconda/lib/python2.7/site-packages/dask/array/core.py", line 31, in <module>
    from . import chunk
  File "/hpc/home/lsiwzyj/anaconda/lib/python2.7/site-packages/dask/array/chunk.py", line 19, in <module>
    broadcast_to = npcompat.broadcast_to
AttributeError: 'module' object has no attribute 'broadcast_to'

После некоторого Googling кажется, что эта проблема может быть конфликтом между именами классов, но я не могу понять что-либо в моем сценарии. Я также попытался обновить пакет Dask, я получил предупреждение как таковое:

Cannot uninstall 'python-dateutil'. It is a distutils installed project anthus we cannot accurately determine which files belong to it which would ld to only a partial uninstall.

Кто-нибудь знает в чем проблема? Скрипт работает на Windows в моей IDE.

1 Ответ

0 голосов
/ 02 ноября 2018

Проблема заключается в конфликте имен в двух библиотеках: пытается импортировать broadcast_to из имени npcompat, которое путается с двумя различными определениями здесь и возможно здесь , хотя последнее предположение.

В dask была ошибка, которая обсуждается здесь , на что ссылается @mdurant в комментариях выше.

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

Прочитав ваш комментарий, я не очень уверен в причине (поэтому я не очень полезен здесь), и мне нужно углубиться в это, но я бы начал с того, чтобы избавиться от этого предупреждения. Вы можете сделать это, удалив python-dateutil с помощью команды conda remove. Затем снова обновите dask, снова установите его (с последней версией) и не должны отображать это предупреждение.

...