-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalyze.py
More file actions
143 lines (114 loc) · 4.28 KB
/
analyze.py
File metadata and controls
143 lines (114 loc) · 4.28 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
def load_expense_records(this_trip_name, nickname):
records = []
try:
with open(f"{this_trip_name}_{nickname}.txt", "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split("|")
if len(parts) >= 3:
date = parts[0].strip()
category = parts[1].strip()
amount = parts[2].strip().replace("원", "").replace(",", "")
try:
formatted = f"{date} | {category} | {int(amount)}원"
records.append(formatted)
except:
continue
except FileNotFoundError:
print(f"⚠️ 파일이 없습니다: {this_trip_name}_{nickname}")
return records
# 함수 정의
def day_data(records):
day_summary = {}
for record in records:
record = record.strip() # 공백 제거
parts = record.split("|") # 구분자 |
date = parts[0].strip()
category = parts[1].strip()
amount_text = parts[2].strip().replace("원", "").replace(",", "")
amount = int(amount_text) # 문자열 → 숫자
# 날짜가 처음 나왔으면 빈 딕셔너리 만들기
if date not in day_summary:
day_summary[date] = {}
# 카테고리가 처음 나왔으면 0으로 초기화
if category not in day_summary[date]:
day_summary[date][category] = 0
# 지출 금액 누적하기
day_summary[date][category] += amount
return day_summary
#날짜별로 많이 쓴 항목 정리
def day_category_rank(day_summary):
rank_result = {}
for date in day_summary:
categories = day_summary[date]
# (카테고리, 금액) 튜플을 리스트로 만든 후 금액 기준으로 정렬
sorted_list = sorted(categories.items(), key=lambda x: -x[1])
# 정렬된 항목 이름만 뽑아서 리스트로 저장
rank_result[date] = []
for category, amount in sorted_list:
rank_result[date].append(category)
return rank_result
# 날짜를 순서대로 정렬하고 'n일차 (날짜)' 형태로 라벨 붙임
def get_day_indexed_labels(dates):
sorted_dates = sorted(dates) # 날짜 정렬
result = {}
i = 1
for date in sorted_dates:
label = f"{i}일차 ({date})"
result[date] = label
i += 1
return result
#카테고리(또는 장소)별로 총 지출 합계를 계산
def space_data(records):
place_summary = {}
for record in records:
record = record.strip()
parts = record.split("|")
place = parts[1].strip()
amount_text = parts[2].strip().replace("원", "").replace(",", "")
amount = int(amount_text)
if place not in place_summary:
place_summary[place] = 0
place_summary[place] += amount
return place_summary
# 예산 초과율 계산 함수
def percent_over(budget, total):
if budget == 0:
return 0
return round((total - budget) / budget * 100, 2)
def percent_over_status(percent):
if percent <= 0:
return "예산 잘 지킴"
elif percent <= 10:
return "조금 초과함"
elif percent <= 30:
return "많이 초과함"
else:
return "심각한 초과"
#가장 많이 쓴 항목에 따라 캐릭터 정함
def main_cha(space_total):
if not space_total:
return "무소비자"
max_category = None
max_amount = 0
for category in space_total:
if space_total[category] > max_amount:
max_amount = space_total[category]
max_category = category
if max_category == "쇼핑":
return "플렉서"
elif max_category == "교통":
return "여행러버"
elif max_category == "식사":
return "미식가"
elif max_category == "간식":
return "스낵홀릭"
elif max_category == "숙소":
return "호캉서"
elif max_category == "엑티비티":
return "모험가"
elif max_category == "기타":
return "숨은고수"
elif max_category == "티켓":
return "문화인"
else:
return "무소비자"