2013-07-12 3 views
0

는 I 효율적 에서 [bid_price]의 최대 값을 지정할 각 조건 다른 관측 최소값 할당 [다른 관찰]이 조건 :STATA - 효율적 최대/STATA에서

  1. [bid_time] < [시간] < 분 ([bid_timelimit], [bid_timecanceled])
  2. ,745,151 5,
  3. 은 [재고] = 은 [재고]
  4. 가 [bid_price]은 상기에서

설정되어 은 [] 서로되는 변수를 나타낸다

: 관찰과 []를이 관측되는 변수) 여기서

를 나타낸다 내 코드

gen maxbidprice=. 

su no 

forvalues i = `r(min)'/`r(max)'{ 
    disp `i' 
    gen double current = time[`i'] 
    egen bidtag=tag(bid_price) if stock==stock[`i'] & bid_price!=. & current>bid_time & current<bid_timelimit & current<=bid_timecanceled 
    quietly su bid_price if bidtag 
    replace maxbidprice = r(max) if no==`i' 
    drop bidtag current 
} 

제 코드가 매우 비효율적이라고 생각합니다. 데이터 세트의 크기는 30k 이상이며이 코드의 실행 시간은 몇 시간입니다. 작동하는 것처럼 보이지만보다 효율적인 코드가 있어야한다고 생각합니다.

원본 테이블을 파괴해서는 안되며 하나의 변수를 더 추가해야합니다. maxbidprice 변수는 특정 기준을 모든 관측치에 충족시킵니다. 요점은 일부 조건과 일치하는 다른 관측 값을 지정하는 것입니다.

아무에게도 대안을 제안 할 수 있습니까?

샘플 데이터 :

no,time,price,quantity,seller_pid,buyer_pid,bid_no,bid_price,bid_quantity,bid_time,bid_timelimit,bid_timecanceled,bid_pid,pid,action,stock 
300,31oct2012 13:42:03,10000,10,1919,1545,,,,,,,,1919,3,3 
301,31oct2012 13:42:03,10000,30,1919,454,,,,,,,,1919,3,3 
302,31oct2012 13:42:05,1000,10,,,152,1000,10,31oct2012 13:42:05,04nov2012 00:00:00,31oct2012 13:48:27,2450,2450,1,1 
303,31oct2012 13:42:06,10000,10,1919,1545,,,,,,,,1919,3,3 
304,31oct2012 13:42:06,10000,20,1919,1252,,,,,,,,1919,3,3 
305,31oct2012 13:42:08,10000,18,1919,1648,,,,,,,,1919,3,3 
306,31oct2012 13:42:15,10000,4,1919,2151,,,,,,,,2151,4,1 
307,31oct2012 13:42:15,10000,10,2450,2151,,,,,,,,2151,4,1 
308,31oct2012 13:42:23,6500,15,1919,655,,,,,,,,1919,3,1 
309,31oct2012 13:43:58,6000,10,1919,1127,,,,,,,,1919,3,1 
310,31oct2012 13:44:15,5000,82,1919,1842,,,,,,,,1919,3,1 
311,31oct2012 13:44:41,5000,10,,,153,5000,10,31oct2012 13:44:41,04nov2012 00:00:00,31oct2012 23:36:58,2450,2450,1,1 
312,31oct2012 13:46:21,5000,100,,,154,5000,100,31oct2012 13:46:21,16nov2012 00:00:00,01nov2012 00:18:04,1919,1919,1,1 
313,31oct2012 13:46:25,5000,3,733,1842,,,,,,,,733,3,1 
314,31oct2012 13:46:28,5000,20,,,155,5000,20,31oct2012 13:46:28,02nov2012 00:00:00,31oct2012 14:14:54,1721,1721,1,1 
315,31oct2012 13:46:54,7000,10,,,156,7000,10,31oct2012 13:46:54,06nov2012 00:00:00,31oct2012 20:36:08,209,209,1,3 
316,31oct2012 13:48:11,9700,10,,,,,,,,,,1373,2,2 
317,31oct2012 13:48:14,6000,10,,,157,6000,10,31oct2012 13:48:14,06nov2012 00:00:00,31oct2012 13:55:07,209,209,1,1 
318,31oct2012 13:48:55,10000,10,,,,,,,,,,1373,2,3 
319,31oct2012 13:49:53,10000,30,,,,,,,,,,1919,2,1 
320,31oct2012 13:50:24,9000,50,,,158,9000,50,31oct2012 13:50:24,04nov2012 00:00:00,31oct2012 17:15:46,1919,1919,1,2 
321,31oct2012 13:50:29,10000,10,1919,1725,,,,,,,,1725,4,1 
322,31oct2012 13:50:42,9000,40,,,159,9000,40,31oct2012 13:50:42,04nov2012 00:00:00,31oct2012 17:15:48,1919,1919,1,3 
323,31oct2012 13:51:10,6000,10,,,160,6000,10,31oct2012 13:51:10,04nov2012 00:00:00,31oct2012 14:42:27,2450,2450,1,1 
324,31oct2012 13:51:14,10000,20,,,,,,,,,,1919,2,2 
325,31oct2012 13:51:23,10000,20,,,,,,,,,,1919,2,2 
326,31oct2012 13:51:54,9000,20,,,161,9000,20,31oct2012 13:51:54,04nov2012 00:00:00,31oct2012 17:15:50,1919,1919,1,3 
327,31oct2012 13:52:05,10000,8,1725,1648,,,,,,,,1725,3,3 
328,31oct2012 13:52:05,10000,2,1725,1648,,,,,,,,1725,3,3 
329,31oct2012 13:52:39,9900,10,,,162,9900,10,31oct2012 13:52:39,04nov2012 00:00:00,31oct2012 13:53:16,277,277,1,1 
330,31oct2012 13:53:12,9700,10,,,163,9700,10,31oct2012 13:53:12,04nov2012 00:00:00,31oct2012 14:31:31,277,277,1,2 
+0

각'주식 '에 대해 주어진'시간 '에서 최대 입찰가를 찾고 싶습니까? 몇 줄의 데이터를 제공 할 수 있습니까? 테스트 데이터를 생성하는 코드의 보너스 포인트. :) –

+0

@ RichardHerron 관심을 가져 주셔서 감사합니다. 샘플 데이터를 추가했습니다. – z0nam

+0

그러면 '병합'합니다. –

답변

3

다음은 작동합니다. 열쇠는 collapseif을 사용하여 기준에 맞는 최대 bid_price을 찾는 것입니다.

/* make some data */ 
clear 
set seed 2001 
set obs 10 
generate stock = _n 
expand 100 
bysort stock: generate time = _n 
expand 100 
generate bid_time = time + 10*uniform() - 5 
generate bid_timelimit = time + 100*uniform() - 50 
generate bid_timecancelled = time + 100*uniform() - 50 
generate bid_price = 100 + 50*uniform() - 25 

/* find max active bid */ 
tempfile original_data 
save `original_data' 
collapse (max) bid_price /// 
    if (time > bid_time) & (time < min(bid_timelimit, bid_timecancelled)), /// 
    by(stock time) 
merge 1:m stock time using `original_data' 

/* check results */  
list in 1/10 
+0

제안 해 주셔서 감사합니다. 그러나 원본 테이블을 파괴해서는 안되며 하나의 변수를 추가하면됩니다. 'maxbidprice' 변수는 특정 기준을 모든 관측치에 충족시킵니다. 나는이 점을 언급하지 않은 것을 유감스럽게 생각합니다. – z0nam

+0

그러면 다시 병합합니다. –

+0

나는 원래 질문에 대한 당신의 대답에 나의 의견을 합쳤다. – z0nam