Source code for src.openCHA.tasks.affect.activity_analysis

"""
Affect - Physical activity analysis
"""
import json
from io import StringIO
from typing import Any
from typing import List

import pandas as pd
from openCHA.tasks.affect import Affect


[docs] class ActivityAnalysis(Affect): """ **Description:** This tasks performs average, sum, or trend analysis on the provided raw activity affect data for specific patient. """ name: str = "affect_activity_analysis" chat_name: str = "AffectActivityAnalysis" description: str = ( "When a request for analysis of physical activity data is received (such as calculating averages, sums, or identifying trends), " "call this analysis tool. This tool is specifically designed to handle complex data computations on physical activity records, " "ensuring precise and reliable results. Example: If the data spans a year and the user seeks an average activity level, " "this tool will calculate the yearly average." ) dependencies: List[str] = ["affect_activity_get"] inputs: List[str] = [ "You should provide the data source, which is in form of datapipe:datapipe_key " "the datapipe_key should be extracted from the result of previous actions.", "the analysis type which is one of **average**, **sum**, or **trend**.", ] outputs: List[str] = [ "returns an array of json objects which contains the following keys:" "\n**steps_count**: is the total number of steps registered during the day." "\n**rest_time**: is the time (in minutes) during the day spent resting, i.e. sleeping or lying down.", "\n**inactive_time**: is the time (in minutes) during the day spent resting, i.e. sitting or standing still.", "\n**low_acitivity_time** is the (in minutes) during the day with low intensity activity (e.g. household work).", "\n**medimum_acitivity_time** is the (in minutes) during the day with medium intensity activity (e.g. walking).", "\n**high_acitivity_time** is the (in minutes) during the day with high intensity activity (e.g. running).", ] # False if the output should directly passed back to the planner. # True if it should be stored in datapipe output_type: bool = True
[docs] def _execute( self, inputs: List[Any] = None, ) -> str: try: df = pd.read_json( StringIO(inputs[0]["data"].strip()), orient="records" ) except Exception as e: print(f"An error occurred: {e}") return json.loads( '{"Data": "No data for the selected date(s)!"}' ) if df.empty: return json.loads( '{"Data": "No data for the selected date(s)!"}' ) analysis_type = inputs[1].strip() if analysis_type == "average": df = df.drop("date", axis=1) # No average for date! df = df.mean().to_frame().T elif analysis_type == "sum": df = df.drop("date", axis=1) # No sum for date! df = df.sum().to_frame().T elif analysis_type == "trend": df = self._calculate_slope(df) else: raise ValueError( "The input analysis type has not been defined!" ) df = df.round(2) json_out = df.to_json(orient="records") return json_out