"매달 엑셀로 일일이 계산하던 관리비, 파이썬 한 줄로 끝내자!"
안녕하세요! 지난 2편에서는 SQLite를 연동해 입주사 및 호실 데이터를 안전하게 저장하고 관리하는 CRUD 로직을 만들어 보았습니다.
이제 데이터가 데이터베이스에 쌓이기 시작했으니, 이번 3편에서는 파이썬 데이터 분석의 꽃인 Pandas(판다스)를 활용해 보겠습니다.
입주사별 전력·수도 사용량에 따른 관리비 자동 정산부터, 건물 전체의 공실률과 총 임대 수입 리포트까지 단 몇 줄의 코드로 깔끔하게 집계해 봅시다!
🛠️ 이번 편에서 구현할 핵심 기능
- SQLite DB 데이터 ➔ Pandas DataFrame 변환: DB 데이터를 분석하기 쉬운 테이블 구조로 로드
- 사용량 기반 관리비 자동 계산: 기본 관리비 + (전기/수도 사용량 × 단가) + 정율 공용 관리비 계산
- 건물 운영 지표 분석: 총 수입, 수납률, 공실률 계산 및 CSV 리포트 수출(Export)
💻 Step 3. Pandas 연동 및 관리비 정산 로직 구현
먼저 필요한 라이브러리를 설치합니다.
pip install pandas
이어서 SQLite DB와 연동하여 관리비를 자동으로 산정하고 분석 리포트를 생성하는 파이썬 코드를 작성합니다.
import sqlite3
import pandas as pd
from datetime import datetime
class BuildingAnalytics:
def __init__(self, db_name: str = "building_manager.db"):
self.db_name = db_name
def get_dataframe(self) -> pd.DataFrame:
"""SQLite 데이터를 Pandas DataFrame으로 불러오기"""
with sqlite3.connect(self.db_name) as conn:
query = "SELECT * FROM tenants"
df = pd.read_sql_query(query, conn)
return df
def calculate_monthly_bills(self, utility_data: list[dict],
electricity_rate: float = 120.0,
water_rate: float = 850.0) -> pd.DataFrame:
"""
호실별 사용량 데이터를 받아 총 청구 금액(월세 + 관리비) 계산
utility_data 예시:
[{'room_number': 101, 'electricity_kwh': 250, 'water_m3': 15}, ...]
"""
df = self.get_dataframe()
# 사용량 데이터 프레임 생성 및 기존 입주 정보와 Merge (INNER JOIN)
util_df = pd.DataFrame(utility_data)
merged_df = pd.merge(df, util_df, on='room_number', how='left')
# 공실인 경우 사용량 0 처리
merged_df['electricity_kwh'] = merged_df['electricity_kwh'].fillna(0)
merged_df['water_m3'] = merged_df['water_m3'].fillna(0)
# 개별 공과금 계산 (사용량 * 단가)
merged_df['electricity_fee'] = merged_df['electricity_kwh'] * electricity_rate
merged_df['water_fee'] = merged_df['water_m3'] * water_rate
# 기본 공용 관리비 (평당/면적당 계산 가능하지만, 여기선 기본 50,000원 적용)
merged_df['base_maintenance'] = merged_df['is_occupied'].apply(lambda x: 50000 if x == 1 else 0)
# 총 관리비 = 기본 관리비 + 전기료 + 수도료
merged_df['total_maintenance'] = (
merged_df['base_maintenance'] +
merged_df['electricity_fee'] +
merged_df['water_fee']
)
# 총 청구액 = 월세 + 총 관리비
merged_df['total_invoice'] = merged_df['monthly_rent'] * merged_df['is_occupied'] + merged_df['total_maintenance']
return merged_df
def generate_summary_report(self, billed_df: pd.DataFrame):
"""건물 전체 요약 리포트 출력"""
total_rooms = len(billed_df)
occupied_rooms = billed_df['is_occupied'].sum()
occupancy_rate = (occupied_rooms / total_rooms) * 100 if total_rooms > 0 else 0
total_rent = billed_df['monthly_rent'] * billed_df['is_occupied']
total_rent_income = total_rent.sum()
total_maintenance_income = billed_df['total_maintenance'].sum()
grand_total = billed_df['total_invoice'].sum()
print("==========================================")
print(f"🏢 건물 월간 정산 요약 ({datetime.now().strftime('%Y-%m')})")
print("==========================================")
print(f"• 전체 호실 수 : {total_rooms}개")
print(f"• 입주 호실 수 : {occupied_rooms}개 (가동률: {occupancy_rate:.1f}%)")
print(f"• 총 월세 수입 : {total_rent_income:,.0f}원")
print(f"• 총 관리비 수입 : {total_maintenance_income:,.0f}원")
print(f"------------------------------------------")
print(f"💰 이번 달 총 청구액 : {grand_total:,.0f}원")
print("==========================================")
# 🧪 실행 및 테스트 예시
if __name__ == "__main__":
analytics = BuildingAnalytics()
# 각 호실별 이번 달 전기(kWh), 수도(m³) 사용량 샘플 데이터
monthly_utilities = [
{'room_number': 101, 'electricity_kwh': 320, 'water_m3': 18},
{'room_number': 102, 'electricity_kwh': 0, 'water_m3': 0}, # 공실
{'room_number': 201, 'electricity_kwh': 540, 'water_m3': 32},
]
# 관리비 계산 실행
billed_result = analytics.calculate_monthly_bills(monthly_utilities)
# 주요 컬럼만 정돈하여 출력
display_columns = ['room_number', 'tenant_name', 'monthly_rent', 'total_maintenance', 'total_invoice']
print("\n[📋 호실별 청구 내역]")
print(billed_result[display_columns].to_string(index=False))
# 요약 리포트 출력
print("\n")
analytics.generate_summary_report(billed_result)
# 엑셀/CSV 파일로 내보내기
billed_result.to_csv("monthly_building_report.csv", index=False, encoding="utf-8-sig")
print("\n📄 'monthly_building_report.csv' 파일로 리포트가 저장되었습니다!")
📈 실행 결과 스크린샷 느낌 살려보기
코드를 실행하면 콘솔에 다음과 같이 깔끔하게 정산된 내역과 요약 리포트가 출력됩니다!
[📋 호실별 청구 내역]
room_number tenant_name monthly_rent total_maintenance total_invoice
101 망고 소프트 850000 103700.0 953700.0
102 None 1000000 0.0 0.0
201 코드 카페 1500000 142000.0 1642000.0
==========================================
🏢 건물 월간 정산 요약 (2026-08)
==========================================
• 전체 호실 수 : 3개
• 입주 호실 수 : 2개 (가동률: 66.7%)
• 총 월세 수입 : 2,350,000원
• 총 관리비 수입 : 245,700원
------------------------------------------
💰 이번 달 총 청구액 : 2,595,700원
==========================================
Pandas의 to_csv() 메서드 덕분에 버튼 한 번으로 경리/회계용 CSV 파일까지 자동 내보내기가 완료됩니다!
🚀 다음 편 예고 (시리즈 완결)
데이터베이스 저장(SQLite)과 자동 정산 및 리포팅(Pandas)까지 핵심 백엔드 로직이 완성되었습니다!
다음 마지막 4편에서는 파이썬 최고의 프론트엔드 라이브러리인 Streamlit을 활용하여:
- 한눈에 들어오는 웹 기반 대시보드 화면 구성
- 클릭만으로 입주사를 추가하고 관리비를 정산하는 실제 사용 가능한 UI 완성
을 진행해 보겠습니다. 기대해 주세요!
궁금한 점이나 추가하고 싶은 로직이 있다면 댓글로 편하게 말씀해 주세요! 💬
'Programming > Python' 카테고리의 다른 글
| [파이썬/프로젝트] "내 꿈은 건물주!" 4편: Streamlit으로 10분 만에 웹 대시보드 완성하기 (완결) (0) | 2026.08.14 |
|---|---|
| [파이썬/프로젝트] "내 꿈은 건물주!" 2편: SQLite DB 연동 및 입주사 정보 CRUD 구현하기 (0) | 2026.08.14 |
| [파이썬/프로젝트] "내 꿈은 건물주!" Python으로 내 손으로 만드는 빌딩 관리 시스템 구축 가이드 (0) | 2026.08.14 |
| [Python] 기초 소스 (0) | 2026.05.14 |
| Python Tkinter - GUI 라이브러리 (0) | 2025.11.22 |