고급 사용법

이 섹션에서는 Atio의 고급 기능들을 다룹니다.

스냅샷 기반 버전 관리

Atio는 데이터의 버전을 관리할 수 있는 스냅샷 시스템을 제공합니다.

기본 스냅샷 쓰기

import atio
import pandas as pd

# 데이터 생성
df = pd.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"]
})

# 스냅샷으로 저장 (버전 관리)
atio.write_snapshot(df, "users_table", format="parquet")

# 새로운 데이터로 업데이트
df_new = pd.DataFrame({
    "id": [1, 2, 3, 4],
    "name": ["Alice", "Bob", "Charlie", "David"]
})

# append 모드로 스냅샷 추가
atio.write_snapshot(df_new, "users_table", mode="append", format="parquet")

스냅샷 읽기

# 최신 버전 읽기
latest_data = atio.read_table("users_table")

# 특정 버전 읽기
version_1_data = atio.read_table("users_table", version=1)

# Polars로 읽기
polars_data = atio.read_table("users_table", output_as="polars")

스냅샷 정리

from datetime import timedelta

# 7일 이상 된 스냅샷 삭제 (dry run)
atio.expire_snapshots("users_table", keep_for=timedelta(days=7), dry_run=True)

# 실제 삭제 실행
atio.expire_snapshots("users_table", keep_for=timedelta(days=7), dry_run=False)

데이터베이스 연동

Pandas와 Polars를 사용하여 데이터베이스에 안전하게 데이터를 저장할 수 있습니다.

Pandas SQL 연동

import atio
import pandas as pd
from sqlalchemy import create_engine

# 데이터베이스 연결
engine = create_engine('postgresql://user:password@localhost/dbname')

df = pd.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"]
})

# SQL 데이터베이스에 저장
atio.write(df, format="sql", name="users", con=engine)

Polars 데이터베이스 연동

import atio
import polars as pl

df = pl.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"]
})

# 데이터베이스에 저장
atio.write(df, format="database",
           table_name="users",
           connection_uri="postgresql://user:password@localhost/dbname")

성능 최적화

진행도 표시

대용량 파일 처리 시 진행 상황을 실시간으로 확인할 수 있습니다.

import atio
import pandas as pd
import numpy as np

# 대용량 데이터 생성
large_df = pd.DataFrame(np.random.randn(1000000, 10))

# 진행도 표시와 함께 저장
atio.write(large_df, "large_data.parquet",
           format="parquet",
           show_progress=True)

상세 로깅

성능 진단을 위한 상세한 로깅을 활성화할 수 있습니다.

# 상세한 성능 정보 출력
atio.write(df, "data.parquet", format="parquet", verbose=True)

이를 통해 다음과 같은 정보를 확인할 수 있습니다:

  • 각 단계별 소요 시간

  • 임시 파일 생성 및 교체 과정

  • 백업 및 롤백 과정

  • 성능 병목점 분석

에러 처리

Atio는 다양한 에러 상황에 대해 안전하게 처리합니다.

파일 시스템 에러

import atio
import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})

try:
    # 권한이 없는 디렉토리에 저장 시도
    atio.write(df, "/root/data.parquet", format="parquet")
except PermissionError as e:
    print(f"권한 에러: {e}")
    # 원본 파일은 그대로 보존됨

포맷 에러

try:
    # 지원하지 않는 포맷 사용
    atio.write(df, "data.unknown", format="unknown")
except ValueError as e:
    print(f"지원하지 않는 포맷: {e}")

데이터베이스 에러

try:
    # 잘못된 데이터베이스 연결 정보
    atio.write(df, format="sql",
               name="users",
               con="invalid_connection")
except Exception as e:
    print(f"데이터베이스 에러: {e}")

플러그인 확장

Atio는 플러그인 아키텍처를 통해 새로운 형식을 쉽게 추가할 수 있습니다.

커스텀 형식 등록

from atio.plugins import register_writer
import pandas as pd

# 커스텀 형식 등록
def custom_writer(df, path, **kwargs):
    # 커스텀 저장 로직
    with open(path, 'w') as f:
        f.write("Custom format\n")
        f.write(df.to_string())

# Pandas DataFrame에 대한 커스텀 형식 등록
register_writer(pd.DataFrame, "custom", custom_writer)

# 사용
df = pd.DataFrame({"a": [1, 2, 3]})
atio.write(df, "data.custom", format="custom")

NumPy 배열 처리

NumPy 배열의 다양한 저장 방식을 지원합니다.

단일 배열 저장

import atio
import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

# .npy 파일로 저장
atio.write(arr, "array.npy", format="npy")

# .csv 파일로 저장
atio.write(arr, "array.csv", format="csv")

여러 배열 저장

# 여러 배열을 딕셔너리로 저장
arrays = {
    "features": np.random.randn(1000, 10),
    "labels": np.random.randint(0, 2, 1000),
    "metadata": np.array([1, 2, 3, 4, 5])
}

# 압축된 .npz 파일로 저장
atio.write(arrays, "data.npz", format="npz_compressed")

실제 사용 사례

머신러닝 파이프라인

import atio
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 데이터 로드 및 전처리
df = pd.read_csv("raw_data.csv")

# 전처리된 데이터를 안전하게 저장
atio.write(df, "processed_data.parquet", format="parquet")

# 학습/테스트 분할
X_train, X_test, y_train, y_test = train_test_split(
    df.drop('target', axis=1), df['target'], test_size=0.2
)

# 분할된 데이터를 스냅샷으로 저장
atio.write_snapshot(X_train, "training_data", format="parquet")
atio.write_snapshot(X_test, "test_data", format="parquet")

# 모델 학습
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 예측 결과를 안전하게 저장
predictions = model.predict(X_test)
results_df = pd.DataFrame({
    'actual': y_test,
    'predicted': predictions
})

atio.write(results_df, "predictions.parquet", format="parquet")

ETL 파이프라인

import atio
import pandas as pd
from sqlalchemy import create_engine

# 1. 원본 데이터 로드
raw_data = pd.read_csv("source_data.csv")

# 2. 데이터 정제
cleaned_data = raw_data.dropna()
cleaned_data = cleaned_data[cleaned_data['value'] > 0]

# 3. 안전하게 정제된 데이터 저장
atio.write(cleaned_data, "cleaned_data.parquet", format="parquet")

# 4. 데이터베이스에 저장
engine = create_engine('postgresql://user:password@localhost/warehouse')
atio.write(cleaned_data, format="sql",
           name="processed_table",
           con=engine,
           if_exists='replace')

# 5. 스냅샷으로 버전 관리
atio.write_snapshot(cleaned_data, "daily_processed", format="parquet")