Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -27,18 +27,66 @@ def load_data(file):
|
|
| 27 |
def get_material_stats(df):
|
| 28 |
stats = {}
|
| 29 |
total = df['weight_kg'].sum()
|
|
|
|
|
|
|
|
|
|
| 30 |
for material in df['material_type'].unique():
|
| 31 |
data = df[df['material_type'] == material]
|
|
|
|
|
|
|
| 32 |
daily_avg = data.groupby('date')['weight_kg'].sum().mean()
|
| 33 |
|
| 34 |
stats[material] = {
|
| 35 |
'total': data['weight_kg'].sum(),
|
| 36 |
'percentage': (data['weight_kg'].sum() / total) * 100,
|
| 37 |
'daily_avg': daily_avg,
|
|
|
|
| 38 |
'records': len(data)
|
| 39 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
return stats
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
def create_trend_chart(df, time_period='daily', material_filter=None):
|
| 43 |
if material_filter:
|
| 44 |
df = df[df['material_type'].isin(material_filter)]
|
|
|
|
| 27 |
def get_material_stats(df):
|
| 28 |
stats = {}
|
| 29 |
total = df['weight_kg'].sum()
|
| 30 |
+
|
| 31 |
+
total_work_days = df['date'].nunique()
|
| 32 |
+
|
| 33 |
for material in df['material_type'].unique():
|
| 34 |
data = df[df['material_type'] == material]
|
| 35 |
+
|
| 36 |
+
work_days = data['date'].nunique()
|
| 37 |
daily_avg = data.groupby('date')['weight_kg'].sum().mean()
|
| 38 |
|
| 39 |
stats[material] = {
|
| 40 |
'total': data['weight_kg'].sum(),
|
| 41 |
'percentage': (data['weight_kg'].sum() / total) * 100,
|
| 42 |
'daily_avg': daily_avg,
|
| 43 |
+
'work_days': work_days,
|
| 44 |
'records': len(data)
|
| 45 |
}
|
| 46 |
+
|
| 47 |
+
stats['_total_'] = {
|
| 48 |
+
'total': total,
|
| 49 |
+
'percentage': 100.0,
|
| 50 |
+
'daily_avg': df.groupby('date')['weight_kg'].sum().mean(),
|
| 51 |
+
'work_days': total_work_days,
|
| 52 |
+
'records': len(df)
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
return stats
|
| 56 |
|
| 57 |
+
def display_material_overview(stats):
|
| 58 |
+
st.subheader("📋 Material Overview")
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
materials = [k for k in stats.keys() if k != '_total_']
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
cols = st.columns(4)
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
for i, material in enumerate(materials):
|
| 68 |
+
if i < 3:
|
| 69 |
+
info = stats[material]
|
| 70 |
+
with cols[i]:
|
| 71 |
+
st.metric(
|
| 72 |
+
label=material.replace('_', ' ').title(),
|
| 73 |
+
value=f"{info['total']:,.0f} kg",
|
| 74 |
+
delta=f"{info['percentage']:.1f}% of total"
|
| 75 |
+
)
|
| 76 |
+
st.caption(f"Daily avg: {info['daily_avg']:,.0f} kg")
|
| 77 |
+
st.caption(f"Work days: {info['work_days']} days")
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
total_info = stats['_total_']
|
| 81 |
+
with cols[3]:
|
| 82 |
+
st.metric(
|
| 83 |
+
label="Total Production",
|
| 84 |
+
value=f"{total_info['total']:,.0f} kg",
|
| 85 |
+
delta="100% of total"
|
| 86 |
+
)
|
| 87 |
+
st.caption(f"Daily avg: {total_info['daily_avg']:,.0f} kg")
|
| 88 |
+
st.caption(f"Work days: {total_info['work_days']} days")
|
| 89 |
+
|
| 90 |
def create_trend_chart(df, time_period='daily', material_filter=None):
|
| 91 |
if material_filter:
|
| 92 |
df = df[df['material_type'].isin(material_filter)]
|