我对python和mapreduce比较陌生。我尝试使用python中的ta lib库计算简单移动平均(sma)。我有这样一个数据框:
AA BB
2008-03-05 36.60 36.60
2008-03-04 38.37 38.37
2008-03-03 38.71 38.71
2008-03-02 38.00 38.00
2008-03-01 38.32 38.32
2008-02-29 37.14 37.14
aa和bb是股票符号,显示了它们在6天内的值。
有人能帮帮我吗?map应该执行什么,应该减少什么输入?
最终输出应打印库存a和b的SMA。
1条答案
按热度按时间l7wslrjt1#
什么是sma(简单移动平均线)?一种简单的或算术的移动平均数,通过将证券在若干时间段内的收盘价相加,然后除以这些时间段的总数来计算。
例如,在上例中,收盘价为:37.14(2008-02-29)、38.32(2008-03-01)、38.00(2008-03-02)、38.71(2008-03-03)、38.37(2008-03-04)、36.60(2008-03-05)。
因此,2008-03-02的3天sma为(37.14+38.32+38.00)/3=37.82 2008-02-29没有3天sma(因为只有1天的数据:2008-02-29),2008-03-01没有3天sma(只有2天的数据:2008-02-29,2008-03-01)。
以下是针对数据的3天sma的解决方案(您可以轻松地将其更改为n天sma)。
Map器(m.py):
Map器逻辑:它只读取行中以制表符分隔的值并输出“{key}\t{val1}:{val2}”。
例如,对于第一行(制表符分隔值):
它输出:
异径管(r.py):
减速器逻辑:
它使用两个列表。一个用于a股,一个用于b股。
假设sma间隔为3(
smaInterval = 3
)当输入行进入时,它解析该行并将值a和值b附加到它们各自的列表中
当任何列表的大小达到3(即sma间隔)时,它计算移动平均值并输出(键,sma表示股票a,sma表示股票b),并从每个列表中删除第0个元素。
我执行这个是为了你的意见。
我在没有使用hadoop的情况下执行了它,如下所示(input.txt包含问题中提到的输入,用制表符分隔值):
我得到了以下输出(经验证是正确的):
您应该能够使用hadoop框架执行相同的操作,如下所示:
注:此代码可以优化,可能是,你不需要减速器在所有。如果您的数据很小,则可以在Map器本身读取所有值,对它们进行排序,然后计算sma。我刚刚编写了这段代码,以说明使用hadoop流计算sma。