본문 바로가기

Programming

[Python][Library] 2 Pandas - 2. 파일 입출력

반응형
#!/usr/bin/env python
# coding: utf-8

# # Pandas II: 데이터 로딩, 저장, 파일 형식

# ### 입∙출력 방법
#
# - 텍스트 파일 이용하는 방법
# - 웹 API 이용해서 네트워크를 통해 불러오는 방법
# - 데이터베이스 이용하는 방법

# ---

# # 1. 텍스트 파일

# #### pandas 파일 파싱 함수
#
# 함수 | 설명
# :---|:---
# read_csv | 파일, URL 또는 파일과 유사한 객체로부터 구분된 데이터를 읽어온다. 데이터 구분자는 쉼표(,)를 기본으로 한다.
# read_table | 파일, URL 또는 파일과 유사한 객체로부터 구분된 데이터를 읽어온다. 데이터 구분자는 탭('\t')을 기본으로 한다.
# read_fwf | 고정폭 칼럼 형식에서 데이터를 읽어온다(구분자가 없는 데이터)
# read_clipboard | 클립보드에 있는 데이터를 읽어오는 read_table 함수. 웹페이지에서 표를 긁어올 때 유용하다.

# #### pandas 파일 파싱 함수 옵션
#
# - **색인**: 반환하는 DataFrame에서 하나 이상의 칼럼을 색인으로 지정할 수 있다. 파일이나 사용자로부터 칼럼의 이름을 받거나 아무것도 받지 않을 수 있다.
# - **자료형 추론과 데이터 변환**: 사용자 정의 값 변환과 비어있는 값을 위한 사용자 리스트를 포함한다.
# - **날짜 분석**: 여러 칼럼에 걸쳐 있는 날짜와 시간 정보를 하나의 칼럼에 조합해서 결과에 반영한다.
# - **반복**: 여러 파일에 걸쳐 있는 자료를 반복적으로 읽어올 수 있다.
# - **정제되지 않는 데이터 처리**: 로우나 꼬리말, 주석 건너뛰기 또는 천 단위마다 쉼표로 구분된 숫자 같은 사소한 일을 처리해준다.

# ### 1.1 텍스트 파일 읽기

# In[ ]:


from pandas import DataFrame, Series
import pandas as pd
import numpy as np


# In[ ]:


#!cat data/ex1.csv
get_ipython().system('type data\\ex1.csv')


# In[ ]:


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


# In[ ]:


# 컬럼명 자동생성
pd.read_csv('data/ex1.csv', header=None)


# In[ ]:


# 컬럼명 설정
pd.read_csv('data/ex1.csv', names=['a1', 'b1', 'c1', 'd1', 'message1'])


# In[ ]:


pd.read_table('data/ex1.csv', sep=',')


# In[ ]:


# 컬럼 message를 index 컬럼으로 사용
pd.read_csv('data/ex1.csv', index_col='message')


# In[ ]:


parsed = pd.read_csv('data/csv_mindex.csv')
parsed


# #### 계층적 색인을 지정

# In[ ]:


parsed = pd.read_csv('data/csv_mindex.csv', index_col=['key1', 'key2'])
parsed


# #### 구분자로 정규표현식 사용가능
#
# - [파이썬 - 정규표현식 모듈](http://devanix.tistory.com/296)

# In[ ]:


#!cat data/ex3.txt
get_ipython().system('type data\\ex3.txt')


# In[ ]:


list(open('data/ex3.txt')) #리스트형식으로 txt파일 읽기: newline 처리 필요


# In[ ]:


result = pd.read_table('data/ex3.txt', sep='\s+')
result


# [Pandas Documents Page: Text, CSV, HDF5, ⋯](http://pandas.pydata.org/pandas-docs/stable/io.html)

# In[ ]:


#!cat data/ex4.csv
get_ipython().system('type data\\ex4.csv')


# In[ ]:


pd.read_csv('data/ex4.csv')


# In[ ]:


pd.read_csv('data/ex4.csv', skiprows=[0,2,3])


# In[ ]:


#!cat data/ex5.csv
get_ipython().system('type data\\ex5.csv')


# In[ ]:


result = pd.read_csv('data/ex5.csv')
result


# In[ ]:


#pd.isnull(result)
result.isnull()


# #### 결측치 문자열 정의

# In[ ]:


result = pd.read_csv('data/ex5.csv', na_values=["world",12, "one"])
result


# In[ ]:


# 해당 열마다 다른 NaN 리스트를 지정
sentinels = {'message': ['foo', 'NA'], 'something': ['two']}


# In[ ]:


pd.read_csv('data/ex5.csv', na_values=sentinels)


# #### read_csv / read_table 함수 인자
#
# 인자 | 설명
# :---|:---
# path | 파일 시스템에서의 위치, URL, 파일 객체를 나타내는 문자열
# sep or delimiter | 필드를 구분하기 위해 사용할 연속된 문자나 정규표현식
# header | 칼럼의 이름으로 사용할 로우의 번호, 기본 값은 0(첫 로우)이며 헤더가 없으면 None으로 지정할 수 있다.
# index_col | 색인으로 사용할 칼럼 번호나 이름, 계층적 색인을 지정할 경우 리스트를 넘길 수 있다.
# names | 컬럼 이름으로 사용할 리스트. header = None과 함께 사용한다.
# skiprows | 파일의 시작부터 무시할 로우의 개수 또는 무시할 로우 번호가 담긴 리스트
# na_values | NA 값으로 처리할 값들의 나열
# comment | 주석으로 분류되어 파싱하지 않을 문자 혹은 문자열
# parse_dates | 날짜를 datetime으로 변환할지의 여부. 기본값은 False이며, True일 경우 모든 칼럼에 다 적용된다. 리스트를 넘기면 변환할 칼럼을 지정할 수 있는데, [1, 2, 3]을 넘기면 각각의 칼럼을 datetime으로 변환하고, [[1, 3]]을 넘기면 1, 3번 칼럼을 조합해서 하나의 datetime으로 변환한다.
# keep_date_col | 여러 칼럼을 datetime으로 변환했을 경우 원래 칼럼을 남겨둘지의 여부. 기본값은 False
# converters | 변환 시 칼럼에 적용할 함수를 지정한다. 예를 들어 {'foo': f}는 'foo'칼럼에 f 함수를 적용한다. 전달하는 사전의 키 값은 칼럼 이름이나 번호가 될 수 있다.
# dayfirst | 모호한 날짜 형식일 경우 국제 형식으로 간주한다(7/6/2012는 2012년 6월 7일로 간주한다). 기본값은 False
# date_parser | 날짜 변환 시 사용할 함수
# nrows | 파일의 첫 일부만 읽어올 때 처음 몇 줄을 읽을 것인지 지정한다.
# iterator | 파일을 조금씩 읽을 때 사용하도록 TextParser 객체를 반환하도록 한다. 기본값은 False
# chunksize | TextParser 객체에서 사용할, 한 번에 읽을 파일의 크기
# skip_footer | 무시할 파일의 마지막 줄 수
# verbose | 파싱 결과에 대한 정보를 출력한다. 숫자가 아닌 값들이 들어있는 칼럼이면서 누락된 값이 있다면 줄 번호를 출력한다. 기본값은 False
# encoding | 유니코드 인코딩 종류를 지정한다. UTF-8로 인코딩된 텍스트일 경우 'utf-8'로 지정한다.
# squeeze | 로우가 하나뿐이라면 Series 객체를 반환한다. 기본값은 False
# thousands | 숫자를 천 단위로 끊을 때 사용할 ', '나 '.' 같은 구분자

# ### 1.2 텍스트 파일 일부분만 읽기

# In[ ]:


result = pd.read_csv('data/ex6.csv')


# In[ ]:


print(result.shape)
result.head()


# #### nrows: 처음 몇 줄만 읽기

# In[ ]:


res = pd.read_csv('data/ex6.csv', nrows=5)


# In[ ]:


print(res.shape)
res


# #### chunksize: 일정량의 데이터를 순회하면서 조회 가능

# In[ ]:


chunker = pd.read_csv('data/ex6.csv', chunksize=10)


# In[ ]:


for i, x in enumerate(chunker):
    if i > 0: break
    print(x)
    print(type(x))


# In[ ]:


chunker.close()


# ### 1.3 텍스트 파일에 쓰기

# In[ ]:


data = pd.read_csv('data/ex5.csv')
data


# In[ ]:


data.to_csv('data/out.csv')


# In[ ]:


import sys


# In[ ]:


data.to_csv(sys.stdout, sep='|')


# #### na_rep: NaN(결측치)을 원하는 값(문자열)으로 출력

# In[ ]:


data.to_csv(sys.stdout, na_rep='NULL')


# #### index, header

# In[ ]:


data.to_csv(sys.stdout, index=False, header=False)


# In[ ]:


data.to_csv('data/out1.csv', index=False, header=False)


# In[ ]:


#!cat data/temparary
get_ipython().system('type data\\out1.csv')


# #### 컬럼 일부분만 출력, 컬럼 순서 지정

# In[ ]:


data.to_csv(sys.stdout, index=False, columns=['a', 'b', 'c'])


# ### 1.4 텍스트 파일 수동 처리(읽기, 쓰기)

# #### CSV 파일 읽기

# In[ ]:


#!cat data/ex7.csv
get_ipython().system('type data\\ex7.csv')


# In[ ]:


import csv


# In[ ]:


f = open('data/ex7.csv')
reader = csv.reader(f)

for line in reader:
    print(line)

f.close()


# In[ ]:


lines = list(csv.reader(open('data/ex7.csv')))

header, values = lines[0], lines[1:]

header


# In[ ]:


values


# In[ ]:


data_dict = {h: v for h, v in zip(header, zip(*values))}
data_dict


# In[ ]:


pd.DataFrame(data_dict)


# #### 사용자정의: 다양한 규칙을 클래스로 구현 (csv.Dialect 상속)
#
# - 다양한 구분자
# - 문자열을 둘러싸는 방법
# - 개행문자

# In[ ]:


class my_dialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ','
    quotechar = '"'
    quoting = csv.QUOTE_MINIMAL


# In[ ]:


f = open('data/ex7.csv')
reader = csv.reader(f, dialect=my_dialect)


# In[ ]:


for line in reader:
    print(line)


# In[ ]:


f.close()


# In[ ]:


f = open('data/ex7.csv')
reader = csv.reader(f, delimiter=',')


# In[ ]:


for line in reader:
    print(line)


# In[ ]:


f.close()


# #### CSV 파일 쓰기

# In[ ]:


with open('data/out3.csv', 'w') as f:
    writer = csv.writer(f, dialect=my_dialect, quoting=csv.QUOTE_NONE)
    writer.writerow(('one', 'two', 'three'))
    writer.writerow(('1', '2', '3'))
    writer.writerow(('4', '5', '6'))
    writer.writerow(('7', '8', '9'))


# In[ ]:


#!cat data/mydata.csv
get_ipython().system('type data\\out3.csv')


# ### 1.5 엑셀 파일

# In[ ]:


df = pd.read_excel('data/score.xlsx', sheet_name='result',encoding='cp949')


# In[ ]:


df


# In[ ]:


#import openpyxl


# In[ ]:


df.to_excel('data/out_score.xlsx', sheet_name='result')


# ### 1.6 JSON 파일

# - JSON(JavaScript Object Notation)은 웹브라우저와 다른 애플리케이션이 HTTP 요청으로 데이터를 보낼 때 널리 사용하는 표준 파일 형식

# #### Library: Pandas
# - read_json()
# - to_json()

# #### url 사용

# In[ ]:


# Create URL to JSON file (alternatively this can be a filepath)

# Load the first sheet of the JSON file into a data frame
df = pd.read_json(url, orient='columns')

# View the first ten rows
df.head()


# #### file 사용

# In[ ]:


df = pd.DataFrame([['a', 'b'], ['c', 'd']],
                   index=['row 1', 'row 2'],
                   columns=['col 1', 'col 2'])
df


# In[ ]:


fname = 'data/out_test.json'


# In[ ]:


df.to_json(fname, orient='split')


# In[ ]:


#!cat data/out_test.json
get_ipython().system('type data\\out_test.json')


# In[ ]:


pd.read_json(fname, orient='split')


# #### buffer 사용

# In[ ]:


temp = df.to_json(orient='split')
print(temp)

pd.read_json(temp, orient='split')


# In[ ]:


temp = df.to_json(orient='index')
print(temp)

pd.read_json(temp, orient='index')


# In[ ]:


temp = df.to_json(orient='columns')
print(temp)

pd.read_json(temp, orient='columns')


# In[ ]:


temp = df.to_json(orient='records')
print(temp)

pd.read_json(temp, orient='records')


# In[ ]:


temp = df.to_json(orient='table')
print(temp)

pd.read_json(temp, orient='table')


# #### Library: json
# - json.loads()
# - json.dumps()

# In[ ]:


import json


# #### json.load()

# In[ ]:


obj = '''
{
    "name": "Wes",
    "places_lived": ["United States", "Spain", "Germany"],
    "pet": null, "siblings": [{"name": "Scott", "age":25, "pet":"Zuko"},
                                {"name": "Katie", "age":33, "pet": "Cisco"}]
}
'''


# In[ ]:


result = json.loads(obj)
print(type(result))
result


# In[ ]:


get_ipython().run_cell_magic('writefile', 'data/out_test2.json', '{\n    "name": "Wes",\n    "places_lived": ["United States", "Spain", "Germany"],\n    "pet": null, "siblings": [{"name": "Scott", "age":25, "pet":"Zuko"},\n                                {"name": "Katie", "age":33, "pet": "Cisco"}]\n}')


# In[ ]:


json_data =  open('data/out_test2.json').read()
result = json.loads(json_data)
print(type(result))
result


# #### json.dumps()

# In[ ]:


asjson = json.dumps(result)


# In[ ]:


print(type(asjson))
asjson


# In[ ]:


open('data/out_test3.json', 'w').write(asjson)


# In[ ]:


#!cat data/out_test3.json
get_ipython().system('type data\\out_test3.json')


# #### JSON 객체 사용예

# In[ ]:


siblings = DataFrame(result['siblings'], columns=['name', 'age'])  


# In[ ]:


siblings


# ---

# # 2. 바이너리 파일

# ### 2.1 pickle

# #### 데이터를 효율적으로 저장하는 가장 손쉬운 방법
#
# - 파이썬에 기본으로 내장되어 있는 pickle 직렬화를 통해 데이터를 이진 형식으로 저장하는 것이다.
# - 편리하게도 pandas의 객체는 모두 pickle을 이용해서 데이터를 저장하는 save 메서드가 있다

# In[ ]:


frame = pd.read_csv('data/ex1.csv')


# In[ ]:


frame


# In[ ]:


frame.to_pickle('data/frame_pickle.dat')


# In[ ]:


pd.read_pickle('data/frame_pickle.dat')


# ### 2.2 HDF5 ( Hierarchical Data Format )

# - 계층적 데이터 형식
# - **HDF5는 데이터베이스가 아니다.** HDF5는 **한 번만 기록**하고 **여러 번 자주 읽어야** 하는 데이터에 최적화되어 있다.
# - 데이터는 아무때나 파일에 추가할 수 있지만 만약 여러 곳에서 동시에 파일을 쓴다면 파일이 깨지는 문제가 발생할 수 있다.

# ---

# # 3. HTML, 웹 API와 함께 사용하기

# - HTML
# - API - json, xml
# - Java Script - Library(selenium) 사용

# In[ ]:


import requests


# In[ ]:




# In[ ]:


res = requests.get(url)


# In[ ]:


data = res.json()
print(type(data))
data[:3]


# In[ ]:


iss = pd.DataFrame(data)
iss.head()


# ---

# # 4. 데이터베이스(DBMS)

# [sqlite3 사용 및 설치](https://wikidocs.net/12453)

# In[ ]:


import sqlite3


# #### DB: Memory 사용

# #### 1) Connect to DBMS

# In[ ]:


con = sqlite3.connect(':memory:')


# #### 2) Create Table

# In[ ]:


query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
c REAL, d INTEGER
);"""

con.execute(query)
con.commit()


# #### 3) Insert Data

# In[ ]:


data = [('Atlanta', 'Georgia', 1.25, 6),
        ('Tallahassee', 'Florida', 2.6, 3),
        ('Sacramento', 'California', 1.7, 5)]

stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"

con.executemany(stmt, data)
con.commit()


# #### 4) Select Data

# In[ ]:


cursor = con.execute('select * from test')


# In[ ]:


rows = cursor.fetchall()


# In[ ]:


rows


# In[ ]:


cursor.description


# In[ ]:


pd.DataFrame(rows, columns=list(zip(*cursor.description))[0])


# #### 5) select Data ( Pandas 사용 )

# In[ ]:


import pandas.io.sql as sql


# In[ ]:


sql.read_sql('select * from test', con)


# #### 6) Disconnect from DBMS

# In[ ]:


con.close()


# ####  DB: File 사용

# #### 1) Connect to DBMS

# In[ ]:


# 파일이 없으면 생성
con1 = sqlite3.connect('data/sqlite_01.db')


# #### 2) Create Table

# In[ ]:


query1 = """
CREATE TABLE score
('번호' VARCHAR(5), '이름' VARCHAR(64),
'kor' INTEGER, 'eng' INTEGER, 'math' INTEGER
);
"""

con1.execute(query1)
con1.commit()


# #### 3) Insert Data

# In[ ]:


data1 = [
('1','김지훈',90,80,85),
('2','김동현',90,85,90),
('3','박현우',80,80,80),
('4','박성민',85,90,75),
('5','서주원',95,95,100),
('6','윤석원',75,85,80),
('7','이서연',70,65,40),
('8','정민서',65,80,85),
('9','최수진',95,90,95),
('10','황미영',75,85,100)
]

stmt1 = "INSERT INTO score VALUES(?, ?, ?, ?,?)"

con1.executemany(stmt1, data1)
con1.commit()


# #### 4) Select Data

# In[ ]:


sql.read_sql('select * from score', con1)


# #### 5) Disconnect from DBMS

# In[ ]:


con1.close()


# ---

# In[ ]:


# end of file


# In[ ]:





반응형
LIST