You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dask Delayed后无法生成正确DataFrame的问题求助

解决方案

问题原因

你遇到的额外括号嵌套是因为:

  • map() 返回的是迭代器,当你把这个迭代器传给 dd.compute() 时,Dask 会将其视为单个参数,因此返回结果会被包装在一个元组中(元组的第一个元素就是你需要的字典列表)。
  • 另外,你的 combine 函数返回的字典中包含延迟对象,但直接计算后需要将结果转换为 DataFrame。

修正方案一:调整计算步骤并转换为 DataFrame

直接修改现有代码,处理计算后的元组并生成 DataFrame:

from dask import delayed, compute
import pandas as pd

def combine(val):
    a = delayed(rss)(val)
    b = delayed(altman)(val)
    df = {'Tiker': val, 'RS': a, 'Alt': b}
    return df

vals = tickers

# 将 map 迭代器转换为列表(包含带延迟对象的字典)
delayed_dicts = list(map(combine, vals))
# 计算所有延迟对象,提取元组中的列表部分
computed_list = compute(delayed_dicts)[0]
# 转换为 DataFrame
df = pd.DataFrame(computed_list)

修正方案二:用 @delayed 装饰 combine 函数(更简洁)

将整个 combine 函数标记为延迟执行,代码结构更清晰:

from dask import delayed, compute
import pandas as pd

@delayed
def combine(val):
    # 这里直接调用 rss 和 altman,不需要再用 delayed() 包裹
    a = rss(val)
    b = altman(val)
    return {'Tiker': val, 'RS': a, 'Alt': b}

vals = tickers

# 生成延迟对象列表
delayed_results = [combine(val) for val in vals]
# 计算所有延迟结果
computed_results = compute(*delayed_results)
# 转换为 DataFrame
df = pd.DataFrame(computed_results)

或者也可以这样计算(结果一致):

computed_results = compute(delayed_results)[0]
df = pd.DataFrame(computed_results)

验证结果

执行上述代码后,df 会是一个标准的 pandas DataFrame,包含 Tiker、RS 和 Alt 三列,对应你需要的数据。

内容的提问来源于stack exchange,提问作者user19858347

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:06:26