2016-10-24 6 views
1

대용량 편집 :시간대를 통해 반복하기

좋아요, 그래서 분 수준의 timeseries 데이터 프레임이 있습니다. 예를 들어,이 데이터 프레임은 1 년간의 데이터입니다. 이 데이터를 매일 반복하는 분석 모델을 만들려고합니다.

기능은 다음과 같습니다. 1) 데이터 프레임에서 하루 동안의 데이터 조각을 만듭니다. 2) 매일 조각의 30 분 (하루 30 분 30 분) 하위 조각을 만듭니다. 3) 두 조각의 데이터를 함수의 분석 부분으로 전달합니다. 4) 새 데이터 프레임에 추가하십시오. 5) 완료 될 때까지 반복을 계속하십시오.

dataframe의 형식은 다음과 같습니다

      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 기능을 사용할 수있는 것처럼 보입니다. 각 반복을 통해 하루를 롤 포워드합니다.

(2) dl.loc [마스크]를 사용하여 서브 슬라이스를 만듭니다.

필자는 (2) 이후에 알아낼 수 있다고 확신하지만, 다시 한번 timeseries 분석 또는 pandas datetimeindex 기능에 익숙하지 않습니다.

최종 dataframe :

   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 분 내에 High and Low를 발견해야하며, 그 순서가 시작된 다음, 가격이 하루의 시작부터 되돌아 왔는지를 알아야합니다. 따라서 함수는 다음과 같습니다. 처음 30 분이 지나면 high & low를 식별하고 list1에 둘 다 추가합니다. 가격을 되짚어 보면 'true'또는 'false'를 반환하고 list1에 추가하면 시퀀스를 식별 할 수 있습니다. 하루의 시작과 retracement 사이의 시간 델타를 찾으십시오. list1에 추가하십시오. list1을 list2에 추가하십시오. 새로운 반복을 시작하십시오. – supernoob

+0

@ suunoob : 나는이 상황에서 "회귀"가 무엇을 의미하는지 모른다. 질문에 (단순화 된) 예상 출력을 넣으시겠습니까? 우리는 모든 단계를 이해할 필요가 없으며 결합해야하는 부분 만 이해할 수 있습니다. 당신은 아마도 이것을 추가하고 목록으로 분리 할 필요가 없을 것입니다. 그것은 당신이 단지 새로운 변수를 만들 필요가 있다고 생각합니다 : "Retracement"는 매일, "retrace"(그 의미가 무엇이든간에!)가 시작되고 그렇지 않으면 0이됩니다. 그게 다야? 이것은'groupby'-'applyly' 조합으로 가능합니다. – cd98

+0

모든 반복이 완료되면 list2에서 dataframe을 빌드하십시오. – supernoob