簡體   English   中英

Hadoop MapReduce | python中的SMA

[英]Hadoop MapReduce | SMA in python

我是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。

什么是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年3月1日的3天均線(僅2天有數據:2008-02-29、2008-03-01)。

以下是針對您的數據進行3天SMA的解決方案(您可以輕松地將其更改為“ n”天SMA)。

映射器(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])

映射器邏輯:它僅讀取行中制表符分隔的值並輸出“ {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),並從每個列表中刪除第零個元素。

我為您的輸入執行了此命令。

我執行了它,沒有使用下面的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}

注意:此代碼可以優化,並且可能完全不需要reducer。 如果數據很小,則可以在映射器本身上讀取所有值,對它們進行排序,然后計算SMA。 我只是編寫了這段代碼,以說明使用Hadoop流計算進行SMA的計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM