Analysiszaliai / app.py
Esmaeilkianii's picture
Update app.py
51e3217 verified
raw
history blame
9.13 kB
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(
"""
<style>
@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap');
.main {
direction: rtl;
font-family: 'Vazirmatn', sans-serif;
}
.stSelectbox, .stMultiSelect, .stDateInput {
direction: rtl;
}
div[data-testid="stDataFrame"] {
direction: rtl;
}
.stTextInput > div > div > input {
direction: rtl;
text-align: right;
}
button, .stMarkdown {
direction: rtl;
text-align: right;
}
</style>
""", 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("در صورت بروز خطا، لطفا صفحه را رفرش کنید")