2022년 4월 26일 화요일

Orange3의 Python Script 활용하여 데이터 조작하기

 매일 파이썬코딩을 하는 사람이 아니면 머신러닝을 Orange3로 학습하면 좋겠다는 생각입니다. 그런데 오렌지의 위젯은 정해진 틀에서 작동하므로 유연성이 부족합니다. 그래서 조금만 깊게 들어가면 파이썬의 도움이 필요하다는 생각입니다. 오렌지에서는 이것을 쉽게 해결해줄 수 있는 방법이 있는데 Python Script가 있습니다.(파이스크립트는 3.32 기준으로 Transform에 있음)

아래에서 파이썬스크립트를 활용하는 방법을 살펴봅니다.

0. 환경 만들기

    0.1 miniConda를 설치합니다. https://docs.conda.io/en/latest/miniconda.html#

    0.2 VSCode를 설치합니다. https://code.visualstudio.com/

1. 미니콘다가 설치되어 있으면 오렌지3 가상환경을 만들고 액티브합니다.

    $명령어창(윈도우)에서(맥은 터미널) $conda env list 명령을 실행하여 현재 가상환경을 살펴보고 없으면 orange3라는 가상환경을 만듭니다

    $ conda create -n orange3 python=3.8.13  #타임시리즈 위젯사용을 위해 구버전 설치

    $ conda activate orange3 #orange3 가상환경으로 이동합니다.

    (orange3) C:\user\gilson>_   #orange3 가상환경으로 들어 왔습니다.(윈도우)

    (orange3) $ pip list # 또는 conda list #현재 설치되어 있는 package를 살펴봅니다.

    (orange3) $ pip install scipy==1.7.3 #타임시리즈 위젯사용을 위해 구버전 설치

    (orange3) $ pip install orange3==3.32 #2022년04월26일 현재 최신버전

    (orange3) $ orange-canvas& (윈도우에서는 & 대신 ";"을 또는 필요없음)

    (orange3) $ code . 

만약 vscode가 실행이 안되면 맥은 VSCode 설정에서 "shell command" 설정을 하면 되고, 윈도우에서는 path설정이 제대로 되었는지 확인합니다.

이제 오렌지3와 VSCode를 같이 실행할 수 있습니다. 굳이 VSCode를 같이 실행하는 이유는 오렌지의 파이썬스크립트가 AutoComplete 기능과 Code Insight 기능이 없어서입니다. 아래 이미지를 참조하여 보십시요.

2. 오렌지의 파이썬 스크립트 활용

2.1 오렌지3를 실행하고 > 파이썬스크립트 위젯을 캔바스에 드롭하고 > 파이썬스크립트 위젯을 더블크릭합니다.

2.2 VSCode에서 exam.ipynb 파일을 만든 다음 > Kernel을 지정하라고 하면
    위와 같이 orange3의 가상환경의 python 인터프리터를 지정합니다. 
    제대로 되었는지는 아래 그림과 같이 확인 할 수 있습니다.

2.3 스크립트의 내용을 복사하여 VSCode에 붙여 넣습니다. 그리고 이미있는 내용을 참조하여 파이썬 코드를 작성하고 컨트롤+리턴키로 셀을 실행하여 결과를 확인합니다. 
2.4 원하는 결과가 나오면 셀내용을 복사하여 오렌지3의 파이썬 스크립트 에디터에 붙여넣기하고 스크립트 왼쪽아래의 [런버튼]을 크릭하여 실행합니다. 아래그림을 확인해보세요.
2.5 이와 같은 변환은 자주하기 때문에 이 형식을 저장하여 두었다가 사용하면 좋겠지요. 파이썬 스크립트 화면에서 아래 그림과 같이 하여 저장해 둘 수 있습니다.

2.6 당연히 불러오기도 됩니다.
2.7 Update 버튼을 크릭하면 스크립트 내용을 바꿀 수 있겠죠.

3. 넘파이보다는 판다스사용이 좋으시면 이렇게 하면 됩니다. 이번에는 입력데이타가 있는경우입니다.
3.1 VSCode에서 실행하고 결과를 확인합니다.
3.2 코드보기

import Orange.data.pandas_compat as p
# 오렌지의 in_data를 가상으로 만들어 줍니다.
# 오렌지에 붙여 넣기 한 후에는 실행이 안되게 합니다.
idf = p.pd.DataFrame({'x': [1,2,3,4,5],'y': [1,2,3,4,5]})
in_data = p.table_from_frame(idf)
# 아랫부분이 오렌지에서 실행됩니다.
idf = p.pd.concat(in_data.to_pandas_dfs(), axis=1)
idf = idf[:3] # 이런방법으로 pandas를 활용하면 됩니다.
out_data = p.table_from_frame(idf)

3.3 역시 자주 사용되는 형식이므로 저장하여두겠습니다.
3.3 저장할때 한글이 들어가있으면 별도의 에디터프로그램에서 .py 파일을 불러온다음 utf-8로 저장하여야 정상으로 읽어옵니다.

4. VSCode를 사용하지 않고 idle를 사용할 수도 있다. 다만 idle은 conda의 orange3 가상환경에 있는 idle을 실행해주어야 Orange.data.pandas_conpat 를 import 할 수 있습니다.
저같은 경우에는 
C:\Users\gilso\.conda\envs\orange3\Scripts\idle.exe
에 있습니다. (맥에서는 곧바로 실행이 되는데 윈도우에서는 다른곳의 idle이 실행이 되는군요. 아마도 패스문제 이겠지요. 그래도 가상환경내의 실행파일이 실행되야 맞지않나...

5. feature 와 target으로 분리하려면 아래와 같이하면 됩니다.

import numpy as np

from Orange.data import Table, Domain, ContinuousVariable, DiscreteVariable


x1 = DiscreteVariable("size", ["small", "big"])

x2 = ContinuousVariable("height")

x3 = DiscreteVariable("shape", ["circle", "square", "oval"])

y1 = ContinuousVariable("speed")


domain = Domain([x1, x2, x3], y1)


X = np.array([[1, 3.4, 0], [0, 2.7, 2], [1, 1.4, 1]])

Y = np.array([42.0, 52.2, 13.4])


out_data = Table(domain, X, Y)

 
6. 참고로 파이썬스크립트에서 Table변수 다룰때 스트링으로 고친다음 인티져로 고쳐야 하는 경우가 있음. 
    print(num+1)!=print(int(num)+1), print(num+1) == print(int(str(num))+1)임.
! 2022.04.28 01:40 수정함(5번을 추가하였습니다)

댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.