2023-04-03 금융분석데이터 스터디 2주차 !!

CH 9. 입출력 작업

입출력 작업은 금융이나 대규모 데이터를 다루는 응용 분야에서 가장 중요

하드디스크와 메모리 사이의 데이터 전송이 충분히 빠르지 않기 때문에 입출력 작업은 성능이 중요한 계산 작업에 병목

하나의 금융 분석 작업은 보통 몇 GB 이하의 데이터를 처리하는데,

이 정도 크기가 파이썬이나 Numpy, pandas, PyTables와 같은 과학기술 라이브러리가 다루기에 가장 최적의 크기

기본 파이썬 입출력

1. 객체를 디스크에 쓰기

2. 텍스트 파일 읽고 쓰기

3. SQL 데이터베이스 작업

4. NumPy 배열 읽고 쓰기

pandas를 이용한 입출력

1. SQL 데이터베이스 작업

2. SQL에서 pandas로

3. CSV 파일 작업

4. 엑셀 파일 작업

PyTables를 이용한 입출력

1. 테이블 작업

2. 압축 테이블 작업

3. 배열 작업

3. out-of-memory 연산

TsTables을 이용한 입출력

1. 예제 데이터

2. 데이터 저장

3. 데이터 읽기

기본 파이썬 입출력

1. 객체를 디스크에 쓰기

문서화 작업 또는 다른 사람들과 공유를 위해 파이썬 객체를 나중에 다시 사용할 수 있도록 저장하고 싶은 경우 => ‘picke 모듈’

이 모듈은 대부분의 파이썬 객체를 직렬화할 수 있다.

  • 직렬화 => 객체를 바이트열로 변환하는 작업

  • 역직렬화 => 반대의 작업

중요 함수 두가지

  1. pickle.dump() : 객체를 쓰는 함수
  2. pickle.load() : 다시 메모리로 올리는 함수

pickle은 객체를 FIFO 순서로 저장하고 반환한다.[먼저 들어온 것 먼저 나감]

  • 문제점 : 사용자가 어떤 객체가 저장되어 있는지 알 수 있는 상위 정보가 없다.

  • 해결 방법 : 직접 객체를 저장하지 않고 사전 객체에 달느 객체를 담아서 저장하기

ㄴ 이 방법을 쓰면, 모든 객체를 한 번 쓰고 읽어야 한다.

2. 텍스트 파일 읽고 쓰기

텍스트 처리는 파이썬의 강점 CSV 파일 형태로 저장

이 데이터를 읽는 방법은 CSV 파일을 열고 파일 객체의 realine()메서드로 내용을 한 줄씩 읽기

readlines() 메서드로 모든 줄을 한번에 읽을 수 있다.

CSV 모듈의 두 가지 읽기 도구 객체는 리스트의 리스트나 사전의 리스트를 반환한다.

3. SQL 데이터베이스 작업

파이썬은 거의 모든 종류의 SQL 데이터베이스와 NoSQL 데이터베이스 작업이 가능하다.

기본으로 사용하는 데이터베이스 => SQLite3

4. NumPy 배열 읽고 쓰기

NumPy도 ndarray 객체를 읽고 쓰는 함수가 있다

이 함수를 사용하면 NumPy dtype을 특정한 데이터베이스(like, SQLite3) 자료형으로 변환하는 수고를 덜어준다.

SQL 대신 NumPy를 사용할 수 있다.

ndarray 객체 저장은 최적화되어 있고 속도가 빠르다.

NumPy의 데이터 읽고 쓰기는 SQL 데이터베이스나 pickle 모듈 직렬화보다 빠른 두가지 이유

  1. 데이터가 주로 숫자
  2. NumPy가 바이너리 저장 방식을 사용해서 오버헤드가 없다.

물론, 이 방식을 쓰면 SQL 데이터베이스의 기능을 사용할 수 없다.

이때는 9.3에서 배우는 PyTables 라이브러리가 도움된다.

pandas를 이용한 입출력

pandas 라이브러리의 강점

image

다음과 같은 여러가지 데이터 포맷으로 쓰거나 읽을 수 있다.

1. SQL 데이터베이스 작업

한 ndarray 객체의 내용을 쓰기 위해 executemany를 사용한다.

2. SQL에서 pandas로

일반적으로 가장 효율적인 방법은 전체 테이블이나 쿼리 결과를 pandas로 한 번에 읽는 것이다.

전체 테이블을 메모리에 읽어 들일 수 있다면, 쿼리 작업은 디스크 기반의 SQL 작업보다 훨씬 빠르게 실행될 수 있다.

전체 테이블을 pandas로 읽으면 NumPy 배열 객체를 읽을 때와 거의 비슷한 시간이 걸린다.

이제 데이터가 메모리상에 존재하므로 더 빠르게 분석 가능하다.

pandas는 속도 향상 뿐 아니라 훨씬 복잡한 쿼리도 할 수 있다.

뿐만아니라, pandas를 PyTables와 결합하면 입출력 속도를 더 개선할 수 있다.

읽기 경우는 훨씬 더 빠르다.

3. CSV 파일 작업

데이터를 교환할 때 가장 널리 쓰이는 포맷 중 하나가 CSV

CSV 포맷은 데이터 분석이나 금융 분석을 하는 모든 플랫폼과 애플리케이션에서 처리 가능하다.

4. 엑셀 파일 작업

pandas로 엑셀 스프레드시트 형식을 읽고 쓰는 것이다.

데이터를 가진 엑셀 스프레드시트를 생성하는 데 시간이 좀 걸린다.

스프레드시트 구조가 가진 오버헤드 때문이다.

PyTables를 이용한 입출력

PyTables는 HDF5 데이터베이스 파일 표준의 파이썬 바인딩이다.

HDF5 : 입출력 연산의 성능을 최적화하고 가용 하드웨어를 최대한 이용할 수 있도록 설계되어있다.

이 라이브러리의 임포트 이름은 tables이다.

1. 테이블 작업

NumPy 구조체 배열을 사용하면 성능이 더 좋다.\전체 데이터를 구조체 배열로 지정한 다음에 테이블을 생성하면 한 줄의 코드로 끝난다. PyTables도 SQL과 유사한 문장으로 데이터를 쿼리할 수 있는 도구를 제공한다.

PyTables Table 객체에 저장된 데이터를 다루는 것은 문법이나 성능면에서 Numpy 또는 pandas 객체 인메모리를 사용해 메모리상의 데이터를 다루는 듯한 느낌을 준다.

2. 압축 테이블 작업

PyTables의 장점은 압축을 사용하는 방식이다.

PyTables는 압축을 사용하여 디스크 공간을 절약할 뿐 아니라 동시에 입출력 연산 성능도 개선할 수 있다.

압축으로 줄어든 데이터의 양만큼 발생한 입출력 속도 개선이 압축 연산으로 인한 속도 저하를 능가할 수 있다.

파일의 크기는 데이터의 특성에 따라 크게 감소한다.

이럴때 장점

image

3. 배열 작업

ndarray 객체를 읽고 쓸 때 PyTables도 아주 빠르고 효율적이다.

이런 객체를 HDF5 데이터베이스에 직접 쓰면 객체에 대한 루프를 돌려 Table 객체에 한 행씩 데이터를 쓰거나 구조화된 ndarray 객체를 사용하는 것보다 빠르다.

4. out-of-memory 연산

메모리보다 큰 배열의 연산을 구현 가능하게 해주는 out-of-memory 연산을 지원한다.

EArray 클래스 객체는 (행 방향으로) 증가할 수 있지만 열의 수는 고정되어 있다.

데이터 모음을 하지 않은 out-of-memory 연산의 경우에는 같은 크기를 가진 또는 다른 EArra 객체가 피룡하다.

Expr 모듈은 수치 연산을 효율적으로 할 수 있는 특별한 모듈이다.

전체 연산이 메모리 바깥에서 이루어진다는 점을 생각하면 표준 하드웨어에서 실행된 것치고 꽤 빠르다.

TsTables을 이용한 입출력

TsTables 패키지는 PyTables를 사용하여 시계열 데이터의 고성능 저장을 수행

‘한 번 저장하고 여러 번 읽는 것’

여러 가지 금융 시계열을 반복적으로 사용하여 다양한 매매 전략의 백테스팅을 하는 프로그램에 사용된다.

ㄴ 데이터를 빨리 읽을 수 있는 능력 중요

1. 예제 데이터

TsTables의 장점을 보일 수 있을 정도로 큰 샘플 데이터를 생성하는 것이 첫번째로 할 일이다.

TsTables 패키지는 pandas DataFrame 객체와 결합이 쉬우므로 데이터를 쉽게 변형할 수 있다.

2. 데이터 저장

TsTables는 임의의 위치에서 임의의 길이의 데이터를 빨리 읽을 수 있도록 금융 시계열 데이터를 특정한 청크 기반의 구조로 만든다.

이렇게 하기 위해 TsTables는 PyTables 패키지에 create_ts() 함수를 추가한다.

3. 데이터 읽기

TsTables로 데이터를 읽는 것은 하드웨어 성능에 의존하기는 하지만 아주 빠르다.

TsTables는 DataFrame 객체를 반환한다.

마치며

SQL 관계형 데이터베이스 : 복잡한 자료구조를 다룰 때 이점을 가짐

반면에, 어떤 상황에서는 순수한 NumPy ndarray 기반이나 pandas DataFrame 기반의 방식보다 성능이 떨어질 수 있다.

금융이나 과학기술 분야의 많은 응용 영역에서는 배열 기반의 자료 모델링 방식이 성공적일 수 있다.

이 경우에는 NumPy 입출력 기능을 사용하거나,

NumPy와 PyTables 기능을 조합하거나,

HDF5 기반의 저장소를 이용하는 pandas 기능을 사용하는 것이 성능 향상에 훨씬 도움이 된다.

TsTables는 특히 금융 시계열 데이터를 한 번 쓰고 여러 번 읽는 경우에 효율적이다.

2023

Back to top ↑