Преобразование переменной в строку в среде dask - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь преобразовать имя переменной в строку dask. Этот код отлично работает в обычной среде Python. Однако этот код не работает, когда я запускаю его после создания dask данных. Код ниже.

from dask.distributed import Client
client = Client()
import dask.dataframe as dd

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['ant','ant','cherry', 'dog', 'ant'], 'B':['animal','animal1', 'fruit', 'animal', 'animal'], 'C':['small','small1','small', 'big', np.nan]})

ddf = dd.from_pandas(df, npartitions=2)

ddf.head()

#The below code gives an error because of the above code (Please see the **error** below). The below code on its own runs fine.

my_var = [2,'wew','ewwew','44']
[ k for k,v in locals().items() if v == my_var][0]

EDIT

# The expected output. It works on jupyter notebook without any modules 
# loaded. (It is the name of the list)
out []: 'my_var' 

Ошибка ниже.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/env/lib/python3.5/site-packages/dask/dataframe/utils.py in raise_on_meta_error(funcname, udf)
    159     try:
--> 160         yield
    161     except Exception as e:

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in elemwise(op, *args, **kwargs)
   3426         with raise_on_meta_error(funcname(op)):
-> 3427             meta = partial_by_order(*parts, function=op, other=other)
   3428 

~/env/lib/python3.5/site-packages/dask/utils.py in partial_by_order(*args, **kwargs)
    903         args2.insert(i, arg)
--> 904     return function(*args2, **kwargs)
    905 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in f(self, other)
   2090 
-> 2091         other = _align_method_FRAME(self, other, axis=None)
   2092 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in _align_method_FRAME(left, right, axis)
   1984         # GH17901
-> 1985         right = to_series(right)
   1986 

~/env/lib/python3.5/site-packages/pandas/core/ops.py in to_series(right)
   1946                 raise ValueError(msg.format(req_len=len(left.columns),
-> 1947                                             given_len=len(right)))
   1948             right = left._constructor_sliced(right, index=left.columns)

ValueError: Unable to coerce to Series, length must be 3: given 4

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-5-ce21a4e5e37e> in <module>
      1 my_var = [2,'wew','ewwew','44']
----> 2 [ k for k,v in locals().items() if v == my_var][0]

<ipython-input-5-ce21a4e5e37e> in <listcomp>(.0)
      1 my_var = [2,'wew','ewwew','44']
----> 2 [ k for k,v in locals().items() if v == my_var][0]

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in <lambda>(self, other)
   1199             return lambda self, other: elemwise(op, other, self)
   1200         else:
-> 1201             return lambda self, other: elemwise(op, self, other)
   1202 
   1203     def rolling(self, window, min_periods=None, freq=None, center=False,

~/env/lib/python3.5/site-packages/dask/dataframe/core.py in elemwise(op, *args, **kwargs)
   3425                  else d._meta_nonempty for d in dasks]
   3426         with raise_on_meta_error(funcname(op)):
-> 3427             meta = partial_by_order(*parts, function=op, other=other)
   3428 
   3429     result = new_dd_object(graph, _name, meta, divisions)

/usr/lib/python3.5/contextlib.py in __exit__(self, type, value, traceback)
     75                 value = type()
     76             try:
---> 77                 self.gen.throw(type, value, traceback)
     78                 raise RuntimeError("generator didn't stop after throw()")
     79             except StopIteration as exc:

~/env/lib/python3.5/site-packages/dask/dataframe/utils.py in raise_on_meta_error(funcname, udf)
    175                 "{2}")
    176         msg = msg.format(" in `{0}`".format(funcname) if funcname else "", repr(e), tb)
--> 177         raise ValueError(msg)
    178 
    179 

ValueError: Metadata inference failed in `eq`.

Original error is below:
------------------------
ValueError('Unable to coerce to Series, length must be 3: given 4',)

Traceback:
---------
  File "/home/michael/env/lib/python3.5/site-packages/dask/dataframe/utils.py", line 160, in raise_on_meta_error
    yield
  File "/home/michael/env/lib/python3.5/site-packages/dask/dataframe/core.py", line 3427, in elemwise
    meta = partial_by_order(*parts, function=op, other=other)
  File "/home/michael/env/lib/python3.5/site-packages/dask/utils.py", line 904, in partial_by_order
    return function(*args2, **kwargs)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 2091, in f
    other = _align_method_FRAME(self, other, axis=None)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 1985, in _align_method_FRAME
    right = to_series(right)
  File "/home/michael/env/lib/python3.5/site-packages/pandas/core/ops.py", line 1947, in to_series
    given_len=len(right)))

Кто-нибудь сможет мне помочь в этом вопросе.

Спасибо

Michael

1 Ответ

2 голосов
/ 10 апреля 2019

Ваш код - очень странная вещь, которую стоит попробовать! Поскольку вы перебираете все переменные, вы не должны удивляться, если что произойдет, зависит от того, какие переменные определены. Конкретный случай связан с вопросом, является ли 'wew' == df, и у фрейма данных есть очень конкретное понимание того, что означает равенство. Это может произойти и для блока данных Pandas, или для всего, что имеет сложную реализацию, равную.

Возможно, вы хотели проверить только строки, так как знаете, что ищете:

[k for k, v in locals().items() if isinstance(v, str) and v == my_var][0]
...