2013-10-18 11 views
0

필자는이 테스트의 기본 기능을 먼저 작성해야한다는 Wilcoxon 순위 합계 테스트의 연장을 작성하고 있습니다.이 연습에서는 SciPy를 사용할 수 없음을 의미합니다.넥타이가있는 순위 튜플

기본 스켈레톤 코드가 있지만 넥타이 순위를 평균하는 데 문제가 있습니다. 여기 내 코드 :

#read in data 
m1 = [0,0,0,0,0,2,3,3,3,4,4,5,6,10,10,10,11,12,15,15,15,20,22,25,25,27,30] 
w1 = [0,0,0,0,0,0,1,3,3,3,3,7,8,8,19,20,27,30] 

#convert to tuples, incl where they came from 
m1t = [] 
for m in m1: 
    m1t.append((m, "m1")) 
w1t = [] 
for w in w1: 
    w1t.append((w, "w1")) 

all1t = m1t + w1t #combine 

all1ts = sorted(all1t, key=lambda tup: tup[0]) #sort 

all1tsr = [row+(i,) for i,row in enumerate(all1ts,0)] #rank 

#revert to back to original grouping 
m1r = [i for i in all1tsr if i[1]=="m1"] 
w1r = [i for i in all1tsr if i[1]=="w1"] 

여기 전류 출력 같습니다

>>> all1tsr[:15] 
[(0, 'm1', 0), 
(0, 'm1', 1), 
(0, 'm1', 2), 
(0, 'm1', 3), 
(0, 'm1', 4), 
(0, 'w1', 5), 
(0, 'w1', 6), 
(0, 'w1', 7), 
(0, 'w1', 8), 
(0, 'w1', 9), 
(0, 'w1', 10), 
(1, 'w1', 11), 
(2, 'm1', 12), 
(3, 'm1', 13), 
(3, 'm1', 14)] 
는, 소자 (2)는 단지 식별자가 분류되어있는 값이 eachtuple의

요소 1 , 소자 (3)가있다 요소 1로 정렬 할 때 순위가 결정됩니다. 요소 1로 "0"을 사용하는 관측치가 10 개 있으며, 지금은 모두 오름차순으로 순위가 지정되어 있지만이 순위를 평균하여 (모두에 5의 순위로 지정) 싶습니다. 즉

나는이 원하는 모든 피드백을 환영

[(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(1, 'w1', 11), 
(2, 'm1', 12), 
(3, 'm1', 13.5), 
(3, 'm1', 13.5)] 

, 감사

우선 들어

답변

1

을, 나는 훨씬 짧은 방법으로 all1ts을 얻을거야 :

import itertools 

all1ts = sorted(itertools.chain(((m, "m1") for m in m1), 
           ((w, "w1") for w in w1))) 

all1tsr = [row+(i,) for i,row in enumerate(all1ts)] 

그런 다음이 작업을 수행하도록 기본적으로 설계된 itertools.groupby을 사용할 것입니다. 나는 당신이 원하는 것을 생각

[(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'm1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(0, 'w1', 5), 
(1, 'w1', 11), 
(2, 'm1', 12), 
(3, 'm1', 16), 
(3, 'm1', 16), 
(3, 'm1', 16), 
(3, 'w1', 16), 
(3, 'w1', 16), 
(3, 'w1', 16), 
(3, 'w1', 16), 
(4, 'm1', 20), 
(4, 'm1', 20), 
(5, 'm1', 22), 
(6, 'm1', 23), 
(7, 'w1', 24), 
(8, 'w1', 25), 
(8, 'w1', 25), 
(10, 'm1', 28), 
(10, 'm1', 28), 
(10, 'm1', 28), 
(11, 'm1', 30), 
(12, 'm1', 31), 
(15, 'm1', 33), 
(15, 'm1', 33), 
(15, 'm1', 33), 
(19, 'w1', 35), 
(20, 'm1', 36), 
(20, 'w1', 36), 
(22, 'm1', 38), 
(25, 'm1', 39), 
(25, 'm1', 39), 
(27, 'm1', 41), 
(27, 'w1', 41), 
(30, 'm1', 43), 
(30, 'w1', 43)] 

:

groups = [] 
for _, group in itertools.groupby(all1tsr, lambda x: x[0]): 
    group = list(group) 
    rank = sum(x[2] for x in group)/len(group) 
    groups.extend((val, identifier, rank) for val, identifier, _ in group) 

테스트 데이터를 실행하면 나에게이 결과를 제공합니다.

+0

내가 그랬다. 고마워. 나는 당신이 "itertools"라고 부르는이 마술에 대해 더 많이 배워야 할 것입니다. – alexhli

+0

꽤 멋진 마법입니다. :-) 이것이 네가 한 일이라면,이 대답을 받아 들일 수 있겠는가? 감사! –