3

大規模な編集:

わかりましたので、分レベルの時系列データフレームがあります。例として、このデータフレームは 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

pandas の datetimeindex 機能がこのタスクを実行するための最良の方法であるように思えますが、どこから始めればよいかわかりません。

(1) .rollforward 機能を使用して、df 開始日時から開始し、反復ごとに 1 日ロールフォワードできるようです。

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

(2)の後にそれを理解できると確信していますが、繰り返しになりますが、時系列分析やパンダの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

High = 1 日の最初の 30 分間の High

Low = 1 日の最初の 30 分間の安値

Retrace = Boolean、価格が最初の 30 分後の日中のある時点で始値に戻った場合。

Time = リトレースにかかった時間 (分)。

動作するように見える私のコードは次のとおりです (ご協力ありがとうございます!):

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

これはおそらく最もエレガントな方法ではありませんが、うまくいきます!

4

1 に答える 1

2

一般的な参考資料としてドキュメントを読む

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

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

必要に応じて、これを使用して元のデータフレームにマージできます。

于 2016-10-24T22:03:35.613 に答える