2016-11-15 5 views
3

enter image description here 私は、技術分析で一般的なチャートタイプの1つである機能を定義していました。 私はパンダを使って機能を書いていましたが、ほとんど問題は見つかりませんでした。 これはHeiken芦ノ湖[HA]はHeiken Ashi pandas pythonを使用して

    Heikin-Ashi Candle Calculations 
      HA_Close = (Open + High + Low + Close)/4 
      HA_Open = (previous HA_Open + previous HA_Close)/2 
      HA_Low = minimum of Low, HA_Open, and HA_Close 
      HA_High = maximum of High, HA_Open, and HA_Close 

       Heikin-Ashi Calculations on First Run 
      HA_Close = (Open + High + Low + Close)/4 
        HA_Open = (Open + Close)/2 
          HA_Low = Low 
          HA_High = High 

like-どのように見えるかであり利用できる多くのものは、ループと、純粋なのpythonのために使用して、さまざまなウェブサイト上にあるが、私はパンダもうまく仕事ができると思います。 これは誰もがこれで私を助けてくださいすることができ

def HA(df): 

     df['HA_Close']=(df['Open']+ df['High']+ df['Low']+ df['Close'])/4 

     ha_o=df['Open']+df['Close'] #Creating a Variable 
     #(for 1st row) 

     HA_O=df['HA_Open'].shift(1)+df['HA_Close'].shift(1) #Another variable 
     #(for subsequent rows) 

     df['HA_Open']=[ha_o/2 if df['HA_Open']='nan' else HA_O/2]  
     #(error Part Where am i going wrong?) 

     df['HA_High']=df[['HA_Open','HA_Close','High']].max(axis=1) 

     df['HA_Low']=df[['HA_Open','HA_Close','Low']].min(axis=1) 

     return df 

私progress-ているのですか? ` それは仕事をdoesntの.... 私はこれは私が書いた新しいコードであるthis-

import pandas_datareader.data as web 
    import HA 
    import pandas as pd 
    start='2016-1-1' 
    end='2016-10-30' 
    DAX=web.DataReader('^GDAXI','yahoo',start,end) 

に試してみました

def HA(df): 
      df['HA_Close']=(df['Open']+ df['High']+ df['Low']+df['Close'])/4 
...:  ha_o=df['Open']+df['Close'] 
...:  df['HA_Open']=0.0 
...:  HA_O=df['HA_Open'].shift(1)+df['HA_Close'].shift(1) 
...:  df['HA_Open']= np.where(df['HA_Open']==np.nan, ha_o/2, HA_O/2) 
...:  df['HA_High']=df[['HA_Open','HA_Close','High']].max(axis=1) 
...:  df['HA_Low']=df[['HA_Open','HA_Close','Low']].min(axis=1) 
...:  return df 

しかし、まだHA_Open結果は満足のいくものではなかった

+0

動作しますか?そうでない場合は、何が問題なのですか?サンプルのデータフレームも提供してください。 – JohnE

+0

それdoesntの仕事.... 私は= PD 開始とウェブ 輸入HA 輸入パンダとしてthis- 輸入pandas_datareader.dataにしようとした「2016年1月1日」 終了=「2016年10月30日」 DAX = web.DataReader( '^ GDAXI'、 'yahoo'、start、end) –

+1

これはあなたにエラーを表示する行です: 'df ['HA_Open'] = np.where(df ['HA_Open'] == np。あなたは 'df ['HA_Open']'を定義することに失敗したと思いますか? – JohnE

答えて

1

私はPythonやPandasについて知識がありませんが、いくつかの研究の後では、これが良い解決策になると思います。

コメントを追加してください。私は非常に感謝します。

名前付きタプルとitertuplesを使用しました(DataFrameをループすると最も速く見えます)。

私はそれが助けてくれることを願っています!ここで

def HA(df): 
    df['HA_Close']=(df['Open']+ df['High']+ df['Low']+df['Close'])/4 

    nt = namedtuple('nt', ['Open','Close']) 
    previous_row = nt(df.ix[0,'Open'],df.ix[0,'Close']) 
    i = 0 
    for row in df.itertuples(): 
     ha_open = (previous_row.Open + previous_row.Close)/2 
     df.ix[i,'HA_Open'] = ha_open 
     previous_row = nt(ha_open, row.Close) 
     i += 1 

    df['HA_High']=df[['HA_Open','HA_Close','High']].max(axis=1) 
    df['HA_Low']=df[['HA_Open','HA_Close','Low']].min(axis=1) 
    return df 
0

は私のテストごとに、最速の正確かつ効率的な実装である:ここでは

def HA(df): 
    df['HA_Close']=(df['Open']+ df['High']+ df['Low']+df['Close'])/4 

    idx = df.index.name 
    df.reset_index(inplace=True) 

    for i in range(0, len(df)): 
     if i == 0: 
      df.set_value(i, 'HA_Open', ((df.get_value(i, 'Open') + df.get_value(i, 'Close'))/2)) 
     else: 
      df.set_value(i, 'HA_Open', ((df.get_value(i - 1, 'HA_Open') + df.get_value(i - 1, 'HA_Close'))/2)) 

    if idx: 
     df.set_index(idx, inplace=True) 

    df['HA_High']=df[['HA_Open','HA_Close','High']].max(axis=1) 
    df['HA_Low']=df[['HA_Open','HA_Close','Low']].min(axis=1) 
    return df 

は私のテストアルゴリズム(基本的に私はベンチマークの速度結果をこの記事で提供するアルゴリズムを使用)です。ここで

import quandl 
import time 

df = quandl.get("NSE/NIFTY_50", start_date='1997-01-01') 

def test_HA(): 
    print('HA Test') 
    start = time.time() 
    HA(df) 
    end = time.time() 
    print('Time taken by set and get value functions for HA {}'.format(end-start)) 

    start = time.time() 
    df['HA_Close_t']=(df['Open']+ df['High']+ df['Low']+df['Close'])/4 

    from collections import namedtuple 
    nt = namedtuple('nt', ['Open','Close']) 
    previous_row = nt(df.ix[0,'Open'],df.ix[0,'Close']) 
    i = 0 
    for row in df.itertuples(): 
     ha_open = (previous_row.Open + previous_row.Close)/2 
     df.ix[i,'HA_Open_t'] = ha_open 
     previous_row = nt(ha_open, row.Close) 
     i += 1 

    df['HA_High_t']=df[['HA_Open_t','HA_Close_t','High']].max(axis=1) 
    df['HA_Low_t']=df[['HA_Open_t','HA_Close_t','Low']].min(axis=1) 
    end = time.time() 
    print('Time taken by ix (iloc, loc) functions for HA {}'.format(end-start)) 

私はi7プロセッサーに乗った出力が(結果は、あなたのプロセッサ速度によって異なることがあり注意が、私は結果は同様であろうと仮定してください)です。

HA Test 
Time taken by set and get value functions for HA 0.05005788803100586 
Time taken by ix (iloc, loc) functions for HA 0.9360761642456055 

パンダとの私の経験はixのような関数、locilocset_valueget_value機能に比べて遅いことを示しています。さらに、shift関数を使用しているカラム自体の計算値は、誤った結果をもたらします。

+0

私は記事に説明を追加しました。 [GitHub](https://github.com/arkochhar/Technical-Indicators)上の私の_technical indicators_プロジェクトを参考にしてください – arkochhar

0
def heikenashi(df): 
    df['HA_Close'] = (df['Open'] + df['High'] + df['Low'] + df['Close'])/4 
    df['HA_Open'] = (df['Open'].shift(1) + df['Open'].shift(1))/2 
    df.iloc[0, df.columns.get_loc("HA_Open")] = (df.iloc[0]['Open'] + df.iloc[0]['Close'])/2 
    df['HA_High'] = df[['High', 'Low', 'HA_Open', 'HA_Close']].max(axis=1) 
    df['HA_Low'] = df[['High', 'Low', 'HA_Open', 'HA_Close']].min(axis=1) 
    df = df.drop(['Open', 'High', 'Low', 'Close'], axis=1) # remove old columns 
    df = df.rename(columns={"HA_Open": "Open", "HA_High": "High", "HA_Low": "Low", "HA_Close": "Close", "Volume": "Volume"}) 
    df = df[['Open', 'High', 'Low', 'Close', 'Volume']] # reorder columns 
    return df 
関連する問題