181 lines
6.3 KiB
Python
181 lines
6.3 KiB
Python
"""
|
|
2월 데이터 검증 스크립트
|
|
5호기(kremc-05), 9호기(nrems-09)의 2월 데이터가 DB에 제대로 저장되었는지 확인
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
from datetime import datetime
|
|
from dotenv import load_dotenv
|
|
|
|
# .env 로드
|
|
load_dotenv()
|
|
|
|
# Windows 인코딩 문제 해결
|
|
if sys.platform.startswith('win'):
|
|
sys.stdout.reconfigure(encoding='utf-8')
|
|
sys.stderr.reconfigure(encoding='utf-8')
|
|
|
|
# 프로젝트 루트 경로 추가
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.append(current_dir)
|
|
|
|
from database import get_supabase_client
|
|
|
|
def verify_data(plant_id, plant_name):
|
|
"""특정 발전소의 2월 데이터 검증"""
|
|
|
|
print(f"\n{'='*70}")
|
|
print(f"🔍 [{plant_name}] 2월 데이터 검증 중...")
|
|
print(f"{'='*70}")
|
|
|
|
client = get_supabase_client()
|
|
if client is None:
|
|
print("❌ Supabase 연결 실패")
|
|
return
|
|
|
|
# 2월 데이터 범위 설정
|
|
now = datetime.now()
|
|
year = now.year
|
|
|
|
start_date = f"{year}-02-01"
|
|
if now.month == 2:
|
|
end_date = now.strftime("%Y-%m-%d")
|
|
else:
|
|
# 2월 마지막 날
|
|
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
|
|
end_date = f"{year}-02-29"
|
|
else:
|
|
end_date = f"{year}-02-28"
|
|
|
|
month_str = f"{year}-02"
|
|
|
|
try:
|
|
# 1. 시간별 데이터 확인 (solar_logs)
|
|
print(f"\n📊 [Hourly] 시간별 데이터 (solar_logs)")
|
|
print(f" 조회 기간: {start_date} ~ {end_date}")
|
|
|
|
hourly_result = client.table("solar_logs") \
|
|
.select("*", count='exact') \
|
|
.eq("plant_id", plant_id) \
|
|
.gte("created_at", f"{start_date}T00:00:00+09:00") \
|
|
.lte("created_at", f"{end_date}T23:59:59+09:00") \
|
|
.order("created_at", desc=False) \
|
|
.execute()
|
|
|
|
hourly_count = hourly_result.count if hasattr(hourly_result, 'count') else len(hourly_result.data)
|
|
|
|
if hourly_count > 0:
|
|
print(f" ✅ 총 {hourly_count}건의 시간별 데이터 발견")
|
|
|
|
# 날짜별 카운트 집계
|
|
dates = {}
|
|
total_kwh = 0
|
|
for record in hourly_result.data:
|
|
date_str = record['created_at'][:10]
|
|
dates[date_str] = dates.get(date_str, 0) + 1
|
|
total_kwh += record.get('today_kwh', 0)
|
|
|
|
print(f" 📅 {len(dates)}일간의 데이터")
|
|
|
|
# 처음 3일과 마지막 3일 샘플 표시
|
|
sorted_dates = sorted(dates.keys())
|
|
print(f"\n [샘플 - 처음 3일]")
|
|
for d in sorted_dates[:3]:
|
|
print(f" {d}: {dates[d]}건")
|
|
|
|
if len(sorted_dates) > 6:
|
|
print(f" ... ({len(sorted_dates) - 6}일 생략) ...")
|
|
|
|
print(f"\n [샘플 - 마지막 3일]")
|
|
for d in sorted_dates[-3:]:
|
|
print(f" {d}: {dates[d]}건")
|
|
|
|
print(f"\n 💡 평균 발전량 합계: {total_kwh / len(hourly_result.data):.2f} kWh/시간")
|
|
else:
|
|
print(f" ⚠️ 시간별 데이터가 없습니다!")
|
|
|
|
# 2. 일별 데이터 확인 (daily_stats)
|
|
print(f"\n📊 [Daily] 일별 데이터 (daily_stats)")
|
|
print(f" 조회 기간: {start_date} ~ {end_date}")
|
|
|
|
daily_result = client.table("daily_stats") \
|
|
.select("*", count='exact') \
|
|
.eq("plant_id", plant_id) \
|
|
.gte("date", start_date) \
|
|
.lte("date", end_date) \
|
|
.order("date", desc=False) \
|
|
.execute()
|
|
|
|
daily_count = daily_result.count if hasattr(daily_result, 'count') else len(daily_result.data)
|
|
|
|
if daily_count > 0:
|
|
print(f" ✅ 총 {daily_count}건의 일별 데이터 발견")
|
|
|
|
total_generation = sum(r.get('total_generation', 0) for r in daily_result.data)
|
|
avg_generation = total_generation / daily_count if daily_count > 0 else 0
|
|
|
|
print(f" 📈 2월 총 발전량: {total_generation:.2f} kWh")
|
|
print(f" 📈 일평균 발전량: {avg_generation:.2f} kWh")
|
|
|
|
# 처음 5일과 마지막 5일 샘플 표시
|
|
print(f"\n [샘플 - 처음 5일]")
|
|
for record in daily_result.data[:5]:
|
|
print(f" {record['date']}: {record.get('total_generation', 0):.2f} kWh")
|
|
|
|
if len(daily_result.data) > 10:
|
|
print(f" ... ({len(daily_result.data) - 10}일 생략) ...")
|
|
|
|
print(f"\n [샘플 - 마지막 5일]")
|
|
for record in daily_result.data[-5:]:
|
|
print(f" {record['date']}: {record.get('total_generation', 0):.2f} kWh")
|
|
else:
|
|
print(f" ⚠️ 일별 데이터가 없습니다!")
|
|
|
|
# 3. 월별 데이터 확인 (monthly_stats)
|
|
print(f"\n📊 [Monthly] 2월 월별 데이터 (monthly_stats)")
|
|
print(f" 조회 월: {month_str}")
|
|
|
|
monthly_result = client.table("monthly_stats") \
|
|
.select("*") \
|
|
.eq("plant_id", plant_id) \
|
|
.eq("month", month_str) \
|
|
.execute()
|
|
|
|
if monthly_result.data:
|
|
record = monthly_result.data[0]
|
|
print(f" ✅ 2월 월별 통계 발견")
|
|
print(f" 📈 총 발전량: {record.get('total_generation', 0):.2f} kWh")
|
|
print(f" 🕐 업데이트: {record.get('updated_at', 'N/A')}")
|
|
else:
|
|
print(f" ⚠️ 2월 월별 데이터가 없습니다!")
|
|
|
|
print(f"\n✅ [{plant_name}] 검증 완료\n")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 검증 중 오류 발생: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
def main():
|
|
"""메인 실행 함수"""
|
|
|
|
plants = [
|
|
('kremc-05', '5호기'),
|
|
('nrems-09', '9호기')
|
|
]
|
|
|
|
print("\n" + "="*70)
|
|
print("🔍 2월 데이터 검증 시작")
|
|
print("="*70)
|
|
|
|
for plant_id, plant_name in plants:
|
|
verify_data(plant_id, plant_name)
|
|
|
|
print("="*70)
|
|
print("🎉 모든 검증 완료!")
|
|
print("="*70 + "\n")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|