Maryam Ilka commited on
Commit
9324460
·
verified ·
1 Parent(s): b575f83

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +178 -0
app.py ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import random
3
+ from datetime import datetime
4
+ import gspread
5
+ from google.oauth2.service_account import Credentials
6
+ import os
7
+ import json
8
+
9
+ # تنظیمات اولیه
10
+ st.set_page_config(layout="wide")
11
+
12
+ # ========== بخش سناریوها ==========
13
+ SCENARIOS = {
14
+ "control": {
15
+ "title": "سناریوی کنترل (بدون توضیح)",
16
+ "description": "شما قصد دارید سفری را از مبدأ X به مقصد Y درخواست کنید. قیمت پیشنهادی این سفر طبق تصمیم هوش مصنوعی ۱۰۰ هزار تومان است."
17
+ },
18
+ "input_based": {
19
+ "title": "سناریوی مبتنی بر ورودی",
20
+ "description": """شما قصد دارید سفری را از مبدأ X به مقصد Y درخواست کنید. قیمت پیشنهادی این سفر طبق تصمیم هوش مصنوعی ۱۰۰ هزار تومان است.
21
+
22
+ سازمان این توضیحات را به شما ارائه می‌دهد:
23
+ این قیمت بر اساس چند عامل تعیین شده است:
24
+ • سطح تقاضا در منطقه: زیاد (+)
25
+ • تعداد رانندگان فعال: کم (+)
26
+ • زمان روز: ساعت اوج ترافیک (+)
27
+ • شرایط جوی: هوای بارانی(++)
28
+
29
+ به این دلیل، قیمت این سفر بالاتر از حد معمول است."""
30
+ },
31
+ "counterfactual": {
32
+ "title": "سناریوی پادواقعی",
33
+ "description": """شما قصد دارید سفری را از مبدأ X به مقصد Y درخواست کنید. قیمت پیشنهادی این سفر طبق تصمیم هوش مصنوعی ۱۰۰ هزار تومان است.
34
+
35
+ سازمان این توضیحات را به شما ارائه می‌دهد:
36
+ اگر این سفر را ۳۰ دقیقه زودتر یا دیرتر درخواست می‌کردید، به دلیل سطح تقاضای کمتر، رانندگان فعال بیش‌تر، زمان بهتر روز و شرایط جوی بهتر، ممکن بود قیمت ۱۵٪ کمتر باشد.
37
+ اگر تعداد رانندگان فعال در منطقه شما دو برابر بود، قیمت‌گذاری نوسانی اعمال نمی‌شد."""
38
+ }
39
+ }
40
+
41
+ # ========== بخش نقشه ==========
42
+ def show_map():
43
+ # می‌توانید از folium یا تصاویر استاتیک استفاده کنید
44
+ st.image("map_placeholder.png", caption="مسیر سفر از X به Y")
45
+
46
+ # ========== بخش جمع‌آوری داده‌ها ==========
47
+ def get_demographic_data():
48
+ with st.form("demographic_form"):
49
+ st.header("اطلاعات دموگرافیک")
50
+ age = st.number_input("سن", min_value=18, max_value=100)
51
+ gender = st.selectbox("جنسیت", ["مرد", "زن", "سایر"])
52
+ education = st.selectbox("تحصیلات", ["دیپلم", "لیسانس", "فوق لیسانس", "دکترا"])
53
+ ride_frequency = st.selectbox("دفعات استفاده از سرویس‌های اشتراک سفر در ماه", ["کمتر از 5 بار", "5-10 بار", "بیش از 10 بار"])
54
+
55
+ if st.form_submit_button("ذخیره اطلاعات دموگرافیک"):
56
+ return {
57
+ "age": age,
58
+ "gender": gender,
59
+ "education": education,
60
+ "ride_frequency": ride_frequency
61
+ }
62
+ return None
63
+
64
+ # ========== پرسشنامه عدالت قیمتی ==========
65
+ def fairness_questionnaire():
66
+ st.header("پرسشنامه ادراک انصاف قیمتی")
67
+
68
+ fairness = st.slider("به نظر شما این قیمت چقدر منصفانه است؟ (1 کاملاً ناعادلانه - 7 کاملاً عادلانه)", 1, 7)
69
+ transparency = st.slider("چقدر توضیحات ارائه شده در مورد قیمت را شفاف می‌دانید؟ (1 کاملاً نامشخص - 7 کاملاً شفاف)", 1, 7)
70
+ satisfaction = st.slider("چقدر از این قیمت‌گذاری راضی هستید؟ (1 کاملاً ناراضی - 7 کاملاً راضی)", 1, 7)
71
+
72
+ return {
73
+ "fairness": fairness,
74
+ "transparency": transparency,
75
+ "satisfaction": satisfaction
76
+ }
77
+
78
+
79
+ # ========== تنظیمات دیتا ==========
80
+ SHEET_ID = "1mmdWAyOCYq4yXMgP53Duq712AnlqZWLkfIo76JqM7wM"
81
+ SHEET_NAME = "Condition1"
82
+
83
+ # ========== توابع ==========
84
+ def get_credentials():
85
+ """دریافت اعتبارنامه از Secrets"""
86
+ try:
87
+ # دریافت اطلاعات از secrets Hugging Face
88
+ service_account_json = os.environ.get('GCP_SERVICE_ACCOUNT')
89
+
90
+ if not service_account_json:
91
+ st.error("مقدار GCP_SERVICE_ACCOUNT در محیط یافت نشد")
92
+ return None
93
+
94
+ # تبدیل رشته JSON به دیکشنری
95
+ service_account_info = json.loads(service_account_json)
96
+
97
+ # ایجاد اعتبارنامه
98
+ creds = Credentials.from_service_account_info(
99
+ service_account_info,
100
+ scopes=[
101
+ "https://www.googleapis.com/auth/spreadsheets",
102
+ "https://www.googleapis.com/auth/drive.file"
103
+ ]
104
+ )
105
+ return creds
106
+ except Exception as e:
107
+ st.error(f"خطا در دریافت اعتبارنامه: {str(e)}")
108
+ return None
109
+
110
+
111
+
112
+
113
+
114
+
115
+ # ========== ذخیره در Google Sheets ==========
116
+
117
+ def save_to_sheet(data):
118
+ try:
119
+ creds = get_credentials()
120
+ if not creds:
121
+ return False
122
+
123
+ client = gspread.authorize(creds)
124
+ spreadsheet = client.open_by_key(SHEET_ID)
125
+ worksheet = spreadsheet.worksheet(SHEET_NAME)
126
+
127
+ row_data = [
128
+ datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
129
+ data.get("scenario"),
130
+ data.get("age"),
131
+ data.get("gender"),
132
+ data.get("education"),
133
+ data.get("ride_frequency"),
134
+ data.get("fairness"),
135
+ data.get("transparency"),
136
+ data.get("satisfaction"))
137
+ ]
138
+
139
+ worksheet.append_row(row_data)
140
+ return True
141
+
142
+ except Exception as e:
143
+ st.error(f"خطا در ذخیره‌سازی: {str(e)}")
144
+ return False
145
+
146
+
147
+
148
+
149
+ # ========== اجرای اصلی برنامه ==========
150
+ def main():
151
+ if 'current_scenario' not in st.session_state:
152
+ st.session_state.current_scenario = random.choice(list(SCENARIOS.keys()))
153
+
154
+ scenario = SCENARIOS[st.session_state.current_scenario]
155
+
156
+ st.title(scenario["title"])
157
+ show_map()
158
+ st.markdown(scenario["description"])
159
+
160
+ demographic_data = get_demographic_data()
161
+
162
+ if demographic_data:
163
+ fairness_data = fairness_questionnaire()
164
+
165
+ if st.button("ارسال پاسخ‌ها"):
166
+ all_data = {
167
+ "scenario": st.session_state.current_scenario,
168
+ **demographic_data,
169
+ **fairness_data
170
+ }
171
+
172
+ if save_to_sheet(all_data):
173
+ st.success("پاسخ‌های شما با موفقیت ثبت شد. با تشکر از مشارکت شما!")
174
+ st.session_state.clear()
175
+ st.rerun()
176
+
177
+ if __name__ == "__main__":
178
+ main()