형태소 분석을 위해 CounterVectorizer를 생성하면서 문제가 생겼다.

 

# countvectorizer  생성
from sklearn.feature_extraction.text import CountVectorizer

실행시 아래와 같이 에러 메시지가 떴다. 

ImportError: DLL load failed while importing _arpack: 지정된 프로시저를 찾을 수 없습니다.

sklearn을 비롯해, 혹시 몰라 numpy, scipy 등을 재설치 해 보았으나 계속 동일한 에러가 발생했다.

결국 jupyter notebook을 삭제하기 위해 cmd 관리자권한으로 창을 띄우고 python을 실행시켜 보니 아래와 같은 메시지가 출력됐다.

위 CMD 창에 뜬 https://conda.io/activation 

내용을 참조하여 anaconda prompt 상태에서 c:\Anaconda3\Scripts\activate base를 실행시킨다.

 

 

 

 

 

 

 

 

 

 

이제 python을 실행시켰을때, 에러메시지가 뜨지 않는다.(하지만, CMD에서 실행할 경우 위 문제는 해결되지 않는다.)

 

다시 jupyter notebook을 실행시킨후 다시 해당 코드를 실행하면 잘 수행된 것을 확인할 수 있다.(꼭, anaconda prompt에서 jupyter notebook을 실행시켜야 한다.)

결론적으로, 내가 행했던 오류는....

CMD에서 jupyter notebook을 실행했다는 것이다.

Anaconda3 CLI(Anaconda Prompt)에서 jupyter notebook을 실행시켜야 한다.

 

생각해보니 기본중 기본 아닌가?? 똥멍충이같다ㅠㅠㅠ.

실행 터미널에서 [Ctrl + C]

 

Pandas Series.apply(dtype)

검사 결과에서 '\n'을 카운트해서 for문을 돌려가면서 metastasis 판독 여부를 확인하려고 하였다.

dataframe에서 특정 칼럼의 값을 가져와서 변수에 할당하고 type을 보니 numpy array였다.
문자열로 변환하기 위해 np.array2string()을 해 주었고, 변수 타입은 분명히 string으로 바뀌었는데, 여전히 count()는 실행되지 않았고, 텍스트를 출력했을때 list형태를 보여주었다.

code
result = subset.loc[:,['검사결과']]

text = result.values[0]
print(type(text))
print(text)
text_str = np.array2string(text)
print(type(text_str))
print(text_str)
print('count number -----> ', text_str.count('\n'))
RESULT

아래의 예문은 문자열이 series로 출력되는 경우를 보여준다. 물론 count()도 먹힌다.

CODE
text_str = '임상진단 : rectal cancer\n받은 조직은 포르말린에 고정된 매우 작은 생검 조직으로 총 4개이다. 전부 포매함.\nMICRO (1 HE)\nDIAGNOSIS: \nRectum, endoscopic biopsy:\n ADENOCARCINOMA, moderately differentiated'
print(text_str)
print(type(text_str))
print('count number -----> ', text_str.count('\n'))
RESULT

이 문제를 해결하기 위해 array를 series형태로 변환시켜주는 Pandas Series.apply(dtype)를 이용하여 다시 변환하였고, 결과는 아래와 같이 성공하였다.

CODE
subset["검사결과"] = subset["검사결과"].apply(str)
print(subset, "\n")
print(subset.dtypes)

text = subset["검사결과"][0] # 요기 row index를 for문으로 돌려 줄 예정이다.
print(text)
print('count number -----> ', text.count('\n'))
RESULT

 

문자열 예제에서 여러 줄의 문장을 처리할 때 백슬래시 문자와 소문자 n을 조합한 '\n' 이스케이프 코드를 사용했다. 이스케이프 코드란 프로그래밍 할 때 사용할 수 있도록 미리 정의해 둔 '문자 조합'이다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다.

 

CODE DESCRIPTION
\n 문자열 안에서 줄을 바꿀 때 사용
\t 문자열 사이에 탭 간격을 줄 때 사용
\\ 문자 \ 를 그대로 표현할 때 사용
\' 작은 따옴표( ' )을 그대로 표현할 때 사용
\" 큰따옴표( " )을 그대로 표현할 때 사용
\r 캐리지 리턴(줄 바꿈 문자, 현재 커서를 가장 앞으로 이동)
\f 폼 피드(줄 바꿈 문자, 현재 커서를 다음 줄로 이동)
\a 벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다.)
\b 백 스페이스
\000 널 문자

이 중에서 활용 빈도가 높은 것은 \n, \t, \\, \', \" 이다. 나머지는 프로그램에서 잘 사용하지 않는다.

 

발췌 : https://wikidocs.net/13

CDW에서 병리결과 raw data를 엑셀파일로 받아와서 Main operation 이후 Meta & Recurr로 수술한 케이스를 찾는 일을 파이썬으로 해결하고자 한다.

지금은 파일을 어떻게 해 볼지 이리저리 굴려 보는 중....

 

import pandas as pd

df = pd.read_excel('./pathology.xlsx')

# 이 과정은 for 문을 돌리기 위해 필요하다.
num_rows = df.shape[0]      # 전체 row 갯수
last_index = num_rows - 1   # index는 0부터이므로, -1 해주어야 함.

# 데이터프레임에서 특정컬럼의 데이터만 추출해서 다시 데이터셋 만들기
subset = df.loc[:,['환자번호','검사시행일','검사코드','검사명','검사결과','검사유형','처방전표분류']]

# 데이터셋 오름차순 정렬
subset = subset.sort_values(['환자번호','검사시행일'], ascending=True)


# 정렬 후 인덱스 리셋
subset = subset.reset_index(drop=True)

print(subset.head())

 

+ Recent posts