Biofuel-Optimiser / fame /csv_utils.py
carrotcake3's picture
Update fame/csv_utils.py
3698e26 verified
import pandas as pd
from fame.config import all_training_fames
# -----------------------------
# Detect unsupported FAME columns
# -----------------------------
def detect_unsupported_fames(df):
"""
Identify uploaded FAME columns that were not used during model training.
Any column containing ':' is treated as a potential FAME column.
Columns not present in the training set are flagged so users can be warned.
Returns:
List of unsupported FAME column names.
"""
uploaded_fame_cols = [c for c in df.columns if ":" in c]
return [c for c in uploaded_fame_cols if c not in all_training_fames]
# -----------------------------
# Create CSV template
# -----------------------------
def make_template_csv():
"""
Generate a blank CSV template for users.
Columns:
- Name (optional): sample identifier
- FAME columns: composition percentages
- CN (optional): measured cetane number for evaluation
Returns:
CSV file (bytes) for download.
"""
template_df = pd.DataFrame(columns=["Name"] + all_training_fames + ["CN"])
return template_df.to_csv(index=False).encode("utf-8")
# -----------------------------
# Create example CSV
# -----------------------------
def make_example_csv():
"""
Generate a small example CSV for users to test the app.
Includes:
- Sample names
- Realistic FAME compositions
- Measured CN values for evaluation mode
Missing FAME columns are automatically added as zero so that the
file matches the full training schema.
Returns:
CSV file (bytes) for download.
"""
example_df = pd.DataFrame([
{
"Name": "Neem",
"C16:0": 16.8,
"C18:0": 19.7,
"C18:1": 44.9,
"C18:2": 18.4,
"C18:3": 0.3,
"CN": 51.3
},
{
"Name": "Thevetia",
"C16:0": 15.7,
"C18:0": 10.5,
"C18:1": 61.1,
"C18:2": 5.2,
"C18:3": 7.4,
"CN": 57.5
}
])
# Ensure all training FAME columns exist (fill missing with 0).
for col in all_training_fames:
if col not in example_df.columns:
example_df[col] = 0.0
# Arrange columns in a consistent and user-friendly order.
example_df = example_df[["Name"] + all_training_fames + ["CN"]]
return example_df.to_csv(index=False).encode("utf-8")