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에러가 없고 에디터에서 모든 셀이 실행되면 이전이 완료된 것입니다.