File size: 2,288 Bytes
49ed56c
 
 
 
 
81246cd
49ed56c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# app.py
import streamlit as st
import pandas as pd
import numpy as np

st.title("pymulantest: a batch Anthropometric Indices (27) estimator: data needed age, sex, weight, height, waist circumference, hip circumference")

# Upload a CSV file
uploaded_file = st.file_uploader("Upload your CSV file", type=["csv"])

class AnthropometricAgent:
    def __init__(self):
        self.required_cols = ['height_cm', 'weight_kg', 'age', 'sex', "wc_cm", "hip_cm"]

    def validate_input(self, df):
        missing_columns = [col for col in self.required_cols if col not in df.columns]
        if missing_columns:
            raise ValueError(f"Missing required columns: {', '.join(missing_columns)}")
        mask = (df['height_cm'].between(50, 250)) & (df['weight_kg'].between(10, 500)) & (df['age'].between(0, 120))
        if not mask.all():
            raise ValueError("Data contains unrealistic values.")
        return True

    def calculate_indices(self, df):
        df['sex'] = df['sex'].replace({'male': 0, 'female': 1, 0: 0, 1: 1}).fillna(-1).astype(int)
        if (df['sex'] == -1).any():
            raise ValueError("Invalid sex values. Use 'male', 'female', 0, or 1.")

        def bmi(w, h): return w / ((h/100) ** 2)
        def bfp(b, a, s): return (1.20 * b) + (0.23 * a) - (16.2 if s == 0 else 5.4)

        df['bmi'] = df.apply(lambda r: bmi(r['weight_kg'], r['height_cm']), axis=1)
        df['bfp'] = df.apply(lambda r: bfp(r['bmi'], r['age'], r['sex']), axis=1)
        df['whtr'] = df['wc_cm'] / df['height_cm']
        df['whr'] = df['wc_cm'] / df['hip_cm']
        df['bmi_category'] = pd.cut(df['bmi'], [0, 18.5, 25, 30, np.inf], labels=['underweight', 'normal', 'overweight', 'obese'])

        return df.round(2)

agent = AnthropometricAgent()

if uploaded_file is not None:
    try:
        df = pd.read_csv(uploaded_file)
        agent.validate_input(df)
        result_df = agent.calculate_indices(df)
        st.success("✅ Successfully processed the data!")

        st.write("### Sample of Results")
        st.dataframe(result_df.head())

        csv = result_df.to_csv(index=False).encode()
        st.download_button("Download Processed Data as CSV", csv, "processed_data.csv", "text/csv")

    except Exception as e:
        st.error(f"❌ Error: {e}")