도커 컨테이너는 기본적으로 격리된 개발환경으로 데이터 사이언스에서 작업할 데이터는 별도 저장공간에 저장하고 이를 -v
로 컨테이너 디렉토리와 호스트 컴퓨터 디렉토리를 공유하여 작업하는 모양을 취한다. 이를 위해서 작업할 데이터를 로컬 컴퓨터에 저장시켜 놓고 이를 동기화된 컨테이너에서 가져다 작업하고 결과를 다시 로컬 디렉토리에 떨어뜨려 저장시키는 방식으로 작업한다.
붓꽃 데이터가 엑셀로 저장되어 있다고 가정하면 Iris.xlsx
파일명이고 이를 CSV 파일로 변형시켜야 CLI를 사용해서 데이터 분석 작업이 가능하다. 이를 위해서 in2csv
프로그램을 사용해서 파이프 연산자 >
을 사용해서 iris.csv
파일로 데이터 변환 결과를 내보낸다.
관계형 데이터베이스는 종류가 많지만 원리는 비슷하다. 학습용으로 가장 많이 사용되는 sqlite3
를 대상으로 CLI 작업을 수행하는 방법을 살펴본다.
sqlite3
설치Data Science at the Command Line는 “Alpine Linux”로 보안이 뛰어나고 가벼운 것으로 알려져 있다. 보통 추가 도구를 설치할 때 우분투의 경우 apt-get
을 사용하는 것과 마찬가지로 sudo apk add
을 사용해서 추가하면 된다. which sqlite3
명령어를 통해서 설치가 된 것을 확인한다.
[/data]$ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.8.0
PRETTY_NAME="Alpine Linux v3.8"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
[/data]$ sudo apk add sqlite
(1/1) Installing sqlite (3.25.3-r0)
Executing busybox-1.28.4-r3.trigger
OK: 1501 MiB in 251 packages
[/data]$ which sqlite3
/usr/bin/sqlite3
survey.db
)다음 단계로 sqlite3
데이터가 필요한데 소프트웨어 카펜트리 Databases and SQL에서 survey.db을 다운로드 받아 사용하거나 혹은 survey.db
를 생성시키는 sql 스크립트를 다운로드 받아 이를 기반으로 survey.db
를 생성시킨다. 자세한 사항은 xwMOOC 데이터 과학, “R과 SQL - DBI, dplyr”을 참조한다.
[/data]$ wget https://raw.githubusercontent.com/swcarpentry/bc/master/novice/sql/gen-survey-database.sql
--2019-07-04 01:52:58-- https://raw.githubusercontent.com/swcarpentry/bc/master/novice/sql/gen-survey-database.sql
Resolving raw.githubusercontent.com... 151.101.108.133
Connecting to raw.githubusercontent.com|151.101.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3297 (3.2K) [text/plain]
Saving to: 'gen-survey-database.sql'
gen-survey-database.sql 100%[==========================================================>] 3.22K --.-KB/s in 0.001s
2019-07-04 01:52:59 (4.68 MB/s) - 'gen-survey-database.sql' saved [3297/3297]
[/data]$ ls
Iris.xlsx gen-survey-database.sql iris.csv survey.db
[/data]$ sqlite3 survey_cli.db < gen-survey-database.sql
[/data]$ sqlite3 survey_cli.db
SQLite version 3.25.3 2018-11-05 20:37:38
Enter ".help" for usage hints.
sqlite> .tables
Person Site Survey Visited
sqlite>
sql2csv
도구를 사용해서 sqlite3
survey_cli.db
데이터베이스에 쿼리(‘SELECT * FROM Person’)를 던져 CSV 파일로 뽑아낼 수 있다. 관계형 데이터베이스가 dialect+driver://username:password@host:port/database
형식으로 되어 있어 형식에 맞춰 계정명과 비번 필요한 경우 포트도 확인하여 명세하면 된다.
인터넷에서 데이터를 가져오는 경우 curl
명령어를 사용한다. -s
는 진행현황등을 생략하게 하는 역할을 하고 명시적으로 -o
를 주어 출력파일명도 지정한다. 즉, Mark Twain, “Adventures of Huckleberry Finn”, Project Gutenberg를 다운로드 받아 finn.txt
로 저장시켜 텍스트 자연어 분석에 바로 돌입한다.
[/data]$ curl -s http://www.gutenberg.org/files/76/76-0.txt -o finn.txt
[/data]$ ls -al
total 668
drwxr-xr-x 9 root root 288 Jul 4 02:12 .
drwxr-xr-x 1 root root 4096 Jul 4 00:50 ..
-rw-r--r-- 1 root root 12562 Jul 4 01:24 Iris.xlsx
-rw-r--r-- 1 root root 616320 Jul 4 02:12 finn.txt
-rw-r--r-- 1 root root 3297 Jul 4 01:52 gen-survey-database.sql
-rw-r--r-- 1 root root 4463 Jul 4 01:25 iris.csv
-rw-r--r-- 1 root root 6144 Jul 4 01:45 survey.db
-rw-r--r-- 1 root root 122 Jul 4 02:01 survey_cli.csv
-rw-r--r-- 1 root root 20480 Jul 4 01:55 survey_cli.db
Lorem Ipsum와 마찬가지로 임의로 가짜 사람데이터를 생성시키는 RANDOM USER GENERATOR API를 사용해서 데이터를 입수해본다. jq
를 사용해서 JSON 데이터를 보기좋게 정리한다. OAuth 프로토콜을 사용하는 경우 curlicue
도구를 사용한다.
[/data]$ curl -s https://randomuser.me/api/1.2/ | jq .
{
"results": [
{
"gender": "male",
"name": {
"title": "monsieur",
"first": "sérgio",
"last": "guerin"
},
"location": {
"street": "7969 place de la mairie",
"city": "ausserberg",
"state": "neuchâtel",
"postcode": 8020,
"coordinates": {
"latitude": "-51.5998",
"longitude": "-54.5721"
},
"timezone": {
"offset": "-3:00",
"description": "Brazil, Buenos Aires, Georgetown"
}
},
"email": "sérgio.guerin@example.com",
"login": {
"uuid": "e65c4075-3be5-4d86-996d-e6fecd8466f7",
"username": "happysnake912",
"password": "mordor",
"salt": "oS3v1IxJ",
"md5": "4f0f53a802ad744824eb80f80c8b947d",
"sha1": "8b112c9a4ab48e36985d7693808623907421b6a7",
"sha256": "7ba5ec9f48aef4fbf1272e60f8675495b893c2e75d48b8862146e27bf7a958e5"
},
"dob": {
"date": "1964-12-17T17:03:30Z",
"age": 54
},
"registered": {
"date": "2017-07-01T06:41:46Z",
"age": 2
},
"phone": "(853)-449-4123",
"cell": "(431)-144-1728",
"id": {
"name": "AVS",
"value": "756.7802.0778.33"
},
"picture": {
"large": "https://randomuser.me/api/portraits/men/93.jpg",
"medium": "https://randomuser.me/api/portraits/med/men/93.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/men/93.jpg"
},
"nat": "CH"
}
],
"info": {
"seed": "ec0033900aef863d",
"results": 1,
"page": 1,
"version": "1.2"
}
}