import gradio as gr from pipeline_classes import CreateCombinedDataFrame, ScaleXYZData, ExtractFeatures, TrainModel, ClassifyMovementData, LowPassFilter, PCAHandler from sklearn.pipeline import Pipeline #from _config import config import pandas as pd import numpy as np import joblib import json # Define pipelines combining_dataframes_pipeline = Pipeline([ #('import_data', ImportData(use_accel=True, use_reports=True, use_combined=False, use_features=False)), ('create_combined_dataframe', CreateCombinedDataFrame(time_window=None, label_columns=None)), ]) feature_extraction_pipeline = Pipeline([ #('import_data', ImportData(use_accel=False, use_reports=False, use_combined=True, use_features=False)), ('low_pass_filter', LowPassFilter(cutoff_frequency=None, sampling_rate=None, order=None)), ('scale_xyz_data', ScaleXYZData(scaler_type=None)), ('extract_features', ExtractFeatures(window_length=None, window_step_size=None, data_frequency=None, selected_domains=None, include_magnitude=None, features_label_columns=None)), ]) training_model_pipeline = Pipeline([ #('import_data', ImportData(use_accel=False, use_reports=False, use_combined=False, use_features=True)), ('pca_handler', PCAHandler(apply_pca=None, variance=None)), ('train_model', TrainModel(classifier=None, train_label= None, target=None)), ]) analyzing_data_pipeline = Pipeline([ #('import_data', ImportData(use_accel=True, use_reports=False, use_combined=False, use_features=False)), ('low_pass_filter', LowPassFilter(cutoff_frequency=None, sampling_rate=None, order=None)), ('scale_xyz_data', ScaleXYZData(scaler_type=None)), ('extract_features', ExtractFeatures(window_length=None, window_step_size=None, data_frequency=None, selected_domains=None, include_magnitude=None, features_label_columns=None)), ('classify_movement_data', ClassifyMovementData(model_file=None)), ]) complete_training_model_pipeline = Pipeline([ #('import_data', ImportData(use_accel=True, use_reports=True, use_combined=False, use_features=False)), ('create_combined_dataframe', CreateCombinedDataFrame(time_window=None, label_columns=None)), ('low_pass_filter', LowPassFilter(cutoff_frequency=None, sampling_rate=None, order=None)), ('scale_xyz_data', ScaleXYZData(scaler_type=None)), ('extract_features', ExtractFeatures(window_length=None, window_step_size=None, data_frequency=None, selected_domains=None, include_magnitude=None, features_label_columns=None)), ('pca_handler', PCAHandler(apply_pca=None, variance=None)), ('train_model', TrainModel(classifier=None, train_label= None, target=None)), ]) def execute_combine_pipeline(accel_file, report_file, time_window=None, label_columns=None ): try: # Load data files only if paths are valid accel_data = pd.read_csv(accel_file) if accel_file else None report_data = pd.read_csv(report_file) if report_file else None # Validate inputs for the selected pipeline if accel_data is None or report_data is None: return "Error: Both accelerometer and self-report data files are required for this pipeline.", None combining_dataframes_pipeline.set_params( create_combined_dataframe__time_window=time_window, create_combined_dataframe__label_columns=label_columns.split(',')) X = report_data, accel_data result = combining_dataframes_pipeline.fit_transform(X) output_file = "combine_dataframes_output.csv" result.to_csv(output_file, index=False) return output_file except Exception as e: print(f"Error occurred: {str(e)}") return str(e), None def execute_feature_extraction_pipeline(combined_file, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns): try: combined_data = pd.read_csv(combined_file) if combined_file else None if combined_data is None: return "Error: Combined data file is required for this pipeline.", None feature_extraction_pipeline.set_params( low_pass_filter__cutoff_frequency=cutoff_frequency, low_pass_filter__order=order, low_pass_filter__sampling_rate=data_frequency, scale_xyz_data__scaler_type=scaler_type, extract_features__window_length=window_length, extract_features__window_step_size=window_step_size, extract_features__data_frequency=data_frequency, #extract_features__selected_domains=None, extract_features__include_magnitude=include_magnitude, extract_features__features_label_columns=features_label_columns.split(',')) result = feature_extraction_pipeline.fit_transform(combined_data) output_file = "extract_features_output.csv" result.to_csv(output_file, index=False) return output_file except Exception as e: print(f"Error occurred: {str(e)}") return str(e) def execute_training_pipeline(features_file, apply_pca, pca_variance, classifier, train_label, target): try: print(f"features_file: {features_file}") features_data = pd.read_csv(features_file) if features_file else None if features_data is None: return "Error: Features data file is required for this pipeline.", None training_model_pipeline.set_params( pca_handler__apply_pca=apply_pca, pca_handler__variance=pca_variance, train_model__classifier=classifier, train_model__train_label=train_label, train_model__target=target) X = features_data training_model_pipeline.fit(X) output_file, secondary_output_file = training_model_pipeline.named_steps['train_model'].get_output_files() return output_file, secondary_output_file except Exception as e: print(f"Error occurred: {str(e)}") return str(e), None def execute_analyze_pipeline(accel_file, model_file, cutoff_frequency, order, scaler_type, window_length, data_frequency, include_magnitude, features_label_columns): try: accel_data = pd.read_csv(accel_file) if accel_file else None if accel_data is None: return "Error: Accelerometer data file is required for this pipeline.", None analyzing_data_pipeline.set_params( low_pass_filter__cutoff_frequency=cutoff_frequency, low_pass_filter__order=order, low_pass_filter__sampling_rate=data_frequency, scale_xyz_data__scaler_type=scaler_type, extract_features__window_length=window_length, extract_features__window_step_size=window_length, extract_features__data_frequency=data_frequency, #extract_features__selected_domains=None, extract_features__include_magnitude=include_magnitude, extract_features__features_label_columns=features_label_columns.split(','), classify_movement_data__model_file=model_file.name ) result = analyzing_data_pipeline.fit_transform(accel_data) output_file = "analyze_data_output.csv" result.to_csv(output_file, index=False) return output_file except Exception as e: print(f"Error occurred: {str(e)}") return str(e), None def execute_complete_training_pipeline(accel_file, report_file, time_window, label_columns, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns, apply_pca, pca_variance, classifier, train_label, target): try: accel_data = pd.read_csv(accel_file) if accel_file else None report_data = pd.read_csv(report_file) if report_file else None if accel_data is None or report_data is None: return "Error: Both accelerometer and self-report data files are required for this pipeline.", None complete_training_model_pipeline.set_params( create_combined_dataframe__time_window=time_window, create_combined_dataframe__label_columns=label_columns.split(','), low_pass_filter__cutoff_frequency=cutoff_frequency, low_pass_filter__order=order, low_pass_filter__sampling_rate=data_frequency, scale_xyz_data__scaler_type=scaler_type, extract_features__window_length=window_length, extract_features__window_step_size=window_step_size, extract_features__data_frequency=data_frequency, #extract_features__selected_domains=None, extract_features__include_magnitude=include_magnitude, extract_features__features_label_columns=label_columns.split(','), pca_handler__apply_pca=apply_pca, pca_handler__variance=pca_variance, train_model__classifier=classifier, train_model__train_label=label_columns, train_model__target=target ) X = report_data, accel_data complete_training_model_pipeline.fit(X) output_file, secondary_output_file = complete_training_model_pipeline.named_steps['train_model'].get_output_files() return output_file, secondary_output_file except Exception as e: print(f"Error occurred: {str(e)}") return str(e), None # Gradio Blocks Interface with gr.Blocks() as demo: with gr.Tabs(): with gr.TabItem("Combine DataFrames"): accel_file = gr.File(label="Upload Accelerometer Data") report_file = gr.File(label="Upload Self-Report Data") time_window = gr.Number(label="Time Window (minutes)", value=2) label_columns = gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") combine_button = gr.Button("Combine DataFrames") combine_output = gr.File(label="Download Combined DataFrame") def combine_dataframes(accel_file, report_file, time_window, label_columns): output_file = execute_combine_pipeline(accel_file, report_file, time_window, label_columns) return output_file combine_button.click(combine_dataframes, inputs=[accel_file, report_file, time_window, label_columns], outputs=combine_output) with gr.TabItem("Extract Features"): combined_file = gr.File(label="Upload Combined Data") cutoff_frequency = gr.Number(label="Cutoff Frequency (Hz)", value=10) order = gr.Number(label="Order", value=4) scaler_type = gr.Radio(label="Scaler Type", choices=["standard", "minmax"]) window_length = gr.Number(label="Window Length (seconds)", value=60) window_step_size = gr.Number(label="Window Step Size (seconds)", value=20) data_frequency = gr.Number(label="Data Frequency (Hz)", value=25) #selected_domains= gr.Textbox(label="Only these domains (Comma-Seperated) / If you want all then leave out", value=None) include_magnitude= gr.Checkbox(label="Include Magnitude", value=True) features_label_columns= gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") extract_button = gr.Button("Extract Features") extract_output = gr.File(label="Download Extracted Features") def extract_features(combined_file, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns): output_file = execute_feature_extraction_pipeline(combined_file, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns ) return output_file extract_button.click(extract_features, inputs=[combined_file, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns], outputs=extract_output) with gr.TabItem("Train Model"): features_file = gr.File(label="Upload Features Data") apply_pca = gr.Checkbox(label="Apply PCA", value=False) pca_variance = gr.Number(label="PCA Variance", value=0.95) classifier = gr.Dropdown(label="Classifier", choices=["xgboost", "svm", "randomforest"], value="xgboost") train_label = gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") target = gr.Textbox(label="Target Label", value="arousal") train_button = gr.Button("Train Model") train_output_json = gr.File(label="Download Model PKL") train_output_pkl = gr.File(label="Download Model JSON") def train_model(features_file, apply_pca, pca_variance, classifier, train_label, target): output_file, secondary_output_file = execute_training_pipeline(features_file, apply_pca, pca_variance, classifier, train_label, target) return output_file, secondary_output_file train_button.click(train_model, inputs=[features_file, apply_pca, pca_variance, classifier, train_label, target], outputs=[train_output_json, train_output_pkl]) with gr.TabItem("Analyze Data"): accel_file = gr.File(label="Upload Accelerometer Data") model_file = gr.File(label="Upload Model") cutoff_frequency = gr.Number(label="Cutoff Frequency (Hz)", value=10) order = gr.Number(label="Order", value=4) scaler_type = gr.Radio(label="Scaler Type", choices=["standard", "minmax"]) window_length = gr.Number(label="Window Length (seconds)", value=60) data_frequency = gr.Number(label="Data Frequency (Hz)", value=25) #selected_domains= gr.Textbox(label="Only these domains (Comma-Seperated) / If you want all then leave out", value=None) include_magnitude= gr.Checkbox(label="Include Magnitude", value=True) features_label_columns= gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") analyze_button = gr.Button("Analyze Data") analyze_output = gr.File(label="Download Analyzed Data") def analyze_data(accel_file, model_file, cutoff_frequency, order, scaler_type, window_length, data_frequency, include_magnitude, features_label_columns): output_file = execute_analyze_pipeline(accel_file, model_file, cutoff_frequency, order, scaler_type, window_length, data_frequency, include_magnitude, features_label_columns) return output_file analyze_button.click(analyze_data, inputs=[accel_file, model_file, cutoff_frequency, order, scaler_type, window_length, data_frequency, include_magnitude, features_label_columns ], outputs=analyze_output) with gr.TabItem("Complete Train Model"): accel_file = gr.File(label="Upload Accelerometer Data") report_file = gr.File(label="Upload Self-Report Data") time_window = gr.Number(label="Time Window (minutes)", value=2) label_columns = gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") cutoff_frequency = gr.Number(label="Cutoff Frequency (Hz)", value=10) order = gr.Number(label="Order", value=4) scaler_type = gr.Radio(label="Scaler Type", choices=["standard", "minmax"]) window_length = gr.Number(label="Window Length (seconds)", value=60) window_step_size = gr.Number(label="Window Step Size (seconds)", value=20) data_frequency = gr.Number(label="Data Frequency (Hz)", value=25) include_magnitude= gr.Checkbox(label="Include Magnitude", value=True) #features_label_columns= gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") apply_pca = gr.Checkbox(label="Apply PCA", value=False) pca_variance = gr.Number(label="PCA Variance", value=0.95) classifier = gr.Dropdown(label="Classifier", choices=["xgboost", "svm", "randomforest"], value="xgboost") #train_label = gr.Textbox(label="Label Columns (comma-separated)", value="valence,arousal") target = gr.Textbox(label="Target Label", value="arousal") complete_train_button = gr.Button("Complete Train Model") complete_train_output_pkl = gr.File(label="Download Model PKL") complete_train_output_json = gr.File(label="Download Model JSON") def complete_train_model(accel_file, report_file, time_window, label_columns, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns, apply_pca, pca_variance, classifier, train_label, target): output_file, secondary_output_file = execute_complete_training_pipeline(accel_file, report_file, time_window, label_columns, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns, apply_pca, pca_variance, classifier, train_label, target) return output_file, secondary_output_file complete_train_button.click(complete_train_model, inputs=[accel_file, report_file, time_window, label_columns, cutoff_frequency, order, scaler_type, window_length, window_step_size, data_frequency, include_magnitude, features_label_columns, apply_pca, pca_variance, classifier, train_label, target], outputs=[complete_train_output_pkl, complete_train_output_json]) demo.launch()