SQLite는 가벼운 디스크 기반의 데이터 베이스를 제공하는 C 라이브러리다.
어플리케이션 내부 데이터 저장소로 다양하게 활용되고, 사용이 간편하고 가벼워서 프로토타입용으로도 자주 쓰인다.
본문은 pandas + SQLite3에 대한 간략한 사용 예제를 담는다.
1. CSV 자료를 판다곰의 데이터프레임(DataFrame)으로 읽는다.
df = pd.read_csv('gov_loc.csv',skiprows=1,index_col=['lev1','lev2','lev3'],names=['lev1','lev2','lev3','nx','ny','lon','lat'])
* 샘플 데이터는 기상청 주소/좌표 매핑 데이터를 이용했다.
lev1
|
lev2
|
lev3
|
nx
|
ny
|
lon
|
lat
|
서울특별시 | None | None | 60 | 127 | 126.980008 | 37.563569 |
서울특별시 | 종로구 | None | 60 | 127 | 126.981642 | 37.570378 |
서울특별시 | 종로구 | 청운효자동 | 60 | 127 | 126.970652 | 37.584137 |
서울특별시 | 종로구 | 사직동 | 60 | 127 | 126.970956 | 37.573269 |
서울특별시 | 종로구 | 삼청동 | 60 | 127 | 126.983978 | 37.582425 |
서울특별시 | 종로구 | 부암동 | 60 | 127 | 126.966444 | 37.589856 |
2. 데이터프레임을 SQLite DB로 저장한다.
conn = sqlite3.connect('gov.db')df.to_sql(name='loc_map_book',con=conn,index=True,if_exists='replace')
3. 메타 데이터를 이용해 스키마를 확인 하자.
query_ddl = 'SELECT sql FROM sqlite_master WHERE tbl_name = "loc_map_book";'for i in pd.read_sql(query_ddl ,con=conn).get_values():
print (i[0])
OUT>>
CREATE TABLE "loc_map_book" (
"lev1" TEXT,
"lev2" TEXT,
"lev3" TEXT,
"nx" INTEGER,
"ny" INTEGER,
"lon" REAL,
"lat" REAL
)
CREATE INDEX "ix_loc_map_book_lev1_lev2_lev3"ON "loc_map_book" ("lev1","lev2","lev3")
4. 쿼리 플랜을 통해서 인덱스가 잘 동작하는지 알아 보자.
query = 'explain query plan ' + \'select * from loc_map_book where lev1="{0}";'.format('서울특별시')
for i in conn.execute(query):
print(i)
OUT>>
(0, 0, 0, 'SEARCH TABLE loc_map_book USING INDEX ix_loc_map_book_lev1_lev2_lev3 (lev1=?)')
DB 업무를 먼저 시작한 이유로, 사소한 데이터도 대용량 DB와 연결을 지었는데,
로컬 파일 DB를 활용하는 것은 개발에 매우 큰 이점이 있었다.
단일 파일로 관리 됨으로 프로그램 복제가 쉬웠고, DB 구성/관리 소요비용이 없었다.
참조:
파이썬에서 대용량 자료를 핸들링 하는 방법에 대한 글
- SQLite가 생각보다 큰 자료에 대한 핸들링도 가능한 것으로 보인다.
https://www.reddit.com/r/Python/comments/3wa22v/120gb_csv_is_this_something_i_can_handle_in_python/
0 개의 댓글:
댓글 쓰기