반응형

부제: Julia DataFrame을 쉽게 볼 수 없을까.

 

요즘 시간이 나면 하는 일이 전자공시 OpenDART나, 각종 주식관련 정보를 크롤링을 하고 있습니다. 저의 경우에는 크롤링한 데이터를 SQLite DB로 저장을 해놓고 있습니다. 아직은 초기 단계라서 Atom console 창에서 데이터의 일부만 출력해보고 있으나, 결국에는 그래픽인터페이스를 가진 프로그램으로 만들 계획을 가지고 있습니다.

 

파이썬으로 업무자동화프로그램을 만들때는 간단히 tk로 GUI를 만들고 있지만, Julia는 어떤 gui 패키지를 써야할지 쉽게 선택하기 어렵습니다. 언어가 개발된지 얼마 되지 않아 선택의 폭이 우선 좁은데다가 관련 패키지가 과연 꾸준히 개발이 되련지 의구심이 듭니다. 아무래도 Qt를 바인딩한 QML.jl이 요즘에 활발한 듯 하지만 개인적으로 Qt는 원치 않기에 다른 옵션을 찾다보니 Gtk.jl을 설치하였습니다.

 

첫번째, 저의 난관은 데이터가 대다수 DataFrame 형태를 가지고 있는데, 이를 어떻게 GUI에 보일 수 있는가 입니다. Gtk에 무슨 기능이 있는지도 모르고, 줄리아 프로그래밍에 대한 글들은 파이썬 등에 비해 보잘것 없이 적은 관계로 시간이 오래 걸린 듯 합니다. 엑셀처럼 뭔가 셀로 구분된 테이블이면 좋을 것 같은데, 어떻게 스프레트시트를 구현하는지도 모르겠고, 배보다 배꼽이 커지는 일이 되지 않을가 싶고, DataFrame을 html 테이블 형태로 만들어서 화면에 보일까 싶다가도, 그럴거면 또다른 전혀 알지 못하는 Blink.jl 등 web app 패키지로 가야하나 며칠을 고민했습니다. 그런데, 그냥 Gtk.jl에 당당히 있는 TreeView 예제를 이용하니까 쉽게 해결되네요.

 

DataFrame을 받아서 새창에 보여주는 단순한 get_treeview_from_dataframe()이라는 함수는 다음과 같습니다.

 

using DataFrames, Gtk

function get_treeview_from_dataframe(df::DataFrame)
  name_list = string.(names(df)) # 컬럼 이름
  type_list = eltype.(eachcol(df)) # 각 컬럼의 데이터 타입

  ls = GtkListStore(type_list...) # GtkListStore를 테이터 타입을 입력하여 생성

  for row in Tuple.(eachrow(df)) # dataframe의 각 row를 tuple 형태로 변화하여 입력
    push!(ls,row)
  end

  tv = GtkTreeView(GtkTreeModel(ls)) # treeview 생성

  rTxt = GtkCellRendererText() # 텍스트

  for i in 1:length(name_list)
    tmp = GtkTreeViewColumn(name_list[i], rTxt, Dict([("text",i-1)]))
    # 각 컬럼에 이름을 넣고, 텍스트임을 입력
    push!(tv,tmp)
    GAccessor.resizable(tmp, true) # 컬럼 사이즈 조절 가능
    GAccessor.sort_column_id(tmp,i-1) # 오름/내림차순 정렬 가능
  end

  win = GtkWindow()
  win_scroll = GtkScrolledWindow(tv) # 스크롤 가능한 윈도우
  push!(win,win_scroll)
  Gtk.showall(win)
end

 

위의 함수에 전자공시 OpenDART에서 고유번호를 받아온 데이터프레임을 넘겨주면 아래 그림과 같이 새창과 함께 데이터를 확인할 수 있습니다.

 

 

만들고 보니 참 불만인게, 한글 글꼴을 어떻게든 변경해야하겠네요. 가독성이 정말 떨어집니다...

반응형

+ Recent posts