티스토리 뷰

Pandas의 DataFrame

  • Python Dictionary를 가지고 만든다.
  • dictionary로 DataFrame을 생성할 때 데이터의 개수가 맞지 않으면 Error 발생
  • dictionary로 key가 DataFrame의 column으로 들어가게 된다.
  • DataFrame은 Series의 집합으로 구성된다. (각각의 colum이 Series)

Python Dictionary로 DataFrame 만들기

import numpy as np
import pandas as pd

# dictionary
data = {'name' : ['아이유', '김연아', '홍길동', '강감찬', '이순신'],
        'year' : [2015, 2019, 2020, 2013, 2017],
        'points': [3.5, 1.5, 2.0, 3.4, 4.0]
       }

# DataFrame 생성
df = pd.DataFrame(data)

# 출력
# DataFrame 출력 시 display()를 이용 가능
display(df)

# 기억해야 하는 속성
print(df.shape)  # (5, 3) - tuple로 표현됨
print(df.size)   # 15
print(df.ndim)   # 2 - DafaFrame은 2차원이다

DataFrame의 index, values, colums

print(df.index)     # RangeIndex(start=0, stop=5, step=1)
print(df.columns)   # Index(['name', 'year', 'points'], dtype='object')
print(df.values)    # 2차원 ndarray

df.index.name = '학번'
df.columns.name = '학생정보'
display(df)

DafaFrame을 생성하는 다양한 방법

1. CSV 파일을 이용해서 DataFrame 생성

  • student.csv
  • c:/notebook_dir/data/student.csv 생성하기 (txt 파일로 만든다.)
  • notepad로 열어서 값 넣어주기
import pandas as pd

df = pd.read_csv('./data/student.csv')
display(df)

notepad로 student.csv 수정

head(),tail()

수행평가 문제 중 2번 문제는 movies.csv 파일을 읽어들여서 처리하는 것이다.

  • 영화번호, 영화제목, 장르
  • 이 movies.csv 파일을 읽어 DataFrame으로 만들어 보자
import pandas as pd

df = pd.read_csv('./data/movies.csv')

# 처음부터 5개의 행만 출력하기
display(df.head())

# 끝에서부터 역방향으로 5개의 행 출력
display(df.tail())

# pandas는 문자열 처리 시 numpy보다 훨씬 효율적인 방법을 제공한다.

2. Database를 이용해서 DataFrame 만들기

  • 데이터베이스는, 일반적으로 정제된, 연관성 있는 자료의 집합
  • CS에서는 이러한 데이터 베이스를 파일에 저장한다.
  • 이러한 데이터베이스를 다루기 위한 프로그램이 필요하며,DBMS(DataBase Management System)라고 부른다.
  • Oracle, Cybase, DB2, Infomix, MySQL, SQLite, etc.

MySQL 설치

  • MySQL로 데이터베이스를 구축해서 그 안에 있는 데이터를 추출해서 DataFrame으로 생성한다.
  • https://dev.mysql.com/downloads/mysql/
    • 5.6.49 version
  • 추후에 프로젝트에서 Database에 쌓여있는 데이터를 가져다가 분석, 학습 작업을 해야하는데 이때 데이터 정제하고 전처리 하는데 pandas가 이용될 것이다.

MySQL로 DB 구축하기

  • 1) MySQL 5.6 버전을 다운로드 한 후 바탕화면에 압축을 푼다.

  • 2) mysqld를 실행 : cmd에서 mysql/bin 폴더 이동 후, mysqld 입력

  • 3) MySQL Server를 실행시켰기 때문에 MySQL console에 들어갈 수 있다.( MySQL 시스템에 접속할 수 있다.)

  • 4) MySQL Server 중지 : 새로운 command창 띄워서 bin 폴더 이동 후

    • mysqladmin -6 shutdown
  • 5) MySQL Server를 다시 기동시킨 후

  • 6) MySQL 시스템에 접속한다 => command 창 열어서 다음의 명령어 입력

    • mysql -u root : root 권한으로 생성
  • 7) 새로운 사용자 생성

    • create user data identified by "data";
  • 8) 새로운 사용자 하나 더 생성

    • create user data@localhost identified by "data";
  • 9) 데이터베이스 생성

    • create database library;
  • 10) 생성한 라이브러리에 대한 사용권을 새롭게 생성한 data 사용자에게 부여

    • grant all privileges on library.* to data;
      생성한 사용자가 data@localhost에도 있기 때문에
    • grant all privileges on library.* to data@localhost;
  • 11) 지금까지 작업한 권한 부여 작업을 flush

    • flush privileges;
  • 12) 작업이 완료되었으니 console을 종료

    • exit;
  • 13) 제공된 파일을 이용해서 실제 사용할 데이터 베이스를 구축해 보자

  • 14) 파일을 복사한 후 mysql/bin 폴더에 복사한 후 명령어를 도스창에서 실행

    • mysql -u data -p library < _BookTableDump.sql
  • 데이터베이스 구축이 끝났으니, pandas로 데이터베이스에 접속해서 데이터를 가져다가 DataFrame으로 만들어 보자

  • 이때 python으로 MySQL database를 사용하는 기능을 사용한다. => package(module) 필요

    • 이 module을 설치 => pip install pymysql

cmd에서 mysql 실행

import pymysql.cursors
import pandas as pd

# pymysql이라는 module을 이용해서 데이터베이스에 연결

conn = pymysql.connect(host='localhost', 
                       user='data',
                       password='data',
                       db='library',
                       charset='utf8')

# 데이터베이스에 접속되면 SQL문을 실행시켜서 
# Database로부터 데이터를 가져온 후 DataFRame으로 생성
# sql = 'SELECT btitle, bauthor, bprice FROM book'

# 책 제목에 특정 키워드가 들어가 있는 책들만 골라오기
sql = 'SELECT btitle, bauthor, bprice FROM book WHERE btitle like "%java%"'

df = pd.read_sql(sql, con=conn)
display(df)

  • Database나 CSV 파일로부터 데이터를 읽어들여 DataFrame으로 만들었다.
  • 이러한 DataFrame을 JSON 파일로 저장할 수 있다.

JSON 파일로 저장할 때 4가지 방식이 있다.

  • DataFrame을 json 파일로 저장할 때 총 4가지 서로 다른 형식이 존재한다.

    • columns, records, index, values => orient값으로 설정
  • unicode로 파일을 생성한 후 데이터를 저장해야 한글이 정상 처리가 된다.

  • 파일을 저장할 폴더는 미리 생성되어 있어야 한다.

  • with:

    • 일반적으로 파일 처리할 때 순서는, 파일열기 - 내용쓰기 - 파일닫기 순서다.
    • with구문을 이용하면 resource의 close 처리 (해제 처리)가 자동으로 이루어진다.
  • https://jsonformatter.curiousconcept.com/#

Database table에서 데이터 가져온 후 ->DataFrame으로 만들어 JSON 파일로 저장하기

import pymysql.cursors
import pandas as pd

# pymysql이라는 module을 이용해서 데이터베이스에 연결

conn = pymysql.connect(host='localhost', 
                       user='data',
                       password='data',
                       db='library',
                       charset='utf8')

# 데이터베이스에 접속되면 SQL문을 실행시켜서 
# Database로부터 데이터를 가져온 후 DataFRame으로 생성
# sql = 'SELECT btitle, bauthor, bprice FROM book'

# 책 제목에 특정 키워드가 들어가 있는 책들만 골라오기
sql = 'SELECT btitle, bauthor, bprice FROM book WHERE btitle like "%여행%"'

df = pd.read_sql(sql, con=conn)
display(df)

with open('./data/json/books_columns.json', 'w', encoding='utf-8') as file:
    df.to_json(file, force_ascii=False, orient='columns')
    # orient='columns'로 설정하면 df의 column이 json의 key값으로 들어간다.
    
with open('./data/json/books_records.json', 'w', encoding='utf-8') as file:
    df.to_json(file, force_ascii=False, orient='records')

    
with open('./data/json/books_index.json', 'w', encoding='utf-8') as file:
    df.to_json(file, force_ascii=False, orient='index')
    

with open('./data/json/books_values.json', 'w', encoding='utf-8') as file:
    df.to_json(file, force_ascii=False, orient='values')

 

2-1. JSON 으로 DataFrame 만들기

print(dict_books)
print(type(dict_books))

# DataFrame 생성
df = pd.DataFrame(dict_books)

# 출력
# DataFrame 출력 시 display()를 이용 가능
display(df)

 

 

 

3. Open API를 이용해서 DataFrame 만들기

  • 일일박스오피스 순위를 알려주는 영화진흥위원회 open api를 이용해서 json을 받아온 후
  • 이 json을 DataFrame으로 만들어준다.
  • network 연결을 통해 open api를 호출한다.
import numpy as np
import pandas as pd
import json
import urllib

# 호출할 open api url이 필요하다. => 영화진흥위원회 open api
openapi_url = 'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=2d173acf28ecfcec9ee5d02a26927057'

# 일일오피스를 보고 싶은 날짜 
date = 20200907

# request를 보내고 온 response
load_page = urllib.request.urlopen(openapi_url + "&targetDt=" + str(date))

# dictionary를 추출
json_page = json.loads(load_page.read())
print(json_page["boxOfficeResult"]["dailyBoxOfficeList"])

# DataFrame 생성
df = pd.DataFrame(json_page["boxOfficeResult"]["dailyBoxOfficeList"])

# 출력
# DataFrame 출력 시 display()를 이용 가능
display(df)

# 특정 열 선택
data = json_page["boxOfficeResult"]["dailyBoxOfficeList"]
df = pd.DataFrame(data)
selected_df = pd.DataFrame(df[['rank','movieNm','audiAcc']])

selected_df.columns.name = str(date) + "오피스박스 순위"
selected_df = selected_df.rename({'rank':'순위', 'movieNm':'영화명', 'audoAcc':'누적관객'},axis='columns')

display(selected_df)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함