OpenDataPlatform/CKAN 분석

03. CKAN 프레임워크 - Pandas

안녕하세요.

 

Ckan 프레임워크에서 데이터를 추가할 때 프로파일링 기능을 추가하고자 합니다.

 

Python기반의 모듈인 Pandas를 활용하여 Profiling 기능을 개발했습니다.

 

 

제일 중요한게 개발 환경인데요. CKAN 및 Python 그 외 모듈의 버전은 다음과 같이 진행하였습니다.

 

Ubuntu OS
python 2.7 

pandas 0.20.2
numpy 1.12.0
xlsxwriter 1.1.8

 

 

페이지 추가

데이터 셋 메뉴에 데이터셋 추가 버튼을 통해서 추가할 수 있습니다. Pandas를 이용한 Profiling 기능을 가진 페이지를 추가할 건데요. 페이지를 추가하기 위해 알아야할 부분을 확인해보겠습니다.

 

 

<그림 1-1> 데이터셋 첫 화면

 

<그림 1-1>은 데이터셋 초기 화면입니다. 메뉴에서 데이터셋 버튼을 눌렀을 때 나오는 페이지이죠. Template에서 데이터셋 버튼을 누르게 되면 form을 통해 서버페이지로 정보가 전달됩니다. 해당 form태그의 action을 통해 어느 파일인지 확인할 수 있지만 해당 py파일의 무슨 함수를 사용하는지 알 수 없습니다. 때문에 url 매핑을 이용합니다.

<그림 1-1>을 보면 데이터셋 버튼을 누르고 화면에 Template화면을 반환과 url이 '/dataset'이 붙은 것을 확인할 수 있습니다.

 

<그림 1-2> config/routing.py

<그림 1-2>는 routing.py <그림 1-1>에서 확인한 url으로 서버페이지를 매핑해주는 파일입니다. <그림 1-2>내용을 보면 controller='package', 서버파일이 package파일인 것을 알 수 있습니다. '/dataset'이 매핑된 함수는 action='search' 인 것을 보아서 package.py파일의 search함수가 데이터셋 버튼을 눌렀을 때 실행되는 서버단 코드라고 보시면 될 것 같습니다. 서버 로직이 돌고 결과를 render을 통해 다시 Template로 반환하는 방식이죠.

 

<그림 1-3> 프로파일링 버튼 추가

프로파일링 기능의 페이지를 만들기 위해서 그 전 페이지에 프로파일링 페이지로 넘어가는 버튼을 추가 했습니다. 프로파일링은 엑셀 파일을 이용하기 때문에 데이터셋에서 리소스를 추가하고 넘어가는 부분에 프로파일링 기능을 추가하였습니다. 

 

버튼 클릭시 Pandas 사용, 서버가 지연되어 timeout이 떠서 정상적으로 작동안하는 문제가 있었습니다.

'/etc/apache2/apache2.conf'파일에서 'WSGIApplicationGroup %{GLOBAL}'를 추가해줘서 해결되었습니다.

 

<그림 1-4> Profiling 페이지

<그림 1-4>는 Profiling 페이지 입니다. 좌측 표는 가져온 엑셀 파일을 상위 11개만 출력한 결과이고 우측은 컬럼명입니다.

 

<그림 1-5> ColProfiling 과정

우측에서 보고자하는 컬럼을 선택하고 'ColProfiling' 버튼을 클릭하면 선택한 컬럼별로 결과가 출력됩니다. 컬럼별로 중복된 결과는 하나만 보여집니다. 

 

 

<그림 1-6> DataProfiling 결과

'DataProfiling' 버튼 클릭 시 <그림 1-6>과 같이 전체를 대상으로 count, 평균, 표준편차, 최소값, 최대값, 백분율 기준으로 컬럼별 결과가 출력됩니다.

 

마지막으로 'SAVE' 버튼 클릭 시 프로파일링된 파일 기준으로 리소스에 저장됩니다. 또한 GDB에도 저장됩니다.

 

routing.py 파일에 'm.connect('/dataset/profiling/{id}/{resource_id}', action='profiling')'을 추가하여 매핑하였고 

package.py 파일에 'def profiling(self, id, resource_id)'에 로직을 추가 하였으며

profiling.html 파일을 추가 했습니다.

 

이상으로 Pandas를 이용한 Profiling 페이지 추가에 대한 글을 마치겠습니다.

 

감사합니다.

728x90