iBetter Books
수정

Pandas 중심 코드 점진적 이전 전략

실무에서 쌓인 Pandas 분석 노트북은 대개 셀이 수십 개이고 코드 줄이 수백 줄입니다. marimo convert를 실행하면 구조는 변환되지만, MB002 에러가 여기저기서 터지고 셀 순서 의존 패턴도 남아 있습니다. 이것을 하루 만에 전부 고치려 하면 지칩니다.

점진적 이전 전략은 다릅니다. 원본 .ipynb는 그대로 두고, marimo 쪽에서 셀을 하나씩 정리해가는 방식입니다. 작업이 끊겨도 언제든지 재개할 수 있습니다.

1단계: 원본 유지하며 변환

먼저 변환만 합니다. 원본 .ipynb는 그대로 둡니다.

marimo convert analysis.ipynb -o analysis_marimo.py

파일 이름을 달리 짓는 이유가 있습니다. 이전 작업 중에 원본이 필요할 수 있고, 동료가 아직 Jupyter를 쓴다면 원본을 계속 써야 합니다. .ipynb.py가 한동안 병행 존재하는 것은 자연스럽습니다.

2단계: marimo check로 에러 목록 파악

marimo check analysis_marimo.py

출력에서 critical 항목이 고쳐야 할 에러입니다. warning 항목은 나중에 처리해도 됩니다. 에러 개수와 위치를 파악합니다.

critical[multiple-definitions]: Variable 'df' is defined in multiple cells --> analysis_marimo.py:24:1critical[multiple-definitions]: Variable 'model' is defined in multiple cells --> analysis_marimo.py:58:1Found 4 issues.

에러가 많아도 당황하지 않습니다. 위에서부터 하나씩 처리합니다.

3단계: 임포트 셀 통합

Jupyter 노트북은 임포트가 여러 셀에 흩어져 있는 경우가 많습니다.

# 변환 후 흩어진 임포트 예시# Cell 1import pandas as pdimport numpy as np# Cell 5 (다른 셀)import matplotlib.pyplot as pltimport pandas as pd   # MB002: pd가 이미 Cell 1에서 정의됨

임포트 전용 셀을 하나 만들고, 모든 임포트를 거기에 모읍니다.

# Cell 1 — 임포트 전용 셀 (모든 임포트를 여기에)import pandas as pdimport numpy as npimport matplotlib.pyplot as plt

이것만 해도 임포트 관련 MB002가 사라집니다.

4단계: 데이터 적재 셀 단일화

# 변환 전 (여러 셀에서 df를 다시 정의)# Cell 2df = pd.read_csv("data.csv")# Cell 10 (실험 도중 다른 파일로 바꾸려다 남긴 셀)df = pd.read_csv("data_v2.csv")  # MB002

어떤 데이터를 쓸지 결정하고, 데이터 적재 셀을 하나로 줄입니다.

# Cell 2 — 데이터 적재 단일 셀import pandas as pdDATA_FILE = "data.csv"   # 파일을 바꿀 때 이 한 줄만 수정df = pd.read_csv(DATA_FILE)df.head()

DATA_FILE 상수를 위에 두면 나중에 파일을 바꿀 때 한 곳만 수정하면 됩니다.

5단계: 변수 이름 정리로 MB002 해소

데이터프레임을 단계별로 가공하면서 같은 이름으로 덮어쓰는 패턴이 MB002의 주원인입니다.

# 변환 전 패턴 — 여러 셀에서 df를 갱신# Cell 3df = df.dropna()    # Cell 2에서 읽은 df를 다시 쓰면 MB002# Cell 4df = df[df["year"] >= 2020]  # 또 다시 MB002

각 단계에 의미 있는 변수 이름을 붙입니다.

# 정리 후# Cell 2 — 원본 데이터import pandas as pddf_raw = pd.read_csv("data.csv")df_raw.head()# Cell 3 — 결측치 제거df_clean = df_raw.dropna()df_clean.shape# Cell 4 — 기간 필터링df_filtered = df_clean[df_clean["year"] >= 2020]df_filtered.shape

각 단계의 결과가 이름을 가지게 됩니다. 중간 결과를 다시 보고 싶을 때도 셀 하나만 실행하면 됩니다.

6단계: 함수로 분리해 셀을 단순화

셀 하나가 너무 길거나, 같은 처리를 여러 번 반복하는 경우 함수로 분리합니다.

# Cell 1 — 전처리 함수 정의import pandas as pddef preprocess(df: pd.DataFrame) -> pd.DataFrame:    """결측치 제거, 날짜 파싱, 기간 필터링."""    df = df.dropna(subset=["date", "value"])    df = df.copy()    df["date"] = pd.to_datetime(df["date"])    return df[df["date"].dt.year >= 2020]
# Cell 2 — 데이터 적재df_raw = pd.read_csv("data.csv")df_raw.head()# Cell 3 — 전처리 적용df = preprocess(df_raw)df.shape

preprocess 함수는 Cell 1에서 한 번만 정의됩니다. Cell 3에서 그 함수를 씁니다. MB002 없이 깔끔한 구조가 됩니다.

병행 운용 _ 언제 .ipynb를 삭제할까

점진적 이전 기간 동안 .ipynb.py를 동시에 유지합니다. 다음 조건이 모두 충족되면 .ipynb를 제거해도 됩니다.

  • marimo check analysis_marimo.py에서 critical 에러가 0개
  • marimo edit analysis_marimo.py로 모든 셀이 정상 실행됨
  • 팀 구성원이 marimo 환경을 갖추고 있거나, .ipynb를 참조하는 파이프라인이 없음

성급하게 .ipynb를 삭제하지 않습니다. 팀 공유 저장소에서 .ipynb를 삭제하기 전에 팀원과 합의합니다.

이전 과정 진행 예시

작은 분석 노트북 하나를 점진적으로 이전하는 흐름입니다.

[1단계] 변환 직후  marimo check에서 critical 에러 4개, warning 2개[2단계] 임포트 통합  pandas, numpy, matplotlib 임포트를 Cell 1로 통합  결과: critical 에러 4개 중 2개 해소[3단계] df 변수 이름 분리  df_raw, df_clean, df_filtered로 변수 이름 구분  결과: 남은 critical 에러 2개 해소, 에러 0개[4단계] 전처리 함수화  반복 처리 로직을 preprocess() 함수로 분리  결과: 셀 구조 단순화, 재사용 가능[5단계] 검증 및 완료  marimo check 통과 확인  marimo edit로 에디터에서 전 셀 실행 확인  .ipynb 제거 여부 팀과 합의

정리

  • 원본 .ipynb는 그대로 두고 변환 파일을 별도 이름으로 만들면 병행 운용이 쉽습니다.
  • marimo check로 에러 목록을 먼저 파악하고, 위에서부터 하나씩 처리합니다.
  • 임포트 통합, 데이터 적재 단일화, 변수 이름 분리 순서로 진행하면 대부분의 MB002가 해소됩니다.
  • 복잡한 변환 로직은 함수로 분리하면 셀이 단순해지고 재사용도 됩니다.
  • marimo check에서 critical 에러가 없고 에디터에서 모든 셀이 실행되면 이전이 완료된 것입니다.