작성자: admin 작성일시: 2016-07-08 22:27:40 조회수: 908 다운로드: 49
카테고리: Python 태그목록:

Pandas 데이터 입출력

이 노트북의 예제를 실행하기 위해서는 datascienceschool/rpython 도커 이미지의 다음 디렉토리로 이동해야 한다.

In [2]:
%cd /home/dockeruser/data/pydata-book-master/
/home/dockeruser/data/pydata-book-master

pandas 데이터 입출력 종류

  • CSV
  • Clipboard
  • Excel
  • JSON
  • HTML
  • Python Pickling
  • HDF5
  • SAS
  • STATA
  • SQL
  • Google BigQuery

CSV 파일 입력

  • Comma Separated Values
  • MicroSoft EXCEL에서 export 가능
  • pandas.from_csv(): csv file -> DataFrame
In [3]:
!cat ch06/ex1.csv
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
In [4]:
df = pd.read_csv('ch06/ex1.csv')
df
Out[4]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 컬럼 이름이 없는 경우에는 names 인수로 설정 가능
In [5]:
!cat ch06/ex2.csv
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
In [6]:
pd.read_csv('ch06/ex2.csv', names=['a', 'b', 'c', 'd', 'message'])
Out[6]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 특정한 컬럼을 인덱스로 지정하고 싶으면 index_col 인수 사용
In [7]:
!cat ch06/csv_mindex.csv
key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16
In [8]:
pd.read_csv('ch06/csv_mindex.csv', index_col=['key1', 'key2'])
Out[8]:
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 7 8
two a 9 10
b 11 12
c 13 14
d 15 16
  • 구분자가 comma가 아닌 경우에는 sep 인수 사용
In [9]:
!cat 'ch06/ex3.txt'
            A         B         C
aaa -0.264438 -1.026059 -0.619500
bbb  0.927272  0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382  1.100491
In [10]:
pd.read_table('ch06/ex3.txt', sep='\s+')
Out[10]:
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
  • 건너 뛰어야 할 행이 있으면 skiprows 사용
In [11]:
!cat ch06/ex4.csv
# hey!
a,b,c,d,message
# just wanted to make things more difficult for you
# who reads CSV files with computers, anyway?
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
In [12]:
pd.read_csv('ch06/ex4.csv', skiprows=[0, 2, 3])
Out[12]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 특정한 값을 NA로 취급하고 싶으면 na_values 인수 사용
In [13]:
!cat ch06/ex5.csv
something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,,8,world
three,9,10,11,12,foo
In [15]:
sentinels = {'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('ch06/ex5.csv', na_values=sentinels)
Out[15]:
something a b c d message
0 one 1 2 3.0 4 NaN
1 NaN 5 6 NaN 8 world
2 three 9 10 11.0 12 NaN
  • 일부 행만 읽고 싶다면 nrows 인수 사용
In [20]:
!head ch06/ex6.csv
one,two,three,four,key
0.467976300189,-0.0386485396255,-0.295344251987,-1.82472622729,L
-0.358893469543,1.40445260007,0.704964644926,-0.200638304015,B
-0.50184039929,0.659253707223,-0.421690619312,-0.0576883018364,G
0.204886212202,1.07413396504,1.38836131252,-0.982404023494,R
0.354627914484,-0.133115852296,0.283762637978,-0.837062961653,Q
1.81748001608,0.742272722638,0.419394843928,-2.25103520513,Q
-0.776764319165,0.935517747061,-0.332871759623,-1.87564085416,U
-0.913134961617,1.53062351168,-0.572656719239,0.477252252981,K
0.358479538224,-0.49757199147,-0.367016188009,0.507701778685,S
In [18]:
pd.read_csv('ch06/ex6.csv', nrows=5)
Out[18]:
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q

CSV 파일 출력

  • DataFrame.to_csv(): DataFrame -> csv file
In [21]:
df.to_csv('ch06/out.csv')
In [22]:
!cat ch06/out.csv
,a,b,c,d,message
0,1,2,3,4,hello
1,5,6,7,8,world
2,9,10,11,12,foo
  • sep 인수로 구분자 변경 가능
In [23]:
import sys
df.to_csv(sys.stdout, sep='|')
|a|b|c|d|message
0|1|2|3|4|hello
1|5|6|7|8|world
2|9|10|11|12|foo
  • na_rep 인수로 NA 표시 변경 가능
In [24]:
df.to_csv(sys.stdout, na_rep='NULL')
,a,b,c,d,message
0,1,2,3,4,hello
1,5,6,7,8,world
2,9,10,11,12,foo
  • index, header 인수로 인덱스 및 헤더 출력 여부 결정 가능
In [25]:
df.to_csv(sys.stdout, index=False, header=False)
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

인터넷 상의 CSV 파일 입력

  • 파일 path 대신 URL을 지정하면 다운로드하여 import
In [26]:
titanic = pd.read_csv('http://dato.com/files/titanic.csv', index_col=0)
titanic.tail()
Out[26]:
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
PassengerId
887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.00 NaN S
888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.00 B42 S
889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.45 NaN S
890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

인터넷 상의 데이터 베이스 자료 입력

다음과 같은 인터넷 상의 자료는 pandas_datareader 패키지의 DataReader 을 써서 바로 pandas로 입력 가능

  • Yahoo! Finance
  • Google Finance
  • St.Louis FED (FRED)
  • Kenneth French’s data library
  • World Bank
  • Google Analytics
In [27]:
import pandas_datareader.data as web
In [34]:
import datetime
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2016, 6, 30)
In [35]:
df = web.DataReader("005930.KS", 'yahoo', start, end)
df.tail()
Out[35]:
Open High Low Close Volume Adj Close
Date
2016-06-24 1445000.0 1445000.0 1360000.0 1400000.0 411000 1400000.0
2016-06-27 1400000.0 1405000.0 1385000.0 1398000.0 236700 1398000.0
2016-06-28 1390000.0 1404000.0 1379000.0 1399000.0 214300 1399000.0
2016-06-29 1408000.0 1412000.0 1391000.0 1396000.0 210500 1396000.0
2016-06-30 1408000.0 1445000.0 1397000.0 1425000.0 273400 1425000.0
In [36]:
df = web.DataReader("KRX:005930", 'google', start, end)
df.tail()
Out[36]:
Open High Low Close Volume
Date
2016-06-24 1445000.0 1445000.0 1360000.0 1400000.0 408920
2016-06-27 1400000.0 1405000.0 1385000.0 1398000.0 236573
2016-06-28 1390000.0 1404000.0 1379000.0 1399000.0 213829
2016-06-29 1408000.0 1412000.0 1391000.0 1396000.0 208090
2016-06-30 1408000.0 1445000.0 1397000.0 1425000.0 272883
In [37]:
gdp = web.DataReader("GDP", "fred", start, end)
gdp
Out[37]:
GDP
DATE
2015-01-01 17649.3
2015-04-01 17913.7
2015-07-01 18060.2
2015-10-01 18164.8
2016-01-01 18230.1
In [39]:
inflation = web.DataReader(["CPIAUCSL", "CPILFESL"], "fred", start, end)
inflation
Out[39]:
CPIAUCSL CPILFESL
DATE
2015-01-01 234.954 239.915
2015-02-01 235.415 240.304
2015-03-01 235.859 240.797
2015-04-01 236.197 241.392
2015-05-01 236.876 241.672
2015-06-01 237.423 242.089
2015-07-01 237.734 242.464
2015-08-01 237.703 242.753
2015-09-01 237.489 243.224
2015-10-01 237.949 243.701
2015-11-01 238.302 244.139
2015-12-01 238.041 244.516
2016-01-01 238.107 245.232
2016-02-01 237.707 245.925
2016-03-01 237.920 246.095
2016-04-01 238.890 246.574
2016-05-01 239.410 247.074

질문/덧글

오타수정 531c*** 2016년 7월 10일 5:00 오후

pandas.from_csv(): csv file -> DataFrame

이 부분에서
from_csv()가 아니라 read_csv()인 것 같습니다.

답변: 오타수정 관리자 2016년 7월 10일 7:01 오후

오타가 아니고 `from_csv` 와 `read_csv` 명령 두 개 모두 존재합니다.

감사합니다. 531c*** 2016년 7월 12일 2:44 오후

감사합니다.

pandas / zipline /pipeline park*** 2016년 8월 10일 11:01 오전

pandas datareader 로 자료 받기
zipline을 받기
또 quantopian 의 다른 pipeline으로 받기를 하면

뭐가 다른가요 ?

quantopian package는 데이터 클리닝을 알아서 해 주나요 ?

답변: pandas / zipline /pipeline 관리자 2016년 8월 10일 7:25 오후

zipline의 load_xxx 명령어 들은 내부적으로 pandas를 이용합니다.
다만 timezone 정보를 추가하거나 adj.close가 없는 경우 생성합니다.
https://github.com/quantopian/zipline/blob/master/zipline/data/loader.py
pipeline API는 아직 사용해보지 않았습니다.