Spaces:
Sleeping
Sleeping
import re | |
import json | |
from typing import Optional | |
import pandas as pd | |
import simplejson | |
def json_to_dict(response: str) -> dict: | |
"""Convert a JSON string to a Python dictionary. | |
Args: | |
response (str): JSON string to convert. | |
Returns: | |
dict: Parsed JSON as a dictionary. | |
Raises: | |
ValueError: If the JSON string is invalid. | |
""" | |
# extract dict from json | |
try: | |
match = re.search(r"\{.*}", response, re.DOTALL) | |
if match is None: | |
raise ValueError("No valid JSON found in the response.") | |
match_response = match.group() | |
match_response = json.loads(match_response) | |
except json.JSONDecodeError: | |
try: | |
match_response = simplejson.loads(response) # More forgiving JSON parser | |
except simplejson.JSONDecodeError as e: | |
raise ValueError(f"Invalid JSON response: {e}") | |
return match_response # Return as a structured dictionary | |
def json_to_pandas(json_data: str, key: Optional[str] = None) -> pd.DataFrame: | |
"""Convert JSON data to a pandas DataFrame.""" | |
try: | |
dic = json_to_dict(json_data) | |
if key: | |
dic = dic[key] | |
df = pd.DataFrame(dic) | |
return df | |
except ValueError as e: | |
raise ValueError(f"Invalid JSON data: {e}") | |
def extract_and_return_data_table(chat_output, key="Medications"): | |
"""Extract a pandas data frame out of the chat. | |
Try rule-based first and use LLM if it fails.""" | |
if chat_output: | |
if "content" in chat_output[-1]: | |
chat_output = chat_output[-1]["content"] | |
print(f"chat output: {chat_output}type: {type(chat_output)}") | |
try: | |
df = json_to_pandas(chat_output, key=key) | |
except ValueError as e: | |
raise ValueError(e) | |
return df | |