prism-backend / src /feature_mapping.py
Penguindrum920's picture
Prepare PRISM backend for Hugging Face Spaces
7bc5fde verified
Raw
History Blame Contribute Delete
7.21 kB
class FeatureMapper:
def __init__(self):
# Mapping between patient-facing questions and the trained inference schema.
self.feature_mapping = {
"basic_info": {
"age": {
"question": "What is your age?",
"type": "numeric",
"dataset_feature": "age",
},
"sex": {
"question": "What is your biological sex?",
"type": "categorical",
"options": ["Male", "Female"],
"dataset_feature": "SEX",
"mapping": {"Male": 1, "Female": 0},
},
"education": {
"question": "Years of education completed?",
"type": "numeric",
"dataset_feature": "EDUCYRS",
},
"race": {
"question": "What is your race?",
"type": "categorical",
"options": ["White", "Black/African American", "Asian", "Other"],
"dataset_feature": "race",
"mapping": {
"White": 1,
"Black/African American": 2,
"Asian": 3,
"Other": 4,
},
},
"bmi": {
"question": "What is your BMI?",
"type": "numeric",
"dataset_feature": "BMI",
},
},
"family_history": {
"family_pd": {
"question": "Do you have any family members with Parkinson's disease?",
"type": "categorical",
"options": [
"No family history",
"First degree relative",
"Other relative",
],
"dataset_feature": "fampd",
"mapping": {
"No family history": 3,
"First degree relative": 1,
"Other relative": 2,
},
}
},
"motor_symptoms": {
"tremor": {
"question": "Tremor severity (0-4)",
"type": "numeric",
"dataset_feature": "sym_tremor",
"scale": "0-4",
},
"rigidity": {
"question": "Rigidity severity (0-4)",
"type": "numeric",
"dataset_feature": "sym_rigid",
"scale": "0-4",
},
"bradykinesia": {
"question": "Bradykinesia severity (0-4)",
"type": "numeric",
"dataset_feature": "sym_brady",
"scale": "0-4",
},
"balance": {
"question": "Postural instability severity (0-4)",
"type": "numeric",
"dataset_feature": "sym_posins",
"scale": "0-4",
},
},
"non_motor_symptoms": {
"rem_sleep": {
"question": "Do you act out dreams or have REM sleep behaviour symptoms?",
"type": "categorical",
"options": ["No", "Yes"],
"dataset_feature": "rem",
"mapping": {"No": 0, "Yes": 1},
},
"daytime_sleepiness": {
"question": "Epworth Sleepiness Scale score?",
"type": "numeric",
"dataset_feature": "ess",
"scale": "0-24",
},
"depression": {
"question": "Geriatric Depression Scale score?",
"type": "numeric",
"dataset_feature": "gds",
"scale": "0-15",
},
"anxiety": {
"question": "State-Trait Anxiety Inventory score?",
"type": "numeric",
"dataset_feature": "stai",
"scale": "20-80",
},
},
"cognitive_symptoms": {
"memory": {
"question": "MoCA score?",
"type": "numeric",
"dataset_feature": "moca",
"scale": "0-30",
},
"clock_draw": {
"question": "Clock drawing test score?",
"type": "numeric",
"dataset_feature": "clockdraw",
"scale": "0-4",
},
"bjlot": {
"question": "Benton line orientation score?",
"type": "numeric",
"dataset_feature": "bjlot",
"scale": "0-30",
},
},
}
def get_patient_questionnaire(self):
"""Generate a list of questions for patients."""
questions = []
for category in self.feature_mapping.values():
for feature in category.values():
questions.append(
{
"question": feature["question"],
"type": feature["type"],
"options": feature.get("options"),
"scale": feature.get("scale"),
}
)
return questions
def map_patient_response_to_features(self, responses):
"""Map patient responses to dataset features."""
feature_values = {}
for category in self.feature_mapping.values():
for feature_name, feature_info in category.items():
if feature_name not in responses:
continue
response = responses[feature_name]
dataset_feature = feature_info["dataset_feature"]
if "mapping" in feature_info:
mapped_value = feature_info["mapping"].get(response)
else:
mapped_value = response
if mapped_value is None:
continue
feature_values[dataset_feature] = mapped_value
if dataset_feature == "fampd":
feature_values["fampd_bin"] = 2 if mapped_value == 3 else 1
return feature_values
def main():
mapper = FeatureMapper()
questions = mapper.get_patient_questionnaire()
print("Patient Questionnaire:")
for i, q in enumerate(questions, 1):
print(f"\n{i}. {q['question']}")
if q["options"]:
print(f"Options: {', '.join(q['options'])}")
if q["scale"]:
print(f"Scale: {q['scale']}")
if __name__ == "__main__":
main()