使用sframe.apply()导致运行时错误

时间:2015-12-10 11:46:51

标签: python runtime sframe

我正在尝试在满帧数据的框架上使用简单的应用程序。这是对应用函数的一个列进行简单的数据转换,该函数接受文本输入并将其拆分为列表。这是函数及其调用/输出:

    In [1]: def count_words(txt):
           count = Counter()
           for word in txt.split():
               count[word]+=1
           return count

    In [2]: products.apply(lambda x: count_words(x['review']))

    ---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-85338326302c> in <module>()
----> 1 products.apply(lambda x: count_words(x['review']))

C:\Anaconda3\envs\dato-env\lib\site-packages\graphlab\data_structures\sframe.pyc in apply(self, fn, dtype, seed)
   2607 
   2608         with cython_context():
-> 2609             return SArray(_proxy=self.__proxy__.transform(fn, dtype, seed))
   2610 
   2611     def flat_map(self, column_names, fn, column_types='auto', seed=None):

C:\Anaconda3\envs\dato-env\lib\site-packages\graphlab\cython\context.pyc in __exit__(self, exc_type, exc_value, traceback)
     47             if not self.show_cython_trace:
     48                 # To hide cython trace, we re-raise from here
---> 49                 raise exc_type(exc_value)
     50             else:
     51                 # To show the full trace, we do nothing and let exception propagate

RuntimeError: Runtime Exception. Unable to evaluate lambdas. Lambda workers did not start.

当我运行我的代码时,我得到了那个错误。 s帧(df)只有10乘2,因此不应有过载。我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

如果您正在使用GraphLab Create,那么实际上有一个内置工具可以在&#34;文本分析&#34;工具包。我们说我的数据如下:

import graphlab
products = graphlab.SFrame({'review': ['a portrait of the artist as a young man',
                                       'the sound and the fury']})

计算每个条目中单词的最简单方法是

products['counts'] = graphlab.text_analytics.count_words(products['review'])

如果您单独使用sframe包,或者如果您想要执行自己所描述的自定义功能,我认为您的代码中的关键缺失部分是Counter需要转换为字典,以便SFrame处理输出。

from collections import Counter

def count_words(txt):
    count = Counter()
    for word in txt.split():
        count[word] += 1
    return dict(count)

products['counts'] = products.apply(lambda x: count_words(x['review']))

答案 1 :(得分:1)

对于在使用graphlab时遇到此问题的任何人,这是关于dato支持问题的讨论主题:

http://forum.dato.com/discussion/1499/graphlab-create-using-anaconda-ipython-notebook-lambda-workers-did-not-start

以下是可以运行的代码,以便根据具体情况提供此问题。

在Dato / Graphlab环境中启动ipython或ipython笔记本之后,但在导入graphlab之前,请复制并运行以下代码

import ctypes, inspect, os, graphlab
from ctypes import wintypes
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
kernel32.SetDllDirectoryW.argtypes = (wintypes.LPCWSTR,)
src_dir = os.path.split(inspect.getfile(graphlab))[0]
kernel32.SetDllDirectoryW(src_dir)

# Should work
graphlab.SArray(range(1000)).apply(lambda x: x)

如果运行此选项,则apply函数应与sframe一起使用。