출력 요구사항
모든 Excel 파일
전문 폰트
- 별도의 지시가 없는 한, 모든 결과물에 일관되고 전문적인 폰트(예: Arial, Times New Roman)를 사용하세요.
수식 오류 제로
- 모든 Excel 모델은 ZERO 수식 오류(#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)가 없어야 합니다.
기존 템플릿 유지 (템플릿 업데이트 시)
- 파일 수정 시 기존 형식, 스타일 및 규칙을 정확히 연구하고 일치시키세요.
- 기존 패턴이 있는 파일에 표준화된 서식을 강제로 적용하지 마세요.
- 기존 템플릿 규칙이 항상 이 가이드라인보다 우선합니다.
금융 모델
색상 코딩 표준
사용자 또는 기존 템플릿이 별도로 명시하지 않는 한
업계 표준 색상 규칙
- 파란색 텍스트 (RGB: 0,0,255): 하드코딩된 입력값 및 사용자가 시나리오에 따라 변경할 숫자
- 검은색 텍스트 (RGB: 0,0,0): 모든 수식 및 계산
- 녹색 텍스트 (RGB: 0,128,0): 동일 통합 문서 내 다른 워크시트에서 가져오는 링크
- 빨간색 텍스트 (RGB: 255,0,0): 다른 파일에 대한 외부 링크
- 노란색 배경 (RGB: 255,255,0): 주의가 필요한 주요 가정 또는 업데이트해야 할 셀
숫자 서식 표준
필수 서식 규칙
- 연도: 텍스트 문자열로 서식 지정 (예: "2024", "2,024" 아님)
- 통화: $#,##0 형식 사용; 헤더에 항상 단위 명시 ("Revenue ($mm)")
- 0: 모든 0을 "-"로 표시하는 숫자 서식 사용 (예: "$#,##0;($#,##0);-")
- 백분율: 기본값 0.0% 형식 (소수점 한 자리)
- 배수: 0.0x 형식 (EV/EBITDA, P/E)
- 음수: 괄호 사용 (123), 마이너스 기호 -123 사용 안 함
수식 구성 규칙
가정 배치
- 모든 가정(성장률, 마진, 배수 등)을 별도의 가정 셀에 배치하세요.
- 수식에 하드코딩된 값 대신 셀 참조를 사용하세요.
- 예시: =B51.05 대신 =B5(1+$B$6) 사용
수식 오류 방지
- 모든 셀 참조가 올바른지 확인하세요.
- 범위의 경계 오류가 없는지 확인하세요.
- 모든 예측 기간에 걸쳐 일관된 수식이 있는지 확인하세요.
- 극단적인 경우(0 값, 음수)로 테스트하세요.
- 의도하지 않은 순환 참조가 없는지 확인하세요.
하드코드 문서화 요구사항
- 주석 또는 셀 옆에 (테이블 끝인 경우) 작성하세요. 형식: "출처: [시스템/문서], [날짜], [특정 참조], [해당 시 URL]"
- 예시:
- "출처: 회사 10-K, FY2024, 45페이지, 수익 주석, [SEC EDGAR URL]"
- "출처: 회사 10-Q, 2분기 2025, 첨부 99.1, [SEC EDGAR URL]"
- "출처: Bloomberg Terminal, 2025-08-15, AAPL US 주식"
- "출처: FactSet, 2025-08-20, 컨센서스 예상 화면"
XLSX 생성, 편집 및 분석
개요
사용자가 .xlsx 파일의 내용을 생성, 편집 또는 분석하도록 요청할 수 있습니다. 다양한 작업에 사용할 수 있는 다양한 도구와 워크플로우가 있습니다.
중요 요구사항
수식 재계산을 위해 LibreOffice 필요: scripts/recalc.py 스크립트를 사용하여 수식 값을 재계산하기 위해 LibreOffice가 설치되어 있다고 가정할 수 있습니다. 이 스크립트는 처음 실행 시 Unix 소켓이 제한된 샌드박스 환경을 포함하여 LibreOffice를 자동으로 구성합니다(scripts/office/soffice.py에서 처리).
데이터 읽기 및 분석
pandas를 사용한 데이터 분석
데이터 분석, 시각화 및 기본 작업에는 강력한 데이터 조작 기능을 제공하는 pandas를 사용하세요.
import pandas as pd
# Excel 읽기
df = pd.read_excel('file.xlsx') # 기본값: 첫 번째 시트
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # 모든 시트를 딕셔너리로
# 분석
df.head() # 데이터 미리보기
df.info() # 열 정보
df.describe() # 통계
# Excel 쓰기
df.to_excel('output.xlsx', index=False)
Excel 파일 워크플로우
중요: 수식 사용, 하드코딩된 값 사용 금지
Python에서 값을 계산하여 하드코딩하는 대신 항상 Excel 수식을 사용하세요. 이렇게 하면 스프레드시트가 동적으로 유지되고 업데이트 가능해집니다.
❌ 잘못된 방법 - 계산된 값 하드코딩
# 나쁜 예: Python에서 계산하고 결과를 하드코딩
total = df['Sales'].sum()
sheet['B10'] = total # 5000 하드코딩
# 나쁜 예: Python에서 성장률 계산
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # 0.15 하드코딩
# 나쁜 예: 평균을 위한 Python 계산
avg = sum(values) / len(values)
sheet['D20'] = avg # 42.5 하드코딩
✅ 올바른 방법 - Excel 수식 사용
# 좋은 예: Excel이 합계를 계산하도록 함
sheet['B10'] = '=SUM(B2:B9)'
# 좋은 예: Excel 수식으로 성장률
sheet['C5'] = '=(C4-C2)/C2'
# 좋은 예: Excel 함수를 사용한 평균
sheet['D20'] = '=AVERAGE(D2:D19)'
이것은 합계, 백분율, 비율, 차이 등 모든 계산에 적용됩니다. 스프레드시트는 원본 데이터가 변경될 때 다시 계산할 수 있어야 합니다.
일반 워크플로우
- 도구 선택: 데이터에는 pandas, 수식/서식에는 openpyxl
- 생성/로드: 새 통합 문서 생성 또는 기존 파일 로드
- 수정: 데이터, 수식 및 서식 추가/편집
- 저장: 파일에 쓰기
- 수식 재계산 (수식 사용 시 필수): scripts/recalc.py 스크립트 사용
python scripts/recalc.py output.xlsx - 오류 확인 및 수정:
- 스크립트는 오류 세부 정보가 포함된 JSON을 반환합니다.
status가errors_found인 경우,error_summary에서 특정 오류 유형 및 위치를 확인합니다.- 식별된 오류를 수정하고 다시 계산합니다.
- 수정해야 할 일반적인 오류:
#REF!: 잘못된 셀 참조#DIV/0!: 0으로 나누기#VALUE!: 수식의 잘못된 데이터 유형#NAME?: 인식할 수 없는 수식 이름
새 Excel 파일 생성
# 수식 및 서식을 위한 openpyxl 사용
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# 데이터 추가
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# 수식 추가
sheet['B2'] = '=SUM(A1:A10)'
# 서식 지정
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# 열 너비
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
기존 Excel 파일 편집
# 수식 및 서식을 유지하기 위한 openpyxl 사용
from openpyxl import load_workbook
# 기존 파일 로드
wb = load_workbook('existing.xlsx')
sheet = wb.active # 또는 특정 시트의 경우 wb['SheetName']
# 여러 시트 작업
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"시트: {sheet_name}")
# 셀 수정
sheet['A1'] = '새 값'
sheet.insert_rows(2) # 2행에 행 삽입
sheet.delete_cols(3) # 3열 삭제
# 새 시트 추가
new_sheet = wb.create_sheet('NewSheet')
new_sheet['A1'] = '데이터'
wb.save('modified.xlsx')
수식 재계산
openpyxl로 생성되거나 수정된 Excel 파일에는 문자열로 수식이 포함되어 있지만 계산된 값은 포함되지 않습니다. 제공된 scripts/recalc.py 스크립트를 사용하여 수식을 재계산하세요.
python scripts/recalc.py <excel_file> [timeout_seconds]
예시:
python scripts/recalc.py output.xlsx 30
스크립트는 다음을 수행합니다.
- 첫 번째 실행 시 LibreOffice 매크로를 자동으로 설정합니다.
- 모든 시트의 모든 수식을 재계산합니다.
- Excel 오류(#REF!, #DIV/0! 등)에 대해 모든 셀을 검사합니다.
- 자세한 오류 위치 및 개수가 포함된 JSON을 반환합니다.
- Linux 및 macOS에서 모두 작동합니다.
수식 확인 체크리스트
수식이 올바르게 작동하는지 빠르게 확인하는 방법:
필수 확인
- 샘플 참조 2-3개 테스트: 전체 모델을 구축하기 전에 올바른 값을 가져오는지 확인하세요.
- 열 매핑: Excel 열이 일치하는지 확인하세요 (예: 열 64 = BL, BK 아님).
- 행 오프셋: Excel 행은 1부터 시작합니다(DataFrame 행 5 = Excel 행 6).
일반적인 함정
- NaN 처리:
pd.notna()로 null 값을 확인하세요. - 오른쪽 끝 열: FY 데이터는 종종 50+ 열에 있습니다.
- 여러 일치 항목: 첫 번째 항목뿐만 아니라 모든 항목을 검색하세요.
- 0으로 나누기: 수식에서
/를 사용하기 전에 분모를 확인하세요 (#DIV/0!). - 잘못된 참조: 모든 셀 참조가 의도된 셀을 가리키는지 확인하세요 (#REF!).
- 시트 간 참조: 시트를 연결하려면 올바른 형식(Sheet1!A1)을 사용하세요.
수식 테스트 전략
- 작게 시작: 광범위하게 적용하기 전에 2-3개 셀에서 수식을 테스트하세요.
- 종속성 확인: 수식에서 참조된 모든 셀이 존재하는지 확인하세요.
- 극단적인 경우 테스트: 0, 음수 및 매우 큰 값을 포함하세요.
scripts/recalc.py 출력 해석
스크립트는 오류 세부 정보가 포함된 JSON을 반환합니다.
{
"status": "success", // 또는 "errors_found"
"total_errors": 0, // 총 오류 수
"total_formulas": 42, // 파일의 수식 수
"error_summary": { // 오류가 있는 경우에만 표시
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
모범 사례
라이브러리 선택
- pandas: 데이터 분석, 대량 작업 및 간단한 데이터 내보내기에 가장 적합합니다.
- openpyxl: 복잡한 서식, 수식 및 Excel 관련 기능에 가장 적합합니다.
openpyxl 작업 시
- 셀 인덱스는 1부터 시작합니다(row=1, column=1은 셀 A1을 나타냄).
- 계산된 값을 읽으려면
data_only=True를 사용하세요:load_workbook('file.xlsx', data_only=True) - 경고:
data_only=True로 열고 저장하면 수식이 값으로 대체되어 영구적으로 손실됩니다. - 대용량 파일의 경우: 읽기에는
read_only=True, 쓰기에는write_only=True를 사용하세요. - 수식은 유지되지만 평가되지 않습니다. 값을 업데이트하려면 scripts/recalc.py를 사용하세요.
pandas 작업 시
- 추론 문제를 피하려면 데이터 유형을 지정하세요:
pd.read_excel('file.xlsx', dtype={'id': str}) - 대용량 파일의 경우 특정 열만 읽으세요:
pd.read_excel('file.xlsx', usecols=['A', 'C', 'E']) - 날짜를 적절하게 처리하세요:
pd.read_excel('file.xlsx', parse_dates=['date_column'])
코드 스타일 가이드라인
중요: Excel 작업을 위한 Python 코드를 생성할 때:
- 불필요한 주석 없이 최소한의 간결한 Python 코드를 작성하세요.
- 장황한 변수 이름과 중복 작업을 피하세요.
- 불필요한 print 문을 피하세요.
Excel 파일 자체의 경우:
- 복잡한 수식이나 중요한 가정이 있는 셀에 주석을 추가하세요.
- 하드코딩된 값의 데이터 소스를 문서화하세요.
- 주요 계산 및 모델 섹션에 대한 메모를 포함하세요.