首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark .stdev() Python问题

Spark .stdev() Python问题
EN

Stack Overflow用户
提问于 2015-03-02 23:02:03
回答 1查看 200关注 0票数 0

所以我正在尝试做一些统计分析,我一直在做一些不同于stdev的求和。

Sum工作正常,如下所示:

代码语言:javascript
复制
stats[0] = myData2.map(lambda (Column, values): (sum(values))).collect()

Stdev的格式不同,无法正常工作:

代码语言:javascript
复制
stats[4] = myData2.map(lambda (Column, values): (values)).stdev()

我得到以下错误:

代码语言:javascript
复制
TypeError: unsupported operand type(s) for -: 'ResultIterable' and 'float'
EN

回答 1

Stack Overflow用户

发布于 2015-03-03 00:00:27

第一个使用NumPy的解决方案

代码语言:javascript
复制
data=[(1,[1,2,3,4,5]),(2,[6,7,8,9]),(3,[1,3,5,7])]
dataRdd = sc.parallelize(data)
import numpy
dataRdd.mapValues(lambda values: numpy.std(values)).collect()
# Result
# [(1, 1.4142135623730951), (2, 1.1180339887498949), (3, 2.2360679774997898)]

第二个解决方案DIY,并实现更分布式

代码语言:javascript
复制
data = [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 1), (3, 3), (3, 5), (3, 7)]
# Generate RDD of (Key, (Sum, Sum of squares, Count))
dataSumsRdd = dataRdd.aggregateByKey((0.0, 0.0, 0.0),
                         lambda (sum, sum2, count), value: (sum + float(value), sum2 + float(value**2), count+1.0),
                         lambda (suma, sum2a, counta), (sumb, sum2b, countb): (suma + sumb, sum2a + sum2b, counta + countb))
# Generate RDD of (Key, (Count, Average, Std Dev))
import math
dataStatsRdd = dataSumsRdd.mapValues(lambda (sum, sum2, count) : (count, sum/count, math.sqrt(sum2/count - (sum/count)**2)))
# Result
# [(1, (5.0, 3.0, 1.4142135623730951)), (2, (4.0, 7.5, 1.118033988749895)), (3, (4.0, 4.0, 2.23606797749979))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28812912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档