Programming

Plotly 그래프 시작하기 - 필수 사전 준비

개요

  • Plotly 그래프의 기본 생태계를 익히도록 한다.
  • Plotly 그래프를 작성하도록 한다.

라이브러리 불러오기

  • 본 코드는 모두 Local 가상환경을 설치한 후, Jupyter Lab에서 작성했다.
  • 현재 plotly 버전은 다음과 같다.
import plotly
print(plotly.__version__)
5.1.0
  • 로컬 환경에서 Jupyter notebook에서 plotly 그래프가 간혹 나타나지 않는 경우가 있다. 그런 경우, 아래와 같이 추가로 설치를 진행한다.
jupyter labextension install jupyterlab-plotly
  • 설치가 완료되었다면, 아래와 같은 코드를 추가로 실행한다.
import plotly
plotly.offline.init_notebook_mode(connected=True)

그래프 테스트

  • 먼저, 아래와 같은 샘플 코드를 실행했을 때, Jupyter Lab 상에 그래프 창이 나오면 정상이다.
import plotly.graph_objects as go
weekly_sales = dict({
    "data": [{
        "type": "bar", 
        "x": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], 
        "y": [28, 27, 25, 31, 32, 35, 36]
    }], 
    "layout" : {"title": {"text": "Sales of the week", 
                          "x": 0.5, "font": {"color": "red", "size": 15}}}
})

fig = go.Figure(weekly_sales)
fig.show()

Screen Shot 2022-09-08 at 5.28.19 PM.png

Flask Web Resume Using Templates

개요

  • Flask 웹개발을 통해 간단한 Resume를 작성해본다.

가상환경

  • 프로젝트 폴더에 가상환경을 설치한다.
virtualenv venv
created virtual environment CPython3.9.12.final.0-64 in 5343ms
  creator CPython3Windows(dest=C:\Users\human\Desktop\flask-resume-evan-examples\venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy,
app_data_dir=C:\Users\human\AppData\Local\pypa\virtualenv)
    added seed packages: pip==22.2.2, setuptools==63.2.0, wheel==0.37.1
  activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

라이브러리 설치

  • 가상환경에 접속 후, Flask 라이브러리를 설치한다.
pip install Flask
  • [app.py](http://app.py) 에 다음과 같이 작성한다.
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    first_name = 'Evan'
    return render_template('index.html', f_name = first_name)
  • templates에서 index.html 파일을 만든다.

Dash App Using Flask Factory Pattern and Blueprint - 2

강의 홍보

개요

  • 기존 Flask-Dash-Heroku 연동 예제를 업그레이드 한다.
  • Flask Factory Application의 기본 개념 및 Blueprint의 기본 개념을 이해한다.
  • Dash App을 Flask Factory Application에 맞추어 가공 한다.

리뷰

미리보기

  • 다음과 같이 메뉴가 있도록 코드를 작성할 예정이다.

Untitled

Dash App Using Flask Factory Pattern and Blueprint - 1

강의 홍보

개요

  • 기존 Flask-Dash-Heroku 연동 예제를 업그레이드 한다.
  • Flask Factory Application의 기본 개념 및 Blueprint의 기본 개념을 이해한다.

리뷰

미리보기

  • 다음과 같이 메뉴가 있도록 코드를 작성할 예정이다.

Untitled

Grafana 설치 및 대시보드 만들기 - 기본편

개요

  • Grafana 대시보드를 다운로드 받고, 그래프를 작성한다.
  • DB 연동을 통해 대시보드를 작성해본다.

설치

Untitled

Untitled

  • Sign in 페이지가 나오면 admin을 각각 입력하면, 패스워드 변경하는 입력이 나오면 그 때 각자 본인에게 맞는 패스워드로 변경한다.
    • 필자는 12345678로 지정했다.

첫번째 대시보드

  • Dashboard를 클릭한다.

Untitled

  • Add a new panel를 클릭한다.

Untitled

  • 아래 그림에서 Data source를 클릭한다.

Untitled

  • Query 탭에 Grafana를 선택한 상태에서 우측 상단의 Apply 버튼을 클릭한다.

Untitled

Flask-Dash-Heroku 연동

개요

  • Flask 및 Dash를 활용하여 간단한 대시보드를 생성할 수 있다.
  • 기존 구현한 대시보드를 Heroku에 배포할 수 있다.

사전준비

  • 파이썬 가상환경 설치 및 기존 라이브러리에 대한 이해가 어느정도 있음을 가정한 상태에서 본 블로그를 작성했음을 유의한다.
  • Heroku 회원가입 및 로그인이 되어 있어야 한다.

Step 1. Github Repo생성

  • Github Repo 생성 시, 중복되지 않을 법한 이름으로 생성
    • 필자 Repo : flask-heroku-dash-evan1234
  • 해당 Repo를 로컬로 가져온다.
git clone https://github.com/your_name/your_unique_repo.git

Step 2. 가상환경 설치 및 주요 라이브러리 설치

  • 먼저 가상환경을 설치한다.
virtualenv venv
  • 가상환경에 접속한다.
source venv/Scripts/activate
  • 주요 라이브러리를 설치한다.
    • pandas : 데이터 불러오기 및 가공
    • dash & plotly : 동적 시각화 대시보드 제공 라이브러리
    • Flask : Flask 웹 프레임워크
    • SQLAlchemy : 데이터베이스 연동 프레임워크
pip install dash plotly Flask pandas gunicorn psycopg2-binary SQLAlchemy Flask-SQLAlchemy

Step 3. 기본 배포 테스트

  • 먼저 본격적인 코드에 앞서 기본적으로 배포가 되는지 확인한다.
  • 필요한 파일 app.py, Procfile, runtime.txt, requirements.txt 파일이 필요하다.

(1) app.py

  • 아래와 같이 작성한다.
# -*- coding:utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World"

(2) Procfile 파일 작성

  • 대문자 및 소문자 정확하게 기재해야 한다.
web: gunicorn app:app

(3) runtime.txt 파일 작성

python-3.9.12

(4) requirements.txt 파일 작성

  • 해당 파일은 기존에 설치했던 라이브러리를 모두 호출하는 형식이어야 한다.
  • 프로젝트 Root 경로에서 아래와 같이 실행한다.
pip freeze > requirements.txt
  • 전체 파일 구조를 확인하면 아래와 같다.
$ ls
app.py  Procfile  README.md  requirements.txt  runtime.txt  venv/

(5) wsgi.py 파일 작성

from app import app

if __name__ == "__main__":
    app.run(threaded=True, port=5000)

(5) 배포 시작

  • 아래 명령어를 순차적으로 입력하여 실행한다.
    • heroku login 시, Web UI에서 실제 ID와 Password를 입력해야 한다.
    • heroku create github repo와 동일하게 작성한다.
heroku login
heroku create your_project_repo
git add .
git commit -m "initial updated"
git push # github repo에 추가
git push heroku main

(6) 배포 사이트 확인

  • 실제로 정상적으로 배포가 완료가 되었다면 실제 웹사이트 URL을 클릭 후, 아래와 같이 확인할 수 있어야 한다.
  • 배포가 진행이 안된다면, 그 다음 코드를 입력하는 것은 의미가 없기 때문에 확인 후 넘어가도록 한다.

Untitled

Mecab 사용자 단어 사전 추가 in R, windows 10

개요

  • Mecab에서 사용자 단어를 추가하고 직접 사용하는 예제를 만들어본다.
  • 사전에 Mecab은 설치가 되어 있다고 가정한다. 만약 처음 설치한다면, 다음 참조 링크에서 설치를 진행한다.

문제점

  • 아래그림과 같이 ‘사회적경제’라는 단어가 잡히지 않는 것을 확인할 수 있다.

Untitled

해결방법

  • 먼저, 사전 위치를 찾는다.
    • mecab > user-dic 폴더 내에 nnp.csv 파일을 찾는다.

Untitled

Untitled

  • nnp.csv 파일을 메모장으로 열고 수정한다.

Untitled

Flask Heroku Pandas Postgres 튜토리얼

강의 홍보

개요

  • Flask 기본적인 작동 원리를 배운다.
  • Postgres와 SQLAlchemy를 활용한다.
  • Heroku에 배포를 진행한다.

사전준비

  • Github에 각 개인에게 맞는 Github Repo를 생성한다.
    • 주의 : 반드시 Unique하게 작성해야 한다.
  • 가상환경 설정을 진행한다.
  • PostgreSQL DB 설정은 다음을 참조한다.
virtualenv venv
  • 주요 라이브러리를 설치한다.
pip install Flask psycopg2 SQLAlchemy pandas gunicorn

배포

  • 프로젝트 시작 전에는 항상 선 배포를 하고 시작한다.
  • app.py를 만들어본다.
# -*- coding: utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"
  • 3개의 파일이 필요하다.

Scikit-Learn ML Model with Java

강의 홍보

개요

  • scikit-learn 모델을 JAVA에서 구동 시켜야 한다.
  • 크게 3가지 방법론이 존재한다.(원문 참조 : Moving from Python to Java to deploy your machine learning model to production
    • embed : Java 코드 내에서 직접 Python 코드 구현 방법. Jython을 이용하지만, 문제는 Scikit-Learn은 지원하지 않는다. 따라서 일반적으로 Flask API를 통해서 지원하기도 한다.
    • transpile : Scikit-Learn 모델을 전달하는 방법. sklearn-porterm2cgen를 고려할 수 있다.
    • redevelop : Scikit-Learn 모델을 H20나 Spark의 MLib을 구현한 후 배포하는 방법이다.

새로운 제안

  • 그러나 다각도로 여러 시도 및 라이브러리가 존재함.
  • 오늘 소개할 라이브러니느 sklearn2pmml임.
  • JAVA가 설치가 되어 있어야 함.
    • 로컬 환경은 각자 환경변수를 추가해야 함. 이 부분은 생략함.
  • 구글 코랩에서는 아래와 같이 설치가 가능함.
  • Java 코드 참조 : Using scikit-learn model into Java app
!apt update -q
!apt-get install -q openjdk-11-jdk-headless

%env JAVA_HOME "/usr/lib/jvm/java-11-openjdk-amd64"
Hit:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64  InRelease
Get:2 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/ InRelease [3,626 B]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Hit:4 http://ppa.launchpad.net/c2d4u.team/c2d4u4.0+/ubuntu bionic InRelease
Hit:5 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:6 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Ign:7 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  InRelease
Hit:8 http://ppa.launchpad.net/cran/libgit2/ubuntu bionic InRelease
Hit:9 https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64  Release
Hit:10 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu bionic InRelease
Get:11 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Hit:12 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu bionic InRelease
Get:14 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2,867 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [1,075 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2,297 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3,302 kB]
Fetched 9,797 kB in 6s (1,534 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
49 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists...
Building dependency tree...
Reading state information...
openjdk-11-jdk-headless is already the newest version (11.0.15+10-0ubuntu0.18.04.1).
The following package was automatically installed and is no longer required:
  libnvidia-common-460
Use 'apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 49 not upgraded.
env: JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
  • 설치가 끝난 후에는 sklearn2pmml을 설치한다.
!pip install sklearn2pmml
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting sklearn2pmml
  Downloading sklearn2pmml-0.84.2.tar.gz (6.3 MB)
     |████████████████████████████████| 6.3 MB 5.1 MB/s 
[?25hRequirement already satisfied: joblib>=0.13.0 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.1.0)
Requirement already satisfied: scikit-learn>=0.18.0 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.0.2)
Requirement already satisfied: sklearn-pandas>=0.0.10 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.8.0)
Requirement already satisfied: numpy>=1.14.6 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (1.21.6)
Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (1.4.1)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (3.1.0)
Requirement already satisfied: pandas>=0.11.0 in /usr/local/lib/python3.7/dist-packages (from sklearn-pandas>=0.0.10->sklearn2pmml) (1.3.5)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (2022.1)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (1.15.0)
Building wheels for collected packages: sklearn2pmml
  Building wheel for sklearn2pmml (setup.py) ... [?25l[?25hdone
  Created wheel for sklearn2pmml: filename=sklearn2pmml-0.84.2-py3-none-any.whl size=6298569 sha256=f6a564303dd11e9ce38b6c7b4ec4e8a4632499c61d3ee69f40070a1f1983ef80
  Stored in directory: /root/.cache/pip/wheels/bb/e4/71/d3c8f75fae8d7f387f82099ec8cdd6b83cf1dccaeb3561c7b6
Successfully built sklearn2pmml
Installing collected packages: sklearn2pmml
Successfully installed sklearn2pmml-0.84.2

샘플 코드 작성

  • 간단한 모형을 구축한다.
from sklearn.datasets import load_diabetes
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn2pmml import PMMLPipeline, sklearn2pmml
import pandas as pd

# 데이터 불러오기
df = load_diabetes()
X = pd.DataFrame(columns = df.feature_names, data = df.get('data'))
y = pd.DataFrame(columns = ['target'], data = df.get('target'))

# 데이터셋 분리하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state=42)

# Pipeline 구축하기
pipeline = PMMLPipeline([ ('regressor', DecisionTreeRegressor()) ])

# 모형 학습 시키기
pipeline.fit(X_train, y_train)
PMMLPipeline(steps=[('regressor', DecisionTreeRegressor())])
  • 이번에는 모형을 테스트 한다.
from sklearn.metrics import mean_absolute_error
y_pred = pipeline.predict(X_test)
print('MAE: ', mean_absolute_error(y_pred, y_test))
MAE:  65.42222222222222
  • 이제 모형을 pmml 파일 형태로 저장한다.
# 모델 내보내기
sklearn2pmml(pipeline, 'model.pmml', with_repr = True)

Scikit-Learn Model into JAVA

  • 해당 모형을 이제 이제 Java에서 가져오도록 한다.
  • Java 코드에서는 pmml4s library를 이용한다.
import org.pmml4s.model.Model;

import java.util.*;

public class Main {

    private final Model model = Model.fromFile(Main.class.getClassLoader().getResource("model.pmml").getFile());

    public Double getRegressionValue(Map<String, Double> values) {
        Object[] valuesMap = Arrays.stream(model.inputNames())
                .map(values::get)
                .toArray();

        Object[] result = model.predict(valuesMap);
        return (Double) result[0];
    }

    public static void main(String[] args) {
        Main main = new Main();
        Map<String, Double> values = Map.of(
                "age", 20d,
                "sex", 1d,
                "bmi", -100d,
                "bp", -200d,
                "s1", 1d,
                "s2", 2d,
                "s3", 3d,
                "s4", 4d,
                "s5", 5d,
                "s6", 6d
        );

        double predicted = main.getRegressionValue(values);
        System.out.println(predicted);
    }
}

Oracle CSV File Upload using CMD

개요

  • iris.csv 파일을 오라클 명령어를 통해서 업로드를 진행한다.
  • 대부분의 명령어는 터미널에서 처리하였다.

SQLPLUS 접속

  • SQL에 접속한다.

Untitled

테이블 생성

  • 터미널에서 iris 테이블을 생성한다.

Untitled

CREATE TABLE iris (
	sepal_length INTEGER, 
	sepal_width  INTEGER, 
  petal_length INTEGER, 
  petal_width  INTEGER, 
  species      varchar2(20)
);

ctl 파일 생성

  • 메모장에 아래와 같이 ctl 파일을 생성한다.
  • 파일명은 control.ctl이다.
LOAD DATA
INFILE 'iris.csv'
INTO TABLE iris
fields terminated by ','
(
    sepal_length,
    sepal_width, 
    petal_length,
    petal_width,
    species
)

파일 업로드

  • sqlplus 접속을 종료한다.
  • control.ctl 파일이 있는 경로로 이동한다. 만약, control.ctl.txt 형태로 저장이 되어 있다면, vscode 편집기에서 수정하는 것을 권한다.

Untitled