파이선 데이터 분석 코드 질문 올립니다. List 의 각 값을 if loop 안에 어떻게 사용할 수 있을까요?
글쓴이: extremesonic / 작성시간: 수, 2014/10/01 - 6:50오전
안녕하세요. 제가 코딩을 해본적이 없는 상황에서, 초보인 제가 생업으로 인해 급히 혼자 파이선으로 코딩 하던 중에 어려운 부분에 부딪혀 이렇게 질문을 드리고자 합니다.
일단 데이터는 이렇게 생겼습니다.
1 2 2 244 263 0 0.936 0.930 0.934 0.921 3.820 0.000 1.570 2 4 4 215 172 305 33 0 0.945 0.942 0.937 0.580 3.687 0.000 1.410 3 4 4 344 279 377 1945 0 0.933 0.915 0.907 0.921 3.839 0.000 1.437 ....<code> 총 20405 라인인데, 4081 줄 마다 똑같은 포맷이 반복되는 데이터 셋입니다. 총 5개의 데이터 셋이 있는 셈이죠. 여기서 1) 일단 데이터를 다 읽어서 컬럼별로 분리한 뒤에, 2번째 컬럼이 2 이면 그 때의 4번째 5번째 숫자들을 읽습니다. 그 뒤에 1번 컬럼이 그 4번째, 5번째 숫자인 줄로 가서 그 때의 2번째 컬럼 값을 체크 합니다. 예를들어 지금 첫 줄을 보시면 두번째 값이 2이므로, 244 와 263을 체크하고, 그러고 바로 첫번째 컬럼이 244, 263 인 줄로 가는겁니다. 1번째 컬럼 기준으로 sort 되어있기 때문에 244번쨰, 263번째 줄을 체크한다고 봐도 무방합니다. 2) 그 244번째, 263번째 줄을 체크하는데, 그 줄의 2번째 값이 둘 다 4이다, 그러면 첫번째 줄로 돌아와서 첫번째 줄의 두번째 컬럼 값 2를 5로 바꿔줍니다. 3) 그리고 두번째 컬럼 값이 4인 경우, 역시 4번째 5번째 값을 체크를 합니다. 그리고 똑같이 그 줄로 갑니다. 예를 들어 저 데이터의 2번째 줄에서는 215 번째 줄, 그리고 172 번째 줄을 체크를 하면 되겠죠. 그리고 똑같이 그 두 줄의 2번째 컬럼 값을 체크 합니다. 그래서 그 2개의 2번째 컬럼 값을 합해서 그 값이 8보다 작으면 2번째 줄 2번째 컬럼의 4를 9로 바꿔줍니다. 4) 그래서 5개의 데이터 셋에 대해 2번쨰 컬럼에서 5와 9가 나오는 빈도를 체크하고 그걸 데이터 인덱스와 함께 5줄로 기록합니다. 그래서 제가 짜본 코드가 다음과 같습니다. AAA가 첫 컬럼, BBB가 두번째 컬럼, CCC가 4번째, 그리고 DDD가 5번쨰 입니다. <code> with open ('input.txt', 'r') as infile: nlines = sum(1 for line in infile) nrange = range(nlines) data_lines = [None]*nlines i=0 for i in nrange: data_lines[i] = file.readline() file.close() lines = 4081 nlines_range = range(lines) ndata = nlines / lines ndata_range = range(ndata) AAA = [None]*lines BBB = [None]*lines CCC = [None]*lines DDD = [None]*lines num_q = [None]*ndata num_p = [None]*ndata with open ('output_%s' %filename, 'w') as outfile: for j1 in ndata_range: for i1 in nlines_range: line = data_lines[i1].split() ##pre defined from upper part of my code AAA[i1] = int(line[0]) BBB[i1] = int(line[1]) CCC[i1] = int(line[3]) DDD[i1] = int(line[4]) while BBB[i1] == 2: if (BBB[CCC[i1]] == 4) and (BBB[DDD[i1]]) == 4: BBB[i1] = 5 while BBB[i1] == 4: if BBB[CCC[i1]] + BBB[DDD[i1]] < 8: BBB[i1] = 9 num_q[j1] = [BBB[i1]].count(9) num_p[j1] = [BBB[i1]].count(5) out = '%5d'%j1 + '%5d'%num_q[j1] + '%5d'%num_p[j1] outfile.write(out) outfile.write('\n') outfile.close() <code> 제가 아주아주 옛날에 포트란 했던 경험으로 짜다보니 if-loop 가 그거 비슷하게 가네요. 이게 문제인것 같습니다. 그리고 제가 저 BBB 값을 replace 하는게 맞는지 모르겠고, if loop의 조건 저 라인들은 분명 틀린거 같은데 저걸 도대체 어떻게 구현해야할지 몰라서... 도움 부탁 드립니다.
Forums:
댓글 달기