6T_Pandas 에서 데이터베이스 접속하기

  • 마지막으로 DB와 SQL 개론에 대해서. 맛보기로. heidiSQL 다운 받아서 설치했음
  • Database? 자료(data)가 모여있는 곳(Database)
    • 엑셀과 같은 형태로 생긴 관계형 데이터베이스
    • 즉, 데이터 간의, 테이블 간의 관계가 있는 데이터베이스
    • Relational Database(RDB) 라고 부른다.
    • 남은 80%는 관계형 데이터베이스(Pandas + rdb를 많이 다룰 것이다). 남은 20%는 비-관계형 데이터베이스(NoSQL)
  • 용어를 정리하자면
    • Database == 엑셀 파일 하나랑 유사한 구조다.(xlsx, xls) <=> NoSQL에서는 똑같이 Database로 쓸 것이다.
    • Table == 엑셀로 치면 시트. 데이터베이스가 여러 Table로 구성되어있다. <=> NoSQL에서는 Collection로 쓸 것이다.
    • Row
    • Column
    • Cell <==> NoSQL에서는 Document라고 한다. (Mongo DB => Document DB라는 표현을 쓴다.)
  • 데이터베이스 서버(접속을 위한 프로그램) => Oracle, MySQL, MSSQL, Postgresql, ...
  • (접속하기 위한) 데이터베이스 클라이언트 (프로그램들) => 맥의 경우에는 Sequel Pro. 윈도우의 경우에는 Heidi sql. Pandas로도 접속 가능
  • SQL => Structured Query Language
    • 구조화된 질의 언어
  • 문법 형태는?
    • world라는 데이터베이스에 접속했다고 생각하고
    • SELECT * from Country; => country라는 db에서 모든 정보들을 뽑아온다.
    • SELECT Name from Country WHERE Population > 100000000; => WHERE는 조건문

In [1]:
import pymysql

In [3]:
import MySQLdb   # $ pip install mysqlclient


---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-04441746bd48> in <module>()
----> 1 import MySQLdb   # $ pip install mysqlclient

ImportError: No module named 'MySQLdb'

In [2]:
db = pymysql.connect(
    "db.fastcamp.us",  # DATABASE_HOST
    "root",  # DATABASE_USERNAME
    "dkstncks",  # DATABASE_PASSWORD
    "world",  # DATABASE_NAME
)

In [5]:
df = pd.read_sql("SELECT * FROM Country;", db)
df.head()


Out[5]:
Code Name Continent Region SurfaceArea IndepYear Population LifeExpectancy GNP GNPOld LocalName GovernmentForm HeadOfState Capital Code2
0 ABW Aruba North America Caribbean 193.0 NaN 103000 78.4 828.0 793.0 Aruba Nonmetropolitan Territory of The Netherlands Beatrix 129.0 AW
1 AFG Afghanistan Asia Southern and Central Asia 652090.0 1919.0 22720000 45.9 5976.0 NaN Afganistan/Afqanestan Islamic Emirate Mohammad Omar 1.0 AF
2 AGO Angola Africa Central Africa 1246700.0 1975.0 12878000 38.3 6648.0 7984.0 Angola Republic José Eduardo dos Santos 56.0 AO
3 AIA Anguilla North America Caribbean 96.0 NaN 8000 76.1 63.2 NaN Anguilla Dependent Territory of the UK Elisabeth II 62.0 AI
4 ALB Albania Europe Southern Europe 28748.0 1912.0 3401200 71.6 3205.0 2500.0 Shqipëria Republic Rexhep Mejdani 34.0 AL

In [6]:
db = pymysql.connect(
    "db.fastcamp.us",  # DATABASE_HOST
    "root",  # DATABASE_USERNAME
    "dkstncks",  # DATABASE_PASSWORD
    "sakila",  # DATABASE_NAME
)

In [8]:
df = pd.read_sql("SELECT * FROM customer;", db)

In [9]:
df.head()


Out[9]:
customer_id store_id first_name last_name email address_id active create_date last_update
0 1 1 MARY SMITH MARY.SMITH@sakilacustomer.org 5 1 2006-02-14 22:04:36 2006-02-15 04:57:20
1 2 1 PATRICIA JOHNSON PATRICIA.JOHNSON@sakilacustomer.org 6 1 2006-02-14 22:04:36 2006-02-15 04:57:20
2 3 1 LINDA WILLIAMS LINDA.WILLIAMS@sakilacustomer.org 7 1 2006-02-14 22:04:36 2006-02-15 04:57:20
3 4 2 BARBARA JONES BARBARA.JONES@sakilacustomer.org 8 1 2006-02-14 22:04:36 2006-02-15 04:57:20
4 5 1 ELIZABETH BROWN ELIZABETH.BROWN@sakilacustomer.org 9 1 2006-02-14 22:04:36 2006-02-15 04:57:20

In [11]:
df = pd.read_sql("SHOW TABLES;", db)

In [15]:
df.head()


Out[15]:
Tables_in_sakila
0 actor
1 actor_info
2 address
3 category
4 city

In [12]:
#밖에다가 data라는 폴더 만들기
def save_to_csv(table_name):
    table_df = pd.read_sql("SELECT * FROM {table_name};".format(table_name=table_name), db)
    table_df.to_csv("./data/{table_name}.csv".format(table_name=table_name))

In [14]:
df["Tables_in_sakila"].apply(save_to_csv)


Out[14]:
0     None
1     None
2     None
3     None
4     None
5     None
6     None
7     None
8     None
9     None
10    None
11    None
12    None
13    None
14    None
15    None
16    None
17    None
18    None
19    None
20    None
21    None
22    None
Name: Tables_in_sakila, dtype: object
  • read로만 쓰지 sql로 잘 보내지 않는다.
  • 양식이 깨지거나 오류가 생길 가능성이 있기 때문에

오늘 한 내용들 정리

  • Pandas 고급 기능을 다루었다.
    • pd.concat, df.append... reset_index 등 여러 옵션들
    • 두 개의 다른 df임을 합치는 df.merge(left.merge(right, left_on="", right_on=""))
    • groups = df.groupby("..."), groups.get_group("서울“)
    • 번외로 파일 입출력에 대해서 했다. to*, from* / csv), index=False, headers=False, sep=","
    • 데이터베이스 맛보기. pandas db를 접속하는 방법

과제

  • 과제는 merge와 groupby를 이용해서 의미 있어 보이는 지표 2가지를 뽑아와라
  • 예를 들면 월별 매출, 주간별 매출
  • 혹은 VIP 회원(매출이 많은 회원
  • 영화의 특정 키워드가 포함된 애들 => 매출 분석
  • 영화와 배우에 대한 정보가 있으니까 흥행을 많이 하게 만든 배우를 뽑아봐라(흥행의 기준은 매출을 많이)