2016-10-24 11 views
1

大規模な編集:タイムズ・イテレーションを一度に繰り返す

わかりましたので、私は分レベルでtimeseriesデータフレームを持っています。たとえば、このデータフレームは1年間のデータです。私は、このデータを毎日繰り返す分析モデルを作成しようとしています。

機能: 1)1日分のデータをデータフレームからスライスします。 2)毎日のスライスの30分(1日の最初の30分)のサブスライスを作成します。 3)両方のスライスのデータを関数の解析部分に渡します。 4)新しいデータフレームに追加します。 5)完了するまで反復を続けます。

データフレームのフォーマットは次のとおりです。

      open_price high low close_price volume  price 
2015-01-06 14:31:00+00:00 46.3800 46.440 46.29 46.380 560221.0 46.380 
2015-01-06 14:32:00+00:00 46.3800 46.400 46.30 46.390 52959.0  46.390 
2015-01-06 14:33:00+00:00 46.3900 46.495 46.36 46.470 100100.0 46.470 
2015-01-06 14:34:00+00:00 46.4751 46.580 46.41 46.575 85615.0  46.575 
2015-01-06 14:35:00+00:00 46.5800 46.610 46.53 46.537 78175.0  46.537 

datetimeindex機能は、この作業に取り掛かるための最良の方法ですが、私はどこから始めれば見当がつかないパンダように私には思えます。

(1)df開始日時から始まる.rollforward機能を使用して、各繰り返しで1日ずつロールフォワードするように見えます。

(2)サブスライスを作成するには、df.loc [mask]を使用します。

私はかなり(2)の後でそれを理解することができますが、もう一度私はtimeseries分析やpandas datetimeindex機能に詳しくはわかりません。

最終データフレーム:

   high  low retrace time 
2015-01-06 46.440 46.29 True  47 
2015-01-07 46.400 46.30 True  138 
2015-01-08 46.495 46.36 False NaN 
2015-01-09 46.580 46.41 True  95 
2015-01-10 46.610 46.53 False NaN 

ハイ=

低日の最初の30分のハイ=当日の30分の最初の低

リトレース=ブール、価格はオープンに戻った場合最初の30分後のある日のある時点での価格。

時間=リトレースに要した時間(分)。

ここで動作しているように私のコードです(あなたの助けのためにすべての感謝を!):

sample = msft_prices.ix[s_date:e_date] 
sample = sample.resample('D').mean() 
sample = sample.dropna() 
sample = sample.index.strftime('%Y-%m-%d') 
ORTDF = pd.DataFrame() 
ORDF = pd.DataFrame() 
list1 = [] 
list2 = [] 
def hi_lo(prices): 

     for i in sample: 
      list1 = [] 
      if i in prices.index: 

       ORTDF = prices[i+' 14:30':i+' 15:00'] 
       ORH = max(ORTDF['high']) #integer value 
       ORHK = ORTDF['high'].idxmax() 
       ORL = min(ORTDF['low']) #integer value 
       ORLK = ORTDF['low'].idxmin() 
       list1.append(ORH) 
       list1.append(ORL) 



       if ORHK < ORLK: 
        dailydf = prices[i+' 14:30':i+' 21:00'] 
        if max(dailydf['high']) > ORH: 
         ORDH = max(dailydf['high']) 
         ORDHK = dailydf['high'].idxmax() 
         touched = 1 
         time_to_touch = ORDHK - ORHK 
         time_to_touch = time_to_touch.total_seconds()/60 
         list1.append(touched) 
         list1.append(time_to_touch) 
         list2.append(list1) 
        else: 
         touched = 0 
         list1.append(touched) 
         list1.append('NaN') 
         list2.append(list1) 
       elif ORHK > ORLK: 
        dailydf = prices[i+' 14:30':i+' 21:00'] 
        if min(dailydf['low']) < ORL: 
         ORDL = min(dailydf['low']) 
         ORDLK = dailydf['low'].idxmin() 
         touched = 1 
         time_to_touch = ORDLK - ORLK 
         time_to_touch = time_to_touch.total_seconds()/60 
         list1.append(touched) 
         list1.append(time_to_touch) 
         list2.append(list1) 
        else: 
         touched = 0 
         list1.append(touched) 
         list1.append('NaN') 
         list2.append(list1) 


      else: 
       pass 


     ORDF = pd.DataFrame(list2, columns=['High', 'Low', 'Retraced', 'Time']).set_index([sample]) 
     return ORDF 

これはおそらく、それについて移動するための最もエレガントな方法はありませんが、ちょっと、それは働きます!一般的な参照用

+2

ヒント:専門用語を使用しないでください!ここのほとんどの人は財務用語を理解しません。あなたの問題が本当に明確ではありません。 –

+3

あなたは、提供された最小限の、完全な、そして実証された例を提供するほうがずっと良いでしょう。 http://stackoverflow.com/help/mcve – piRSquared

+0

うーん...最初から再起動する必要がありますか? – supernoob

答えて

1

読むthe docs

セットアップ(次回は質問にこの自分自身を提供してください!):

dates = pd.to_datetime(['19 November 2010 9:01', '19 November 2010 9:02', '19 November 2010 9:03', 
         '20 November 2010 9:05', '20 November 2010 9:06', '20 November 2010 9:07']) 
df = pd.DataFrame({'low_price': [1.2, 1.8, 1.21, 2., 4., 1.201], 
        'high_price': [3., 1.8, 1.21, 4., 4.01, 1.201]}, index=dates) 
df 

        high_price low_price 
2010-11-19 09:01:00  3.000 1.200 
2010-11-19 09:02:00  1.800 1.800 
2010-11-19 09:03:00  1.210 1.210 
2010-11-20 09:05:00  4.000 2.000 
2010-11-20 09:06:00  4.010 4.000 
2010-11-20 09:07:00  1.201 1.201 

私は、その後の日とすることによりグループ日ごとに計算する関数を適用させていただきますリトレースがあったかどうか、そしてリトレースが起きた時かどうか。あなたの質問は操作したり、「価格が同じである」と言うための許容レベル何にどの列に明確ではなかったので、私はオプションとしてそれらを置く

def retrace_per_day(day, col='high_price', epsilon=0.5): 
    """take day data and returns whether there was a retrace. 
    If yes, return 1 and the minute in which it did. 
    Otherwise return 0 and np.nan""" 
    cond = (np.abs(day[col] - day[col][0]) < epsilon) 
    cond_index = cond[cond].index 
    if len(cond_index) > 1: 
     retrace, period = 1, cond_index[1] 
    else: 
     retrace, period = 0, np.nan 
    return pd.Series({'retrace': retrace, 'period' : period}) 

df.groupby(pd.TimeGrouper('1D')).apply(retrace_per_day) 

      period retrace 
2010-11-19 NaN  0.0 
2010-11-20 2010-11-20 09:06:00  1.0 
次に、あなたの元に戻ってマージするためにこれを使用することができます

必要であればデータフレーム。

+0

あなたの例は素晴らしいですが、残念ながらデータフレームではなく値を返す必要があります(私のアプローチが正しい場合)。非常に具体的には、最初と最後の30分以内に高値と低値を見つけ、それが発生した順番を調べ、その後、価格が日の始めから戻ってくるかどうかを調べる必要があります。関数は次のようになります: 最初と最後の30分以内に高低を特定し、両方をlist1に追加します。価格を再評価した場合は、 'true'または 'false'を返し、list1に追加します。開始日とリトレースメントの間の時間デルタを見つけます。 list1に追加します。 list1をlist2に追加します。新しい反復を開始します。 – supernoob

+0

@ suupooob:私はこの文脈で "リトレース"が何を意味するかは知らない。あなたはあなたの質問に(単純化された)予想出力を入れてください。すべてのステップを理解する必要はありません。 おそらく、これを追加してリストに分割する必要はありません。私はあなたには、新しい変数を作成する必要があると思われます:「Retracement」は、 "リトレース"を始めました。それですか?これは 'groupby'-' apply'の組み合わせで実現できます。 – cd98

+0

すべての繰り返しが完了したら、list2からデータフレームを構築します。 – supernoob

関連する問題