Esmaeilkianii commited on
Commit
22184e7
·
verified ·
1 Parent(s): 51e3217

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +168 -175
app.py CHANGED
@@ -1,12 +1,14 @@
1
  import streamlit as st
2
  import pandas as pd
3
- from datetime import datetime
4
  import plotly.express as px
 
 
 
5
 
6
  # Set page config
7
  st.set_page_config(page_title="مدیریت داده‌های مزارع", layout="wide")
8
 
9
- # Add custom CSS for RTL support
10
  st.markdown(
11
  """
12
  <style>
@@ -16,213 +18,204 @@ st.markdown(
16
  direction: rtl;
17
  font-family: 'Vazirmatn', sans-serif;
18
  }
19
- .stSelectbox, .stMultiSelect, .stDateInput {
20
  direction: rtl;
 
21
  }
22
  div[data-testid="stDataFrame"] {
23
  direction: rtl;
24
  }
25
- .stTextInput > div > div > input {
26
  direction: rtl;
27
  text-align: right;
28
  }
29
- button, .stMarkdown {
30
- direction: rtl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  text-align: right;
32
  }
 
 
 
 
 
 
 
 
 
33
  </style>
34
  """, unsafe_allow_html=True
35
  )
36
 
37
- # Load CSV data
38
  @st.cache_data
39
  def load_data():
40
  try:
41
- df = pd.read_csv('پایگاه داده.csv')
42
- return df
43
  except FileNotFoundError:
44
- st.error("فایل CSV یافت نشد. لطفا اطمینان حاصل کنید که فایل 'پایگاه داده.csv' در مسیر برنامه قرار دارد.")
45
- return pd.DataFrame()
 
 
 
46
 
47
  # Initialize session state
48
  if 'data' not in st.session_state:
49
  st.session_state.data = load_data()
50
 
51
- def validate_input(value, field_type):
52
- """Validate input values"""
53
- if field_type == 'numeric':
54
- try:
55
- val = float(value)
56
- if val < 0:
57
- return False, "مقدار نمی‌تواند منفی باشد"
58
- return True, val
59
- except:
60
- return False, "لطفا یک عدد معتبر وارد کنید"
61
- return True, value
62
-
63
- def calculate_growth(current_height, previous_height):
64
- """Calculate growth between weeks"""
65
- if current_height and previous_height:
66
- return current_height - previous_height
67
- return 0
68
-
69
- # Sidebar filters
70
- st.sidebar.header("فیلترها")
71
-
72
- # Week and day selection
73
  days = ["شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه"]
74
- weeks = list(range(1, 23))
75
-
76
  selected_day = st.sidebar.selectbox("روز هفته", days)
77
- selected_week = st.sidebar.selectbox("هفته", weeks)
78
-
79
- # Main content
80
- st.title("سیستم مدیریت داده‌های مزارع")
81
 
82
- # Create tabs for different sections
83
- tab1, tab2, tab3 = st.tabs(["ورود داده", "مشاهده داده‌ها", "نمودارها"])
84
 
85
  with tab1:
86
- with st.form("data_entry"):
87
- col1, col2, col3 = st.columns(3)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- with col1:
90
- farm = st.text_input("مزرعه")
91
- channel = st.text_input("کانال")
92
- department = st.text_input("اداره")
93
- age = st.number_input("سن", min_value=0)
94
- variety = st.text_input("واریته")
95
- area = st.number_input("مساحت", min_value=0.0)
96
- sub_area = st.number_input("مساحت زیرمجموعه", min_value=0.0)
97
- group = st.text_input("گروه")
98
-
99
- with col2:
100
- station1 = st.number_input("ایستگاه 1", min_value=0.0)
101
- station2 = st.number_input("ایستگاه 2", min_value=0.0)
102
- station3 = st.number_input("ایستگاه 3", min_value=0.0)
103
- station4 = st.number_input("ایستگاه 4", min_value=0.0)
104
- station5 = st.number_input("ایستگاه 5", min_value=0.0)
105
-
106
- with col3:
107
- current_height = st.number_input("ارتفاع هفته جاری", min_value=0.0)
108
- previous_height = st.number_input("ارتفاع هفته گذشته", min_value=0.0)
109
- nitrogen = st.number_input("نیتروژن فعلی", min_value=0.0)
110
- nitrogen_std_current = st.number_input("نیتروژن استاندارد فعلی", min_value=0.0)
111
- nitrogen_prev = st.number_input("نیتروژن قبلی", min_value=0.0)
112
- nitrogen_std_prev = st.number_input("نیتروژن استاندارد قبلی", min_value=0.0)
113
- moisture = st.number_input("رطوبت غلاف فعلی", min_value=0.0)
114
- moisture_std_current = st.number_input("رطوبت استاندارد فعلی", min_value=0.0)
115
- moisture_prev = st.number_input("رطوبت غلاف قبلی", min_value=0.0)
116
- moisture_std_prev = st.number_input("رطوبت استاندارد قبلی", min_value=0.0)
117
- well1 = st.number_input("چاهک 1", min_value=0.0)
118
- well1_date = st.date_input("تاریخ قرائت 1")
119
- well2 = st.number_input("چاهک 2", min_value=0.0)
120
- well2_date = st.date_input("تاریخ قرائت 2")
121
-
122
-
123
- submitted = st.form_submit_button("ثبت اطلاعات")
124
 
125
- if submitted:
126
- # Calculate growth rate
127
- growth_rate = calculate_growth(current_height, previous_height)
128
-
129
- # Create new data entry
130
- new_data = {
131
- 'مزرعه': farm,
132
- 'کانال': channel,
133
- 'اداره': department,
134
- 'سن': age,
135
- 'واریته': variety,
136
- 'مساحت': area,
137
- 'مساحت زیرمجموعه': sub_area,
138
- 'گروه': group,
139
- 'ایستگاه 1': station1,
140
- 'ایستگاه 2': station2,
141
- 'ایستگاه 3': station3,
142
- 'ایستگاه 4': station4,
143
- 'ایستگاه 5': station5,
144
- 'ارتفاع هفته جاری': current_height,
145
- 'ارتفاع هفته گذشته': previous_height,
146
- 'رشد هفته جاری': growth_rate,
147
- 'نیتروژن فعلی': nitrogen,
148
- 'نیتروژن استاندارد فعلی': nitrogen_std_current,
149
- 'نیتروژن قبلی': nitrogen_prev,
150
- 'نیتروژن استاندارد قبلی': nitrogen_std_prev,
151
- 'رطوبت غلاف فعلی': moisture,
152
- 'رطوبت استاندارد فعلی': moisture_std_current,
153
- 'رطوبت غلاف قبلی': moisture_prev,
154
- 'رطوبت استاندارد قبلی': moisture_std_prev,
155
- 'چاهک 1': well1,
156
- 'تاریخ قرائت 1': well1_date.strftime('%Y-%m-%d'),
157
- 'چاهک 2': well2,
158
- 'تاریخ قرائت 2': well2_date.strftime('%Y-%m-%d'),
159
- }
160
-
161
- # Update session state
162
- st.session_state.data = pd.concat([
163
- st.session_state.data,
164
- pd.DataFrame([new_data])
165
- ], ignore_index=True)
166
-
167
- st.success("اطلاعات با موفقیت ثبت شد")
168
- st.session_state.data.to_csv('پایگاه داده.csv', index=False)
169
 
170
  with tab2:
171
  if not st.session_state.data.empty:
172
- # Add filters
 
173
  col1, col2 = st.columns(2)
174
- with col1:
175
- if 'اداره' in st.session_state.data.columns:
176
- dept_filter = st.multiselect(
177
- 'فیلتر بر اساس اداره',
178
- options=st.session_state.data['اداره'].unique()
179
- )
180
 
181
- with col2:
182
- if 'واریته' in st.session_state.data.columns:
183
- variety_filter = st.multiselect(
184
- 'فیلتر بر اساس واریته',
185
- options=st.session_state.data['واریته'].unique()
186
- )
187
-
188
- # Apply filters
189
- filtered_data = st.session_state.data.copy()
190
- if dept_filter:
191
- filtered_data = filtered_data[filtered_data['اداره'].isin(dept_filter)]
192
- if variety_filter:
193
- filtered_data = filtered_data[filtered_data['واریته'].isin(variety_filter)]
194
 
195
- # Display filtered data
196
- st.dataframe(filtered_data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
 
198
- # Download button
199
- csv = filtered_data.to_csv(index=False).encode('utf-8-sig')
200
- st.download_button(
201
- label="دانلود داده‌ها",
202
- data=csv,
203
- file_name="پایگاه داده.csv",
204
- mime="text/csv"
205
- )
206
-
207
- with tab3:
208
- if not st.session_state.data.empty:
209
- # Growth trend chart
210
- st.subheader("نمودار رشد")
211
- fig1 = px.line(
212
- st.session_state.data,
213
- x='ایام هفته',
214
- y='ارتفاع هفته جاری',
215
- color='مزرعه',
216
- title='روند رشد بر اساس هفته'
217
- )
218
- st.plotly_chart(fig1)
219
-
220
- # Station measurements comparison
221
- st.subheader("مقایسه ایستگاه‌ها")
222
- station_data = st.session_state.data[['ایستگاه 1', 'ایستگاه 2', 'ایستگاه 3', 'ایستگاه 4', 'ایستگاه 5']]
223
- fig2 = px.box(station_data, title='مقایسه اندازه‌گیری‌های ایستگاه‌ها')
224
- st.plotly_chart(fig2)
225
-
226
- # Add error handling
227
- st.error("در صورت بروز خطا، لطفا صفحه را رفرش کنید")
228
-
 
1
  import streamlit as st
2
  import pandas as pd
 
3
  import plotly.express as px
4
+ import plotly.graph_objects as go
5
+ import numpy as np
6
+ from datetime import datetime
7
 
8
  # Set page config
9
  st.set_page_config(page_title="مدیریت داده‌های مزارع", layout="wide")
10
 
11
+ # Add custom CSS for RTL support and table styling
12
  st.markdown(
13
  """
14
  <style>
 
18
  direction: rtl;
19
  font-family: 'Vazirmatn', sans-serif;
20
  }
21
+ .stSelectbox, .stMultiSelect, .stTextInput > div > div > input {
22
  direction: rtl;
23
+ text-align: right;
24
  }
25
  div[data-testid="stDataFrame"] {
26
  direction: rtl;
27
  }
28
+ button, .stMarkdown {
29
  direction: rtl;
30
  text-align: right;
31
  }
32
+ .styled-table {
33
+ width: 100%;
34
+ border-collapse: collapse;
35
+ margin: 25px 0;
36
+ font-size: 0.9em;
37
+ font-family: 'Vazirmatn', sans-serif;
38
+ min-width: 400px;
39
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
40
+ }
41
+ .styled-table thead tr {
42
+ background-color: #009879;
43
+ color: #ffffff;
44
+ text-align: right;
45
+ }
46
+ .styled-table th,
47
+ .styled-table td {
48
+ padding: 12px 15px;
49
  text-align: right;
50
  }
51
+ .styled-table tbody tr {
52
+ border-bottom: 1px solid #dddddd;
53
+ }
54
+ .styled-table tbody tr:nth-of-type(even) {
55
+ background-color: #f3f3f3;
56
+ }
57
+ .styled-table tbody tr:last-of-type {
58
+ border-bottom: 2px solid #009879;
59
+ }
60
  </style>
61
  """, unsafe_allow_html=True
62
  )
63
 
64
+ # Load CSV file
65
  @st.cache_data
66
  def load_data():
67
  try:
68
+ data = pd.read_csv('پایگاه داده.csv')
69
+ return data
70
  except FileNotFoundError:
71
+ return pd.DataFrame({
72
+ 'ردیف': [], 'کد نماینده': [], 'کانال': [], 'ادار': [],
73
+ 'تولید': [], 'مساحت': [], 'مساحت زیرمجموعه': [],
74
+ 'واریته': [], 'سن': [], 'ایام هفته': [], 'هفته': []
75
+ })
76
 
77
  # Initialize session state
78
  if 'data' not in st.session_state:
79
  st.session_state.data = load_data()
80
 
81
+ # Sidebar - Day and Week selection
82
+ st.sidebar.header("انتخاب روز و هفته")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  days = ["شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه"]
 
 
84
  selected_day = st.sidebar.selectbox("روز هفته", days)
85
+ selected_week = st.sidebar.selectbox("هفته", range(1, 23))
 
 
 
86
 
87
+ # Create tabs
88
+ tab1, tab2 = st.tabs(["ورود داده", "مشاهده و تحلیل داده‌ها"])
89
 
90
  with tab1:
91
+ st.header(f"ورود داده‌ها - هفته {selected_week} - {selected_day}")
92
+
93
+ # Filter data for selected day and week
94
+ filtered_data = st.session_state.data[
95
+ (st.session_state.data['ایام هفته'] == selected_day) &
96
+ (st.session_state.data['هفته'] == selected_week)
97
+ ] if not st.session_state.data.empty else pd.DataFrame()
98
+
99
+ # Create form for data entry
100
+ with st.form("data_entry_form"):
101
+ # Convert DataFrame to HTML table with input fields
102
+ table_html = """
103
+ <table class="styled-table">
104
+ <thead>
105
+ <tr>
106
+ <th>ردیف</th>
107
+ <th>کد نماینده</th>
108
+ <th>کانال</th>
109
+ <th>ادار</th>
110
+ <th>تولید</th>
111
+ <th>مساحت</th>
112
+ <th>واریته</th>
113
+ <th>سن</th>
114
+ <th>ایستگاه 1</th>
115
+ <th>ایستگاه 2</th>
116
+ <th>ایستگاه 3</th>
117
+ <th>ایستگاه 4</th>
118
+ <th>ایستگاه 5</th>
119
+ </tr>
120
+ </thead>
121
+ <tbody>
122
+ """
123
 
124
+ for idx, row in filtered_data.iterrows():
125
+ table_html += f"""
126
+ <tr>
127
+ <td>{row['ردیف']}</td>
128
+ <td>{row['کد نماینده']}</td>
129
+ <td>{row['کانال']}</td>
130
+ <td>{row['ادار']}</td>
131
+ <td>{row['تولید']}</td>
132
+ <td>{row['مساحت']}</td>
133
+ <td>{row['واریته']}</td>
134
+ <td>{row['سن']}</td>
135
+ <td><input type="number" name="station1_{idx}" /></td>
136
+ <td><input type="number" name="station2_{idx}" /></td>
137
+ <td><input type="number" name="station3_{idx}" /></td>
138
+ <td><input type="number" name="station4_{idx}" /></td>
139
+ <td><input type="number" name="station5_{idx}" /></td>
140
+ </tr>
141
+ """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
+ table_html += "</tbody></table>"
144
+
145
+ st.markdown(table_html, unsafe_allow_html=True)
146
+ submitted = st.form_submit_button("ثبت اطلاعات")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
  with tab2:
149
  if not st.session_state.data.empty:
150
+ st.header("تحلیل داده‌ها")
151
+
152
  col1, col2 = st.columns(2)
 
 
 
 
 
 
153
 
154
+ with col1:
155
+ # Growth trend analysis
156
+ st.subheader("روند رشد")
157
+ fig_growth = px.line(
158
+ st.session_state.data,
159
+ x='هفته',
160
+ y='ارتفاع هفته جاری',
161
+ color='کانال',
162
+ title='روند رشد بر اساس هفته'
163
+ )
164
+ st.plotly_chart(fig_growth)
 
 
165
 
166
+ with col2:
167
+ # 3D surface plot
168
+ st.subheader("نمودار سطح سه‌بعدی رشد")
169
+ fig_3d = go.Figure(data=[go.Surface(
170
+ z=st.session_state.data.pivot_table(
171
+ values='ارتفاع هفته جاری',
172
+ index='هفته',
173
+ columns='کانال'
174
+ ).values,
175
+ colorscale='Viridis'
176
+ )])
177
+ fig_3d.update_layout(
178
+ scene=dict(
179
+ xaxis_title='هفته',
180
+ yaxis_title='کانال',
181
+ zaxis_title='ارتفاع'
182
+ ),
183
+ title='نمودار سه‌بعدی رشد'
184
+ )
185
+ st.plotly_chart(fig_3d)
186
+
187
+ # Statistics
188
+ st.subheader("آمار و تحلیل")
189
+ col3, col4, col5 = st.columns(3)
190
 
191
+ with col3:
192
+ st.metric(
193
+ "بیشترین رشد",
194
+ f"{st.session_state.data['رشد هفته جاری'].max():.2f}"
195
+ )
196
+
197
+ with col4:
198
+ st.metric(
199
+ "کمترین رشد",
200
+ f"{st.session_state.data['رشد هفته جاری'].min():.2f}"
201
+ )
202
+
203
+ with col5:
204
+ st.metric(
205
+ "میانگین رشد",
206
+ f"{st.session_state.data['رشد هفته جاری'].mean():.2f}"
207
+ )
208
+
209
+ # Detailed data table
210
+ st.subheader("جدول داده‌های کامل")
211
+ st.dataframe(st.session_state.data)
212
+
213
+ # Download button for updated data
214
+ if st.button("دانلود فایل CSV"):
215
+ csv = st.session_state.data.to_csv(index=False).encode('utf-8-sig')
216
+ st.download_button(
217
+ label="دانلود",
218
+ data=csv,
219
+ file_name="پایگاه داده.csv",
220
+ mime="text/csv"
221
+ )