엑셀 데이터 가공하기 변환

강의 홍보

개요

  • 정리되지 못한 엑셀 파일을 불러와서 하나의 테이블을 만드는 과정을 진행해본다.

  • 위 데이터를 원본 그대로 받아서 pandas 데이터 프레임에 추가한다.
  • A3 셀에 있는 [시·도지사선거][서울특별시][강남구] 분리하여 각 column에 추가한다.

라이브러리 불러오기

  • 3개의 라이브러리를 불러온다.
import pandas as pd
import openpyxl
import os

파일 확인

  • data 폴더 내 데이터를 확인한다.
  • 추후, 엑셀 데이터만 추려서 반복문을 활용하여 동일하게 처리할 수 있도록 상상을 한다.
print(os.listdir('data'))
['1 강남구-[2021년_재·보궐선거]_개표단위별_개표결과.xlsx', '.DS_Store', '~$1 강남구-[2021년_재·보궐선거]_개표단위별_개표결과.xlsx']

openpyxl 라이브러리 할용

  • openpyxl 라이브러리는 A Python library to read/write Excel 2010 xlsx/xlsm files을 가지고 있다.
  • 먼저 A3 셀에 있는 [시·도지사선거][서울특별시][강남구] 데이터를 가져오도록 한다.
  • 이 때, openpyxl 라이브리를 활용하면 각 셀에 접근해서 개별적으로 데이터를 가져올 수 있다.
DATA_PATH = "data"
FILE_PATH = os.listdir(DATA_PATH)[0]
wb_obt= openpyxl.load_workbook("data/" + FILE_PATH) 
sheet = wb_obt.active
values = sheet["A3"].value
values
'[시·도지사선거][서울특별시][강남구]'

문자열 전처리

  • 먼저 하나의 셀로 연결되어 있는 것을 각각 분리하도록 하는 코드를 작성한다.
  • strip(‘pattern’)는 특정 문자를 제거하는 것이고, split(‘pattern’)는 문자열을 특수문자로 분리하는 것이다.
city_list = values.strip("[]").split("][")
city_list
['시·도지사선거', '서울특별시', '강남구']

데이터 수집 및 전처리

  • 이 때 중요한 parameters는 skiprows, header이다.
  • 먼저 skiprows는 특정 행은 건너 뛴다는 의미를 가지고 있다. 즉, 데이터프레임에 접근하기 전까지의 행은 건너 뛴다는 의미다.
  • header는 엑셀의 열에 해당하는데, 본 데이터에서는 multiple headers가 있다. 따라서, 이를 리스트 처리하면 해당 열은 모두 가져올 수 있다.
df = pd.read_excel("data/1 강남구-[2021년_재·보궐선거]_개표단위별_개표결과.xlsx", skiprows=3,  header=[0, 1], )
df.drop(columns=df.columns[-1], axis=1, inplace=True) # 마지막 column은 NAN라 삭제.  
print(df.head())
                읍면동명               투표구명               선거인수                투표수  \
  Unnamed: 0_level_1 Unnamed: 1_level_1 Unnamed: 2_level_1 Unnamed: 3_level_1   
0                 합계                              452344.0           276485.0   
1               거소투표                                3062.0             2877.0   
2             관외사전투표                               12957.0            12955.0   
3                신사동                 소계            13922.0             8672.0   
4                                관내사전투표             2667.0             2667.0   

     후보자별 득표수                                                               \
  더불어민주당\n박영선 국민의힘\n오세훈 기본소득당\n신지혜 국가혁명당\n허경영 미래당\n오태양 민생당\n이수봉 민생당\n이수봉.1   
0     66907.0  202320.0      909.0     2005.0    229.0    424.0        NaN   
1       595.0    1995.0       14.0       97.0     11.0     24.0        NaN   
2      4393.0    8171.0       48.0      100.0     18.0     18.0        NaN   
3      1581.0    6910.0       20.0       45.0      6.0     15.0        NaN   
4       632.0    1977.0        6.0       12.0      3.0      6.0        NaN   

                                                                        \
  신자유민주연합\n배영규 여성의당\n김진아 진보당\n송명숙 무소속\n정동희 무소속\n이도엽 무소속\n신지예         계   
0         20.0    1212.0    274.0     82.0     47.0    655.0  275084.0   
1          3.0       2.0      6.0      8.0      2.0      8.0    2765.0   
2          0.0      67.0     23.0      6.0      2.0     39.0   12885.0   
3          1.0      36.0      5.0      3.0      1.0     20.0    8643.0   
4          0.0       8.0      3.0      1.0      1.0      5.0    2654.0   

              무효\n투표수                 기권수  
  Unnamed: 18_level_1 Unnamed: 19_level_1  
0              1401.0            175859.0  
1               112.0               185.0  
2                70.0                 2.0  
3                29.0              5250.0  
4                13.0                 0.0  
  • header[0]값은 읍면동명, 투표구명, 선거인수, 투표수 등으로 정리가 되어 있다.
  • header[1]값은 각 후보들의 값이 나타난 것을 확인할 수 있다.
  • 여기에서 후보자별 득표수만 지우기만 하면 된다. 다만, 각각 가져와야 하는 값이 서로 다르다.
    • 이 때, MultiIndex에 대응하기 위해 get_level_values() 함수를 사용한다.
df.columns
MultiIndex([(    '읍면동명',  'Unnamed: 0_level_1'),
            (    '투표구명',  'Unnamed: 1_level_1'),
            (    '선거인수',  'Unnamed: 2_level_1'),
            (     '투표수',  'Unnamed: 3_level_1'),
            ('후보자별 득표수',         '더불어민주당\n박영선'),
            ('후보자별 득표수',           '국민의힘\n오세훈'),
            ('후보자별 득표수',          '기본소득당\n신지혜'),
            ('후보자별 득표수',          '국가혁명당\n허경영'),
            ('후보자별 득표수',            '미래당\n오태양'),
            ('후보자별 득표수',            '민생당\n이수봉'),
            ('후보자별 득표수',          '민생당\n이수봉.1'),
            ('후보자별 득표수',        '신자유민주연합\n배영규'),
            ('후보자별 득표수',           '여성의당\n김진아'),
            ('후보자별 득표수',            '진보당\n송명숙'),
            ('후보자별 득표수',            '무소속\n정동희'),
            ('후보자별 득표수',            '무소속\n이도엽'),
            ('후보자별 득표수',            '무소속\n신지예'),
            ('후보자별 득표수',                   '계'),
            ( '무효\n투표수', 'Unnamed: 18_level_1'),
            (     '기권수', 'Unnamed: 19_level_1')],
           )
df.columns.get_level_values(0)
Index(['읍면동명', '투표구명', '선거인수', '투표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수',
       '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수',
       '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '후보자별 득표수', '무효\n투표수',
       '기권수'],
      dtype='object')
df.columns.get_level_values(1)
Index(['Unnamed: 0_level_1', 'Unnamed: 1_level_1', 'Unnamed: 2_level_1',
       'Unnamed: 3_level_1', '더불어민주당\n박영선', '국민의힘\n오세훈', '기본소득당\n신지혜',
       '국가혁명당\n허경영', '미래당\n오태양', '민생당\n이수봉', '민생당\n이수봉.1', '신자유민주연합\n배영규',
       '여성의당\n김진아', '진보당\n송명숙', '무소속\n정동희', '무소속\n이도엽', '무소속\n신지예', '계',
       'Unnamed: 18_level_1', 'Unnamed: 19_level_1'],
      dtype='object')
  • 이제, 각각의 index를 list로 변환후 하나의 column으로 합치는 과정을 진행한다.
  • 총 20개의 column이 정렬된 것을 확인할 수 있다.
col_1 = df.columns.get_level_values(0)[0:4].tolist()
col_2 = df.columns.get_level_values(1)[4:-2].tolist()
col_3 = df.columns.get_level_values(0)[-3:-1].tolist()
cols = col_1 + col_2 + col_3
cols
['읍면동명',
 '투표구명',
 '선거인수',
 '투표수',
 '더불어민주당\n박영선',
 '국민의힘\n오세훈',
 '기본소득당\n신지혜',
 '국가혁명당\n허경영',
 '미래당\n오태양',
 '민생당\n이수봉',
 '민생당\n이수봉.1',
 '신자유민주연합\n배영규',
 '여성의당\n김진아',
 '진보당\n송명숙',
 '무소속\n정동희',
 '무소속\n이도엽',
 '무소속\n신지예',
 '계',
 '후보자별 득표수',
 '무효\n투표수']
df.columns = cols
df.columns
Index(['읍면동명', '투표구명', '선거인수', '투표수', '더불어민주당\n박영선', '국민의힘\n오세훈', '기본소득당\n신지혜',
       '국가혁명당\n허경영', '미래당\n오태양', '민생당\n이수봉', '민생당\n이수봉.1', '신자유민주연합\n배영규',
       '여성의당\n김진아', '진보당\n송명숙', '무소속\n정동희', '무소속\n이도엽', '무소속\n신지예', '계',
       '후보자별 득표수', '무효\n투표수'],
      dtype='object')
  • 이제 시도와 시군구를 각각 추가한다.
df['시도'] = city_list[1]
df['시군구'] = city_list[2]
print(df.head(10))
     읍면동명    투표구명      선거인수       투표수  더불어민주당\n박영선  국민의힘\n오세훈  기본소득당\n신지혜  \
0      합계          452344.0  276485.0      66907.0   202320.0       909.0   
1    거소투표            3062.0    2877.0        595.0     1995.0        14.0   
2  관외사전투표           12957.0   12955.0       4393.0     8171.0        48.0   
3     신사동      소계   13922.0    8672.0       1581.0     6910.0        20.0   
4          관내사전투표    2667.0    2667.0        632.0     1977.0         6.0   
5          신사동제1투    2313.0    1052.0        205.0      827.0         1.0   
6          신사동제2투    1740.0     733.0        220.0      492.0         3.0   
7          신사동제3투    1896.0     813.0        261.0      508.0         6.0   
8          신사동제4투    2812.0    1736.0        112.0     1611.0         0.0   
9          신사동제5투    2494.0    1671.0        151.0     1495.0         4.0   

   국가혁명당\n허경영  미래당\n오태양  민생당\n이수봉  ...  여성의당\n김진아  진보당\n송명숙  무소속\n정동희  \
0      2005.0     229.0     424.0  ...     1212.0     274.0      82.0   
1        97.0      11.0      24.0  ...        2.0       6.0       8.0   
2       100.0      18.0      18.0  ...       67.0      23.0       6.0   
3        45.0       6.0      15.0  ...       36.0       5.0       3.0   
4        12.0       3.0       6.0  ...        8.0       3.0       1.0   
5         8.0       1.0       1.0  ...        4.0       0.0       1.0   
6        10.0       0.0       2.0  ...        5.0       0.0       0.0   
7         8.0       0.0       3.0  ...       14.0       2.0       0.0   
8         2.0       1.0       2.0  ...        2.0       0.0       1.0   
9         5.0       1.0       1.0  ...        3.0       0.0       0.0   

   무소속\n이도엽  무소속\n신지예         계  후보자별 득표수   무효\n투표수     시도  시군구  
0      47.0     655.0  275084.0    1401.0  175859.0  서울특별시  강남구  
1       2.0       8.0    2765.0     112.0     185.0  서울특별시  강남구  
2       2.0      39.0   12885.0      70.0       2.0  서울특별시  강남구  
3       1.0      20.0    8643.0      29.0    5250.0  서울특별시  강남구  
4       1.0       5.0    2654.0      13.0       0.0  서울특별시  강남구  
5       0.0       2.0    1050.0       2.0    1261.0  서울특별시  강남구  
6       0.0       1.0     733.0       0.0    1007.0  서울특별시  강남구  
7       0.0       6.0     809.0       4.0    1083.0  서울특별시  강남구  
8       0.0       1.0    1732.0       4.0    1076.0  서울특별시  강남구  
9       0.0       5.0    1665.0       6.0     823.0  서울특별시  강남구  

[10 rows x 22 columns]
  • 어느정도 정리가 된 것으로 보인다.

AirFlow ch01. 개요

인프런 강의

공지

  • Airflow 2.0 원서 나온 것을 공부용으로 활용합니다.

Airflow Project

Airflow%20Project%20ad0ddb927b43444a9837279ad7ea27fe/book_cover.png

  • 이 책에 나온 내용을 Chapter별로 요약하여 정리하려고 한다.
  • 원서 구매 페이지는 아래와 같다.
  • 구매 페이지: Data Pipelines with Apache Airflow

Chapter 1. Apache Airflow Introduction

Airflow%20Project%20ad0ddb927b43444a9837279ad7ea27fe/figure_1-1.png

AirFlow 설치 및 실행 with M1

인프런 강의

미니 프로젝트 개요

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

Part I. Docker and Airflow

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

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

PostgreSQL 기초 1

개요

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

psql Shell 명령어

명령어설명
\qpsql을 종료한다.
\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
  • 사용할 이미지는 아래와 같다.