Hadoop MapReduce | SMA在python中

时间:2015-11-30 09:05:53

标签: python hadoop mapreduce

我对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天的价值 有人可以帮我从这里出去吗 ?地图执行应该是什么以及Reduce应该获得什么输入?

最终输出应打印股票A和B的SMA。

1 个答案:

答案 0 :(得分:0)

什么是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)。

Mapper(m.py):

import sys
for line in sys.stdin:
    val = line.strip()
    vals = val.split('\t')
    print "%s\t%s:%s" % (vals[0], vals[1], vals[2])

Mapper Logic: 它只读取行中的制表符分隔值并输出“{key} \ t {val1}:{val2}。

例如第一行(制表符分隔值):

2008-03-05    36.60    36.60  

输出:

2008-03-05    36.60:36.60  

减速机(r.py):

import sys

lValueA = list()
lValueB = list()

smaInterval = 3

for line in sys.stdin:
    (key, val) = line.strip().split('\t')

    vals = val.split(':')
    lValueA.append(float(vals[0]))
    lValueB.append(float(vals[1]))
    if len(lValueA) == smaInterval:     

        sumA = 0;
        sumB = 0;

        for a in lValueA:
            sumA += a
        for b in lValueB:
            sumB += b

        sumA = sumA / smaInterval;
        sumB = sumB / smaInterval;

        print "%s\t%.2f\t%.2f" % (key, sumA, sumB);
        del lValueA[0]
        del lValueB[0]

缩减逻辑:

  • 它使用2个列表。一个用于股票A,一个用于股票B.
  • 假设SMA间隔为3(smaInterval = 3
  • 当输入一行输入时,它会解析该行并将值A和值B附加到各自的列表
  • 当任何列表的大小达到3(即SMA间隔)时,它计算移动平均值和输出,(密钥,股票A的SMA,股票B的SMA)并从每个列表中删除第0个元素。

我为你的输入执行了这个。

我执行了它,没有使用如下的Hadoop(input.txt包含问题中提到的输入,带有制表符分隔值):

cat input.txt | python m.py | sort | python r.py

我得到了以下输出(我验证了它是正确的):

2008-03-02      37.82   37.82
2008-03-03      38.34   38.34
2008-03-04      38.36   38.36
2008-03-05      37.89   37.89

您应该能够使用Hadoop框架执行相同的操作:

hadoop jar hadoop-streaming-2.7.1.jar -input {Input directory in HDFS} -output {Output directory in HDFS} -mapper {Path to the m.py} -reducer {Path to the r.py}

注意: 这段代码可以优化,也可以,根本不需要减速器。如果您的数据很小,则在mapper端本身您可以读取所有值,对它们进行排序然后计算SMA。我刚刚编写了这段代码,用于说明使用Hadoop流式传输的SMA计算。