Programming

AirFlow 설치 및 실행 with M1

인프런 강의

미니 프로젝트 개요

  • 목적: Airflow와 빅쿼리를 활용하여 ETL 및 대시보드를 만들어보는 과정을 설계
  • 환경: MacOS M1

Part I. Docker and Airflow

  • Docker와 Airflow를 설치 및 실행한다.

  • 필자는 가상환경을 선정하고, 그 위에 도커를 추가로 설치하였다.

PostgreSQL 기초 1

개요

  • psql shell 명령어를 간단히 배우도록 한다.
  • Database, Schema, Table를 생성하도록 한다.
  • 데이터타입에 대해 배우도록 한다.

psql Shell 명령어

명령어 설명
\q psql을 종료한다.
\l 데이터베이스를 조회한다.
\c 입력한 DB로 이동한다.
\e 외부편집기로 sql 쿼리 입력 가능
\dt 현재 DB에서 테이블을 확인할 수 있음.
  • 자주 사용하는 명령어이기 때문에 확인한다.

DB 및 Table 다루기

  • 콘솔창에서 book 이름의 DB를 생성한다.
evan=# CREATE DATABASE book;
CREATE DATABASE
  • 그 후, book에 접속한다.
evan=# \c book
You are now connected to database "book" as user "evan".
book=#
  • 이번에는 DROP DATABASE 구문을 통해 book 삭제한다.
evan=# DROP DATABASE book;
DROP DATABASE

SCHEMA 생성

postgres=# CREATE SCHEMA ann_simmons;
CREATE SCHEMA

postgres=# CREATE SCHEMA ty_beck;
CREATE SCHEMA

postgres=# CREATE SCHEMA production;
CREATE SCHEMA

Two Table 생성

  • 두개의 테이블을 생성한다.
CREATE TABLE customers ();
CREATE TABLE orders ();
  • 커밋을 항상 진행한다.
  • psql 터미널에서 \dt를 실행하여 출력값이 잘 나오는지 확인한다.
postgres=# \dt
         List of relations
 Schema |   Name    | Type  | Owner 
--------+-----------+-------+-------
 public | customers | table | evan
 public | orders    | table | evan
(2 rows)

Primary Key 생성

  • 이번에는 Primary Key 생성하는 것을 준비한다.
  • 이제 이 두개의 Table를 생성하도록 합니다.
CREATE TABLE business_type (
	id serial PRIMARY KEY,
  	description TEXT NOT NULL
);

CREATE TABLE applicant (
	id serial PRIMARY KEY,
  	name TEXT NOT NULL,
  	zip_code CHAR(5) NOT NULL,
  	business_type_id INTEGER references business_type(id)
);

CREATE TABLE users (
  id serial PRIMARY KEY,
  first_name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  email TEXT NOT NULL,
  hashed_password CHAR(72) NOT NULL
);

schema.table 생성

  • temp schema를 생성한 후, temp.users table를 작성한다.
CREATE TABLE temp.users (
  id serial PRIMARY KEY,
  first_name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  email TEXT NOT NULL,
  hashed_password CHAR(72) NOT NULL
);

Data Types

  • 크게 Text, NUMERIC, BOOLEAN 형태로 구성이 됩니다.
-- Create the project table
CREATE TABLE project (
	-- Primary Key
	id SERIAL PRIMARY KEY,
    -- franchise 기회
	is_franchise BOOLEAN DEFAULT FALSE,
	-- Franchise 이름
    franchise_name TEXT DEFAULT NULL,
    -- Project 시도
    project_state TEXT,
    -- Project 시군
    project_county TEXT,
    -- Project로 발생한 Job 수
    jobs_supported NUMERIC
);

다양한 Text Data Types

CREATE TABLE book (
  isbn CHAR(13) NOT NULL, 
  author_first_name VARCHAR(50) NOT NULL, 
  author_last_name VARCHAR(50) NOT NULL, 
  content TEXT NOT NULL
);
  • Text data 타입은: TEXT, VARCHAR(N), CHAR(N) 크게 3가지 형태로 구성이 된다.
  • TEXT
    • 길이를 알 수 없는 텍스트 데이터에 적합
  • VARCHAR(N)
    • N은 최대 길이가 N자인 문자열만 저장하도록 열을 제한함.
    • N보다 글자수가 큰 값이 입력이 되면 error가 발생이 됨
    • 만약 N을 지정하지 않으면 TEXT와 동일하게 됨
  • CHAR(N)
    • 정확하게 N 숫자만큼 글자만 들어가게 됨
    • isbn은 주로 출판사에서 볼 수 있는 문자열임

Numeric Data

CREATE TABLE employee (
  id SERIAL PRIMARY KEY, 
  first_name VARCHAR(10) NOT NULL, 
  last_name VARCHAR(10) NOT NULL, 
  num_sales INTEGER
)

-- Create the client table
CREATE TABLE client (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50),
  site_url VARCHAR(50),
  num_employees SMALLINT,
  num_customers INTEGER
);

-- Create the campaign table
CREATE TABLE campaign (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50),
  budget NUMERIC(7, 2),
  num_days SMALLINT DEFAULT 30,
  goal_amount INTEGER DEFAULT 100,
  num_applications INTEGER DEFAULT 0
);
  • Integer Types

(Python-Plotly) Plotly 그래프 깃헙 블로그에 올리기

강의 홍보

개요

  • 깃헙 브로그에 동적 시각화를 올리는 방법에 대해 기술한다.
  • 현재까지 찾아낸 것은 이게 최선입니다! 더 나은 것이 있다면 공유 부탁드립니다. (꾸벅)

필수 라이브러리 설치

$ pip install plotly
$ pip install chart_studio
  • plotly의 역할 그래프를 작성하는 기본 도구이며, chart_studio의 역할은 그래프를 plotly 홈페이지 업로드 할 수 있도록 도와주고, 또한 iframe output으로 변환하는 데 도움을 주는 코드이다.

step 01. 그래프 작성

  • 그래프를 작성합니다.
import plotly.express as px
import chart_studio

gapminder = px.data.gapminder()
fig = px.scatter(gapminder.query("year==2007"), x="gdpPercap", y="lifeExp", size="pop", color="continent",
           hover_name="country", log_x=True, size_max=60)
fig.show()
  • 위 출력물은 실제로는 동적 시각화로 구현이 됩니다만, 캡쳐하여 올려 놓습니다.

File Download VIA SSH Terminal

1줄 요약

  • CURL 명령어는 진심 매우 좋더라.

동기부여

  • SQL 강의를 해야 하는데, 그에 맞는 데이터를 찾는 중이었다. SQL 예제와 함께 있는 데이터를 찾던 중, URL로 적힌 CSV 파일을 확인하였다. 이를 직접 Download로 쉽게 받을 수 있을 까 하는 생각에 구글링 몇개 해보였다.

참고자료

-o, --output <file>
          Write  output to <file> instead of stdout.
-O, --remote-name
          Write output to a local file named like the remote file we get. (Only the file part of the remote file is used, the path is cut off.)
  • 예시 코드는 다음과 같다.
$ curl -O https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD > Chicago.csv
  • OR
$ curl https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD > Chicago.csv

적용

  • 필자 역시 적용해 보았다.
$ curl -O "https://assets/your_url/actsin.csv" > temp.csv
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2078  100  2078    0     0   7556      0 --:--:-- --:--:-- --:--:--  7528
$ ls
actsin.csv
  • 정상적으로 다운로드 되 것을 확인할 수 있었다. 는

SQL 데이터로 불러오기

  • 필자는 postgreSQL 강의를 준비하고 있어서, 해당 데이터를 pgAdmin4로 활용하여 불러보았다.
  • 먼저 테이블을 생성한다.
DROP TABLE IF EXISTS "actsin";
CREATE TABLE actsin
(
    actsin_id integer PRIMARY KEY,
    movie_id integer,
    actor_id integer
);
  • 그리고 파일을 불러온 후 쿼리로 잘 불러오는지 확인합니다.
    • 중간 내용은 생략이 되었습니다. 추후 파일 불러오는 블로그 작성 시 공유 합니다.
SELECT * FROM actsin LIMIT 5;
 actsin_id | movie_id | actor_id 
-----------+----------+----------
         1 |       37 |        1
         2 |       56 |        2
         3 |       10 |        3
         4 |       14 |        3
         5 |       29 |        3
(5 rows)
  • 정상적으로 데이터가 조회되는 것을 확인할 수 있습니다.

PostgreSQL 테이블 생성 예제

테이블 생성 및 수정 삭제

  • pgAdmin4을 활용한 테이블 수정 삭제
  • Schemas에서 public-Table 마우스 오른쪽 버튼을 누른 뒤 Query Tool을 선택합니다.

  • developers 테이블을 별도로 생성합니다.
CREATE TABLE developers (
	book_id INTEGER, 
	date DATE,
	name VARCHAR(80)
)
CREATE TABLE
Query returned successfully in 65 msec.
  • 이번에는 값을 입력하도록 합니다.
INSERT INTO developers VALUES(1, '2019-12-17', '"자바"')
  • 그런데, 작은 따옴표(’)를 넣고 싶을 때는 큰 따옴표(")로 깜사면, 에러가 발생이 됩니다.
INSERT INTO developers VALUES(2, '2019-12-17', "'자바'")
ERROR: 오류:  "'자바'" 이름의 칼럼은 없습니다
LINE 1: INSERT INTO developers VALUES(1, '2019-12-17', "'자바'")
                                                       ^
SQL state: 42703
Character: 48
  • 이런 경우에는 작은 따옴표를 두번 입혀서 깜사도록 합니다.
INSERT INTO developers VALUES(2, '2019-12-17', '''자바''')
INSERT 0 1

Query returned successfully in 38 msec.
  • 이번에는 Python’s Programming을 입력하도록 합니다.
  • 입력하고자 하는 ‘주위로 각각 두번 ’’ 입력하도록 합니다.
INSERT INTO developers VALUES(3, '2019-12-17', 'Python''s Programming');
INSERT 0 1

Query returned successfully in 32 msec.

테이블 조회

  • 일단 먼저 잘 조회가 되는지 확인 하도록 합니다.
SELECT * FROM developers;

pgAdmin4 GUI installation on MacOS M1

pgAdmin 설치 및 서버 연결 (MacOS)

  • GUI 프로그램을 설치해본다.
  • Windows는 자동으로 설치가 되기 때문에 생략을 한다.
  • 먼저 해당 싸이트에 접속을 합니다.

  • macOS를 클릭한 뒤 다음 화면에서 pgAdmin 4 v5.3 최신버전을 다운로드 받도록 합니다.

  • 프로그램을 설치하면 첫 화면에서 Password를 입력하도록 합니다.

  • 새로운 서버를 생성하여 서버를 등록하도록 합니다. 그 후에 이름은 LocalTest라고 정합니다.

  • 그 후에, username은 postgres를 username으로 입력하고 Postgresql을 설치할 때 설정한 password를 입력합니다.

  • 실제 서버에 연결 되었는지 확인하도록 합니다.

Postgre SQL Installation on Windows 10

Windows

  • 필자는 13.3 버전을 선택하였습니다.

  • 이번에는 프로그램을 클릭하여 설치를 진행합니다.

  • 모든 값은 default로 진행합니다.

  • 비밀번호는 작성 후, 반드시 기억하시기를 바랍니다.

    • 필자는 temp라고 명명하였습니다.

  • 포트는 5432를 확인합니다.

  • 언어는 한국어로 선택하도록 합니다.

  • 몇번의 Next를 더 누르시면서, 설치를 진행합니다.

  • 설치가 완료되면 Stack Builder 체크 박스는 제 후 완료를 합니다. 해

  • 프로그램을 검색하여 PostgreSQL이 잘 설정되는지 확인을 하도록 합니다.

환경변수 추가

  • CMD에서 활용하려면 환경변수를 설정하도록 합니다.
  • 먼저 경로를 복사합니다.

[Python] 이미지 데이터 입출력

1줄 요약

  • OpenCV를 활용한 다양한 이미지 입출력에 대해 배우도록 한다.

Reading/Writing an image file

  • 이미지 관련 I/O
  • BMP, PNG, JPEG, and TIFF also supported.
import numpy as np
img = np.zeros((3, 3), dtype=np.uint8)
img
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=uint8)
  • 각 픽셀은 8비트 int로 구성되어 있음.
  • 각 픽셀의 범위는 0-255, 0은 검은색, 255는 흰색을 의미함.
import cv2 
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
img
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]], dtype=uint8)
  • 3차원 배열을 의미. 각 채널은 Blue, Green, Red를 의미한다.

image Load

  • Convert PNG into JPEG
  • 사용할 이미지는 아래와 같다.

Postgre SQL Installation on MacOS M1

1줄 요약

  • MacOS M1에서 PostgreSQL 설치에서 중요한 건 환경변수만 추가한다.

M1의 구조

  • M1애서는 Intel, Silicon, Universal 3개의 시스템을 지원한다.
    • 그런데, PostgreSQL 프로그램은 기본적으로 Intel 기반으로 작동을 한다.

Postgre SQL 다운로드

  • 해당 웹 페이지로 간다. (URL: https://postgresapp.com/)

  • 다운로드 받은 후 Postgres-2.4.3-13.dmg (2021.5.31일 기준) 설치 파일을 클릭한 후, 아래 화면이 나오면, 설치를 진행합니다.

  • 설치 진행이 완료가 되면 아래 화면에서 Initialize 또는 Start 버튼을 클릭하면 설치는 끝이 납니다.

환경변수 설정

  • 그런데, 환경변수 설정을 하지 않으면 터미널에서 실행이 되지 않습니다.
$ psql
-bash: psql: command not found

Pandas 속도 비교 - with or without Dictionary

강의 홍보

1줄 요약

  • Dictionary를 활용한 값 변경의 속도가 훨씬 빠르다.

데이터 불러오기

  • diamonds 데이터셋을 불러온다.
import pandas as pd
import seaborn as sns

diamonds = sns.load_dataset('diamonds')
print(diamonds)
       carat        cut color clarity  depth  table  price     x     y     z
0       0.23      Ideal     E     SI2   61.5   55.0    326  3.95  3.98  2.43
1       0.21    Premium     E     SI1   59.8   61.0    326  3.89  3.84  2.31
2       0.23       Good     E     VS1   56.9   65.0    327  4.05  4.07  2.31
3       0.29    Premium     I     VS2   62.4   58.0    334  4.20  4.23  2.63
4       0.31       Good     J     SI2   63.3   58.0    335  4.34  4.35  2.75
...      ...        ...   ...     ...    ...    ...    ...   ...   ...   ...
53935   0.72      Ideal     D     SI1   60.8   57.0   2757  5.75  5.76  3.50
53936   0.72       Good     D     SI1   63.1   55.0   2757  5.69  5.75  3.61
53937   0.70  Very Good     D     SI1   62.8   60.0   2757  5.66  5.68  3.56
53938   0.86    Premium     H     SI2   61.0   58.0   2757  6.15  6.12  3.74
53939   0.75      Ideal     D     SI2   62.2   55.0   2757  5.83  5.87  3.64

[53940 rows x 10 columns]
  • Color 데이터를 확인해보자.
diamonds['color'].value_counts()
G    11292
E     9797
F     9542
H     8304
D     6775
I     5422
J     2808
Name: color, dtype: int64

color 데이터 값 변경하기

  • D, E, F는 A로 바꿉니다.
  • G, H는 B로 바꿉니다.
  • I, J는 C로 바꿉니다.

Without Dictionary

  • 먼저 첫번째 방법입니다.
import time 

start_time = time.time()
diamonds['color'].replace('D', 'A', inplace=True)
diamonds['color'].replace('E', 'A', inplace=True)
diamonds['color'].replace('F', 'A', inplace=True)
diamonds['color'].replace('G', 'B', inplace=True)
diamonds['color'].replace('H', 'B', inplace=True)
diamonds['color'].replace('I', 'C', inplace=True)
diamonds['color'].replace('J', 'C', inplace=True)

print("Time using .replace() only: {} sec".format(time.time() - start_time))
print("---")
print(diamonds['color'].value_counts())
Time using .replace() only: 0.025814056396484375 sec
---
A    26114
B    19596
C     8230
Name: color, dtype: int64

With Dictionary

  • 이번에는 Dictionary를 활용합니다.
diamonds = sns.load_dataset('diamonds')

start_time = time.time()
diamonds.replace({'color': {'D':'A', 'E':'A', 'F':'A', 'G':'B', 'H':'B', 'I':'C', 'J':'C'}}, inplace=True)

print("Time using .replace() only: {} sec".format(time.time() - start_time))
print("---")
print(diamonds['color'].value_counts())
Time using .replace() only: 0.005134105682373047 sec
---
A    26114
B    19596
C     8230
Name: color, dtype: int64
  • 동일한 결괏값이 나왔지만, 속도 차이가 0.02초 vs 0.005초 차이로 매우 큼을 확인할 수 있다.
  • 즉, 값을 변경한다면, Dictionary를 사용한다.