File size: 2,842 Bytes
d3f9826
 
99eadfa
b6454ba
d3f9826
99eadfa
 
d3f9826
5e76f66
99eadfa
5e76f66
15a9d79
 
 
 
 
99eadfa
5e76f66
 
 
 
99eadfa
5e76f66
 
 
 
244704f
 
5e76f66
99eadfa
5e76f66
 
 
 
244704f
 
 
 
99eadfa
5e76f66
 
 
 
 
244704f
 
 
5e76f66
 
 
244704f
99eadfa
5e76f66
99eadfa
 
5e76f66
 
 
 
 
 
 
b6454ba
5e76f66
99eadfa
5e76f66
99eadfa
5e76f66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import gradio as gr
import pandas as pd
import logging
from datetime import datetime

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def analyze_reviews(file):
    try:
        logging.info("파일 업로드 시작.")
        # 파일 유효성 검사
        if not file.name.endswith(('.xlsx', '.xls')):
            logging.error("업로드된 파일이 엑셀 파일이 아닙니다.")
            return None

        # 엑셀 파일 읽기
        df = pd.read_excel(file.name, engine='openpyxl')
        logging.info("엑셀 파일 읽기 완료.")
        
        # 현재 연도 설정 (2025년 기준)
        current_year = 2025
        start_date = datetime(current_year - 3, 1, 1)
        end_date = datetime(current_year, 12, 31)
        
        logging.info(f"데이터 필터링: {start_date}부터 {end_date}까지.")
        # B열을 날짜로 변환하고 timezone 정보 제거
        df['B'] = pd.to_datetime(df.iloc[:, 1]).dt.tz_convert(None) if df.iloc[:, 1].dtype == 'datetime64[ns, UTC]' else pd.to_datetime(df.iloc[:, 1])
        
        # 최근 3년 데이터 필터링
        mask = (df['B'] >= start_date) & (df['B'] <= end_date)
        filtered_df = df.loc[mask]
        logging.info(f"필터링된 데이터 행 수: {len(filtered_df)}.")
        
        if filtered_df.empty:
            logging.warning("필터링된 데이터가 없습니다.")
            return None
        
        # 년월별 리뷰 건수 집계
        filtered_df['Year-Month'] = filtered_df['B'].dt.strftime('%Y-%m')
        review_counts = filtered_df.groupby('Year-Month').size().reset_index(name='리뷰건수')
        logging.info("년월별 리뷰 건수 집계 완료.")
        
        # 새로운 시트에 작성
        output_file = "분석_결과.xlsx"
        with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
            df.to_excel(writer, index=False, sheet_name='원본 데이터')  # 원본 데이터를 새 파일에 저장
            review_counts.to_excel(writer, sheet_name='월별 리뷰건수', index=False, header=['A열', 'B열'])
        logging.info("새로운 시트 '월별 리뷰건수' 작성 완료.")
        
        return output_file
    except Exception as e:
        logging.error(f"오류 발생: {e}")
        return None

# Gradio 인터페이스 구성
with gr.Blocks() as demo:
    gr.Markdown("# 리뷰 분석 스페이스")
    with gr.Row():
        file_input = gr.File(label="원본 엑셀 파일 업로드")
    analyze_button = gr.Button("분석")
    file_output = gr.File(label="분석된 엑셀 파일 다운로드", type="filepath")
    
    analyze_button.click(fn=analyze_reviews, inputs=file_input, outputs=file_output)

# 스페이스 실행
if __name__ == "__main__":
    demo.launch()