import streamlit as st import pandas as pd from datetime import datetime import plotly.express as px # Set page config st.set_page_config(page_title="مدیریت داده‌های مزارع", layout="wide") # Add custom CSS for RTL support st.markdown( """ """, unsafe_allow_html=True ) # Load CSV data @st.cache_data def load_data(): try: df = pd.read_csv('پایگاه داده.csv') return df except FileNotFoundError: st.error("فایل CSV یافت نشد. لطفا اطمینان حاصل کنید که فایل 'پایگاه داده.csv' در مسیر برنامه قرار دارد.") return pd.DataFrame() # Initialize session state if 'data' not in st.session_state: st.session_state.data = load_data() def validate_input(value, field_type): """Validate input values""" if field_type == 'numeric': try: val = float(value) if val < 0: return False, "مقدار نمی‌تواند منفی باشد" return True, val except: return False, "لطفا یک عدد معتبر وارد کنید" return True, value def calculate_growth(current_height, previous_height): """Calculate growth between weeks""" if current_height and previous_height: return current_height - previous_height return 0 # Sidebar filters st.sidebar.header("فیلترها") # Week and day selection days = ["شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه"] weeks = list(range(1, 23)) selected_day = st.sidebar.selectbox("روز هفته", days) selected_week = st.sidebar.selectbox("هفته", weeks) # Main content st.title("سیستم مدیریت داده‌های مزارع") # Create tabs for different sections tab1, tab2, tab3 = st.tabs(["ورود داده", "مشاهده داده‌ها", "نمودارها"]) with tab1: with st.form("data_entry"): col1, col2, col3 = st.columns(3) with col1: farm = st.text_input("مزرعه") channel = st.text_input("کانال") department = st.text_input("اداره") age = st.number_input("سن", min_value=0) variety = st.text_input("واریته") area = st.number_input("مساحت", min_value=0.0) sub_area = st.number_input("مساحت زیرمجموعه", min_value=0.0) group = st.text_input("گروه") with col2: station1 = st.number_input("ایستگاه 1", min_value=0.0) station2 = st.number_input("ایستگاه 2", min_value=0.0) station3 = st.number_input("ایستگاه 3", min_value=0.0) station4 = st.number_input("ایستگاه 4", min_value=0.0) station5 = st.number_input("ایستگاه 5", min_value=0.0) with col3: current_height = st.number_input("ارتفاع هفته جاری", min_value=0.0) previous_height = st.number_input("ارتفاع هفته گذشته", min_value=0.0) nitrogen = st.number_input("نیتروژن فعلی", min_value=0.0) nitrogen_std_current = st.number_input("نیتروژن استاندارد فعلی", min_value=0.0) nitrogen_prev = st.number_input("نیتروژن قبلی", min_value=0.0) nitrogen_std_prev = st.number_input("نیتروژن استاندارد قبلی", min_value=0.0) moisture = st.number_input("رطوبت غلاف فعلی", min_value=0.0) moisture_std_current = st.number_input("رطوبت استاندارد فعلی", min_value=0.0) moisture_prev = st.number_input("رطوبت غلاف قبلی", min_value=0.0) moisture_std_prev = st.number_input("رطوبت استاندارد قبلی", min_value=0.0) well1 = st.number_input("چاهک 1", min_value=0.0) well1_date = st.date_input("تاریخ قرائت 1") well2 = st.number_input("چاهک 2", min_value=0.0) well2_date = st.date_input("تاریخ قرائت 2") submitted = st.form_submit_button("ثبت اطلاعات") if submitted: # Calculate growth rate growth_rate = calculate_growth(current_height, previous_height) # Create new data entry new_data = { 'مزرعه': farm, 'کانال': channel, 'اداره': department, 'سن': age, 'واریته': variety, 'مساحت': area, 'مساحت زیرمجموعه': sub_area, 'گروه': group, 'ایستگاه 1': station1, 'ایستگاه 2': station2, 'ایستگاه 3': station3, 'ایستگاه 4': station4, 'ایستگاه 5': station5, 'ارتفاع هفته جاری': current_height, 'ارتفاع هفته گذشته': previous_height, 'رشد هفته جاری': growth_rate, 'نیتروژن فعلی': nitrogen, 'نیتروژن استاندارد فعلی': nitrogen_std_current, 'نیتروژن قبلی': nitrogen_prev, 'نیتروژن استاندارد قبلی': nitrogen_std_prev, 'رطوبت غلاف فعلی': moisture, 'رطوبت استاندارد فعلی': moisture_std_current, 'رطوبت غلاف قبلی': moisture_prev, 'رطوبت استاندارد قبلی': moisture_std_prev, 'چاهک 1': well1, 'تاریخ قرائت 1': well1_date.strftime('%Y-%m-%d'), 'چاهک 2': well2, 'تاریخ قرائت 2': well2_date.strftime('%Y-%m-%d'), } # Update session state st.session_state.data = pd.concat([ st.session_state.data, pd.DataFrame([new_data]) ], ignore_index=True) st.success("اطلاعات با موفقیت ثبت شد") st.session_state.data.to_csv('پایگاه داده.csv', index=False) with tab2: if not st.session_state.data.empty: # Add filters col1, col2 = st.columns(2) with col1: if 'اداره' in st.session_state.data.columns: dept_filter = st.multiselect( 'فیلتر بر اساس اداره', options=st.session_state.data['اداره'].unique() ) with col2: if 'واریته' in st.session_state.data.columns: variety_filter = st.multiselect( 'فیلتر بر اساس واریته', options=st.session_state.data['واریته'].unique() ) # Apply filters filtered_data = st.session_state.data.copy() if dept_filter: filtered_data = filtered_data[filtered_data['اداره'].isin(dept_filter)] if variety_filter: filtered_data = filtered_data[filtered_data['واریته'].isin(variety_filter)] # Display filtered data st.dataframe(filtered_data) # Download button csv = filtered_data.to_csv(index=False).encode('utf-8-sig') st.download_button( label="دانلود داده‌ها", data=csv, file_name="پایگاه داده.csv", mime="text/csv" ) with tab3: if not st.session_state.data.empty: # Growth trend chart st.subheader("نمودار رشد") fig1 = px.line( st.session_state.data, x='ایام هفته', y='ارتفاع هفته جاری', color='مزرعه', title='روند رشد بر اساس هفته' ) st.plotly_chart(fig1) # Station measurements comparison st.subheader("مقایسه ایستگاه‌ها") station_data = st.session_state.data[['ایستگاه 1', 'ایستگاه 2', 'ایستگاه 3', 'ایستگاه 4', 'ایستگاه 5']] fig2 = px.box(station_data, title='مقایسه اندازه‌گیری‌های ایستگاه‌ها') st.plotly_chart(fig2) # Add error handling st.error("در صورت بروز خطا، لطفا صفحه را رفرش کنید")