{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "import json\n", "from queries import (query_formularios, query_usuarios, get_macros_differences, get_min_max_mean_mode_macros_differences,\n", " clustering_esfuerzo_dieta_response, clustering_objetivo_response, clustering_entrenamiento_response,\n", " clustering_cumplimiento_dieta_response, clustering_compromiso_response, \n", " make_query)\n", "from find_matches import find_user_dates_matches, find_macros_that_match_dates_of_users\n", "from input_options import opciones_esfuerzo, opciones_objetivo, opciones_cumplimiento_entrenamiento, opciones_cumplimiento_dieta, opciones_compromiso" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "formularios_weight_difference_path = 'formularios_weight_difference'\n", "usuarios_macros_difference_path = 'usuarios_macros_difference'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Get all the files in the formularios_path\n", "files = Path(formularios_weight_difference_path).glob('*.json')\n", "files = list(files)\n", "files.sort()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "response esfuerzo dieta: No costó nada --> | no costo\n", "response cumplimiento dieta: casi perfecta --> | bien\n", "response objetivo: volumen (nada cambia) --> | volumen\n", "response entrenamiento: Lo hice perfecto --> | bien\n", "response compromiso: Bueno, pero mejorable --> | bueno\n" ] } ], "source": [ "response_esfuerzo_dieta = opciones_esfuerzo[1]\n", "response_esfuerzo_dieta_key = list(response_esfuerzo_dieta.keys())[0]\n", "response_esfuerzo_dieta_text = response_esfuerzo_dieta[response_esfuerzo_dieta_key]['text']\n", "response_esfuerzo_dieta_value = response_esfuerzo_dieta[response_esfuerzo_dieta_key]['value']\n", "\n", "response_cumplimiento_dieta = opciones_cumplimiento_dieta[3]\n", "response_cumplimiento_dieta_key = list(response_cumplimiento_dieta.keys())[0]\n", "response_cumplimiento_dieta_text = response_cumplimiento_dieta[response_cumplimiento_dieta_key]['text']\n", "response_cumplimiento_dieta_value = response_cumplimiento_dieta[response_cumplimiento_dieta_key]['value']\n", "\n", "response_objetivo = opciones_objetivo[3]\n", "response_objetivo_key = list(response_objetivo.keys())[0]\n", "response_objetivo_text = response_objetivo[response_objetivo_key]['text']\n", "response_objetivo_value = response_objetivo[response_objetivo_key]['value']\n", "\n", "response_entrenamiento = opciones_cumplimiento_entrenamiento[0]\n", "response_entrenamiento_key = list(response_entrenamiento.keys())[0]\n", "response_entrenamiento_text = response_entrenamiento[response_entrenamiento_key]['text']\n", "response_entrenamiento_value = response_entrenamiento[response_entrenamiento_key]['value']\n", "\n", "response_compromiso = opciones_compromiso[0]\n", "response_compromiso_key = list(response_compromiso.keys())[0]\n", "response_compromiso_text = response_compromiso[response_compromiso_key]['text']\n", "response_compromiso_value = response_compromiso[response_compromiso_key]['value']\n", "\n", "print(f\"response esfuerzo dieta: {response_esfuerzo_dieta_text} --> {response_esfuerzo_dieta_value}\")\n", "print(f\"response cumplimiento dieta: {response_cumplimiento_dieta_text} --> {response_cumplimiento_dieta_value}\")\n", "print(f\"response objetivo: {response_objetivo_text} --> {response_objetivo_value}\")\n", "print(f\"response entrenamiento: {response_entrenamiento_text} --> {response_entrenamiento_value}\")\n", "print(f\"response compromiso: {response_compromiso_text} --> {response_compromiso_value}\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Consulta:\n", "\tEsfuerzo para cumplir dieta: no costo\n", "\tCumplimiento dieta: bien\n", "\tObjetivo: volumen\n", "\tEntrenamiento: bien\n", "\tCompromiso: bueno\n", "\t0.5 <= Diferencia peso <= 1.0\n" ] } ], "source": [ "cluster_esfuerzo_dieta = clustering_esfuerzo_dieta_response(response_esfuerzo_dieta_value, debug=False)\n", "cluster_objetivo = clustering_objetivo_response(response_objetivo_value, debug=False)\n", "cluster_entrenamiento = clustering_entrenamiento_response(response_entrenamiento_value, debug=False)\n", "cluster_cumplimiento_dieta = clustering_cumplimiento_dieta_response(response_cumplimiento_dieta_value, debug=False)\n", "cluster_compromiso = clustering_compromiso_response(response_compromiso_value, debug=False)\n", "diff_peso_min = 0.5\n", "diff_peso_max = 1.0\n", "\n", "print(f\"Consulta:\")\n", "print(f\"\\tEsfuerzo para cumplir dieta: {cluster_esfuerzo_dieta}\")\n", "print(f\"\\tCumplimiento dieta: {cluster_cumplimiento_dieta}\")\n", "print(f\"\\tObjetivo: {cluster_objetivo}\")\n", "print(f\"\\tEntrenamiento: {cluster_entrenamiento}\")\n", "print(f\"\\tCompromiso: {cluster_compromiso}\")\n", "print(f\"\\t{diff_peso_min} <= Diferencia peso <= {diff_peso_max}\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'esfuerzoParaCumplirDieta': {'operator': 'in', 'value': 'no costo'}},\n", " {'objetivo': {'operator': 'in', 'value': 'volumen'}},\n", " {'cumplimientoEntrenamiento': {'operator': 'in', 'value': 'bien'}},\n", " {'cumplimientoDieta': {'operator': 'in', 'value': 'bien'}},\n", " {'compromiso': {'operator': 'in', 'value': 'bueno'}},\n", " {'diferencia_peso': {'operator': '<=', 'value': 1.0}},\n", " {'diferencia_peso': {'operator': '>=', 'value': 0.5}}]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "query = make_query(cluster_esfuerzo_dieta, cluster_objetivo, cluster_entrenamiento, cluster_cumplimiento_dieta, cluster_compromiso, diff_peso_min, diff_peso_max)\n", "query" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'cumplimientoEntrenamiento': {'operator': 'in', 'value': 'bien'}},\n", " {'cumplimientoDieta': {'operator': 'in', 'value': 'regular'}},\n", " {'compromiso': {'operator': 'in', 'value': 'bueno'}},\n", " {'diferencia_peso': {'operator': '<=', 'value': 0.5}},\n", " {'diferencia_peso': {'operator': '>=', 'value': 0}}]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Delete esfuerzoParaCumplirDieta from query that is element 0\n", "query.pop(0)\n", "query" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "matches_dict = find_user_dates_matches(query)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Matches (53):\n", "\tadejetenerife1978@gmail.com.json\n", "\talbertino_06@hotmail.com.json\n", "\talbertomorenoverdejo@gmail.com.json\n", "\talex1986fratila@gmail.com.json\n", "\tcarlitoscapo10@gmail.com.json\n", "\tcarlos10cuervo@gmail.com.json\n", "\tcarlos_4mejias@hotmail.com.json\n", "\tcgarciro@gmail.com.json\n", "\tchemita_888@hotmail.com.json\n", "\tcidetien@gmail.com.json\n", "\tdavid-cordobes@hotmail.com.json\n", "\tdjsiroco@hotmail.com.json\n", "\telpaquito2005@gmail.com.json\n", "\temontieligual@gmail.com.json\n", "\tfernandez.corzo.roberto@gmail.com.json\n", "\tfhuneghar@gmail.com.json\n", "\tganidia8@gmail.com.json\n", "\tguimera109@gmail.com.json\n", "\tgustavolinaresrodriguez@gmail.com.json\n", "\tismael.atlgonzalez@gmail.com.json\n", "\tj.a.guti@hotmail.es.json\n", "\tj.maureta@hotmail.com.json\n", "\tjaviermarcos@fanclima.es.json\n", "\tjesus.fdez.prieto@gmail.com.json\n", "\tjgonzalezcastro64@gmail.com.json\n", "\tjllinaresramirez@gmail.com.json\n", "\tjmatamoros.digital@gmail.com.json\n", "\tjmhernandezn@gmail.com.json\n", "\tjnunezlopez12@gmail.com.json\n", "\tjordilopezpiera@gmail.com.json\n", "\tjosemegapark@hotmail.com.json\n", "\tjuan_temprano_alvarez@hotmail.com.json\n", "\tjuaninorosal@gmail.com.json\n", "\tm.molinamotino@gmail.com.json\n", "\tmartindebustamante.daniel@googlemail.com.json\n", "\tmaximofn@gmail.com.json\n", "\tmoralesantonio21@hotmail.com.json\n", "\tmudmaniac78@yahoo.es.json\n", "\tnachoimv33@gmail.com.json\n", "\tnandete87@hotmail.com.json\n", "\tpablocarbonell9@gmail.com.json\n", "\tpaco.cadi@hotmail.com.json\n", "\tpedrosaezcarrionsp@gmail.com.json\n", "\tpericoboss@gmail.com.json\n", "\tranaval2003@yahoo.es.json\n", "\tsergio@vallesanjuan.com.json\n", "\tsoyelmata@hotmail.com.json\n", "\ttomeu.143@gmail.com.json\n", "\ttonisaaann@hotmail.com.json\n", "\tvictor_castomaic007@hotmail.com.json\n", "\tvictorcera@pm.me.json\n", "\tvillamor.inigo@gmail.com.json\n", "\tximoroach@gmail.com.json\n" ] } ], "source": [ "print(f\"Matches ({len(matches_dict)}):\")\n", "for match in matches_dict:\n", " print(f\"\\t{match}\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "macros_differences_list = find_macros_that_match_dates_of_users(matches_dict)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diferencia de macros (109):\n", "\t0 30 0 0 0 0 20 10\n", "\t0 0 10 -5 0 20 10 10\n", "\t0 40 0 0 0 10 20 10\n", "\t0 0 10 0 0 0 10 0\n", "\t0 50 0 0 10 0 40 0\n", "\t0 20 10 0 15 0 20 10\n", "\t0 40 0 0 10 0 20 0\n", "\t0 20 10 0 15 0 30 0\n", "\t0 25 0 0 0 0 20 0\n", "\t0 20 0 0 10 0 0 0\n", "\t0 20 0 0 0 0 20 0\n", "\t0 20 0 0 15 0 10 0\n", "\t0 40 0 0 15 0 40 10\n", "\t0 0 10 0 0 0 25 0\n", "\t0 20 10 0 10 0 20 0\n", "\t0 0 10 0 15 0 20 10\n", "\t0 20 0 0 0 0 10 0\n", "\t0 40 0 0 0 0 40 0\n", "\t0 10 0 0 0 0 0 10\n", "\t0 30 0 0 0 0 30 10\n", "\t0 0 10 0 5 0 10 0\n", "\t-20 10 10 -5 20 0 40 0\n", "\t10 40 0 5 10 -10 40 0\n", "\t0 -10 0 0 0 0 -10 0\n", "\t0 20 0 0 10 0 20 0\n", "\t0 20 0 0 0 0 30 0\n", "\t0 -20 -10 0 0 0 -10 0\n", "\t0 20 0 0 0 0 20 0\n", "\t10 30 0 0 0 10 0 0\n", "\t0 30 0 0 15 10 30 10\n", "\t0 40 0 0 0 0 30 10\n", "\t0 20 0 0 0 0 20 0\n", "\t0 30 0 0 15 0 30 0\n", "\t0 30 0 0 0 0 20 10\n", "\t0 0 10 0 0 0 20 0\n", "\t0 20 0 0 0 0 10 0\n", "\t0 10 0 0 0 0 20 10\n", "\t0 20 0 0 10 0 30 0\n", "\t0 20 10 0 0 0 30 0\n", "\t0 0 0 0 0 0 0 0\n", "\t0 0 0 0 0 0 25 0\n", "\t10 20 10 -5 10 5 20 10\n", "\t0 30 0 0 10 0 20 0\n", "\t0 10 0 0 10 0 10 10\n", "\t0 30 0 0 0 0 30 0\n", "\t0 20 10 0 15 0 40 0\n", "\t0 10 0 0 10 0 20 0\n", "\t0 30 10 0 0 0 20 0\n", "\t0 30 0 0 15 0 20 0\n", "\t0 0 0 0 0 0 0 0\n", "\t-30 40 10 0 10 0 20 10\n", "\t0 20 0 0 10 0 30 0\n", "\t0 -20 0 0 0 0 -10 0\n", "\t0 20 0 0 15 0 20 0\n", "\t0 0 -10 0 -15 0 0 0\n", "\t0 30 10 0 10 0 20 0\n", "\t20 30 10 0 10 10 20 10\n", "\t0 0 0 0 0 0 0 10\n", "\t0 20 0 0 0 0 30 0\n", "\t0 20 10 0 0 0 20 0\n", "\t0 30 0 0 0 0 30 0\n", "\t0 20 0 0 0 0 40 0\n", "\t0 20 0 0 15 0 10 10\n", "\t10 15 0 0 15 -20 15 10\n", "\t0 20 0 0 10 0 20 10\n", "\t0 0 0 0 10 0 0 0\n", "\t-10 40 0 0 10 -10 20 0\n", "\t-20 30 10 -5 10 10 30 10\n", "\t0 40 0 0 0 0 20 10\n", "\t0 30 10 -5 10 10 20 0\n", "\t0 30 0 0 10 0 10 10\n", "\t0 10 10 0 0 0 20 0\n", "\t0 20 0 0 0 0 30 0\n", "\t0 0 0 0 15 0 20 0\n", "\t0 20 0 0 15 0 15 0\n", "\t0 -20 -10 0 -15 0 -30 -10\n", "\t0 40 0 0 0 0 40 0\n", "\t0 20 10 0 0 0 20 0\n", "\t-10 -10 0 0 0 0 -20 0\n", "\t0 40 10 0 15 0 20 0\n", "\t0 20 0 0 0 0 20 0\n", "\t0 30 0 0 0 0 30 10\n", "\t0 20 0 0 0 0 20 0\n", "\t0 0 0 0 0 0 20 0\n", "\t0 30 0 0 0 0 20 0\n", "\t0 40 0 0 10 0 20 0\n", "\t0 0 0 0 10 0 10 10\n", "\t0 30 10 0 0 0 20 0\n", "\t0 0 10 0 -15 0 -20 10\n", "\t0 20 0 0 15 0 30 10\n", "\t0 30 10 0 15 0 30 0\n", "\t0 0 0 0 0 0 0 0\n", "\t0 40 0 0 10 0 20 0\n", "\t0 25 0 0 10 0 30 0\n", "\t0 20 0 0 0 -10 30 0\n", "\t0 40 0 0 0 0 20 10\n", "\t0 20 0 0 0 0 20 0\n", "\t0 30 0 0 0 0 20 0\n", "\t0 30 10 0 10 0 20 -30\n", "\t0 30 0 0 10 0 30 0\n", "\t0 20 0 0 0 0 20 0\n", "\t0 20 0 0 10 0 10 10\n", "\t0 25 0 0 0 0 10 0\n", "\t-5 40 0 -5 15 5 20 0\n", "\t0 15 0 0 0 0 20 0\n", "\t0 -30 0 0 -10 0 -20 0\n", "\t0 20 0 0 0 0 20 10\n", "\t0 10 0 0 0 0 20 0\n", "\t0 30 10 0 0 0 40 0\n" ] } ], "source": [ "print(f\"Diferencia de macros ({len(macros_differences_list)}):\")\n", "for macros_difference in macros_differences_list:\n", " print(f\"\\t{macros_difference}\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Variación de macros:\n", "\tproteína día de entreno: Min: -30, Max: 20, Mean: -0.32, Mode: 0\n", "\tcarbohidratos día de entreno: Min: -30, Max: 50, Mean: 19.40, Mode: 20\n", "\tgrasas día de entreno: Min: -10, Max: 10, Mean: 2.29, Mode: 0\n", "\tproteína intraentreno: Min: -5, Max: 5, Mean: -0.23, Mode: 0\n", "\tcarbohidratos intraentreno: Min: -15, Max: 20, Mean: 4.77, Mode: 0\n", "\tproteína día de descanso: Min: -20, Max: 20, Mean: 0.37, Mode: 0\n", "\tcarbohidratos día de descanso: Min: -30, Max: 40, Mean: 18.35, Mode: 20\n", "\tgrasas día de descanso: Min: -30, Max: 10, Mean: 2.39, Mode: 0\n" ] } ], "source": [ "train_day_protein_std, train_day_carbs_std, train_day_fat_std, intratrain_protein_std, intratrain_carbs_std, rest_day_protein_std, rest_day_carbs_std, rest_day_fat_std = get_min_max_mean_mode_macros_differences(macros_differences_list)\n", "\n", "print(\"Variación de macros:\")\n", "print(f\"\\tproteína día de entreno: Min: {train_day_protein_std[0]}, Max: {train_day_protein_std[1]}, Mean: {train_day_protein_std[2]:.2f}, Mode: {train_day_protein_std[3]}\")\n", "print(f\"\\tcarbohidratos día de entreno: Min: {train_day_carbs_std[0]}, Max: {train_day_carbs_std[1]}, Mean: {train_day_carbs_std[2]:.2f}, Mode: {train_day_carbs_std[3]}\")\n", "print(f\"\\tgrasas día de entreno: Min: {train_day_fat_std[0]}, Max: {train_day_fat_std[1]}, Mean: {train_day_fat_std[2]:.2f}, Mode: {train_day_fat_std[3]}\")\n", "print(f\"\\tproteína intraentreno: Min: {intratrain_protein_std[0]}, Max: {intratrain_protein_std[1]}, Mean: {intratrain_protein_std[2]:.2f}, Mode: {intratrain_protein_std[3]}\")\n", "print(f\"\\tcarbohidratos intraentreno: Min: {intratrain_carbs_std[0]}, Max: {intratrain_carbs_std[1]}, Mean: {intratrain_carbs_std[2]:.2f}, Mode: {intratrain_carbs_std[3]}\")\n", "print(f\"\\tproteína día de descanso: Min: {rest_day_protein_std[0]}, Max: {rest_day_protein_std[1]}, Mean: {rest_day_protein_std[2]:.2f}, Mode: {rest_day_protein_std[3]}\")\n", "print(f\"\\tcarbohidratos día de descanso: Min: {rest_day_carbs_std[0]}, Max: {rest_day_carbs_std[1]}, Mean: {rest_day_carbs_std[2]:.2f}, Mode: {rest_day_carbs_std[3]}\")\n", "print(f\"\\tgrasas día de descanso: Min: {rest_day_fat_std[0]}, Max: {rest_day_fat_std[1]}, Mean: {rest_day_fat_std[2]:.2f}, Mode: {rest_day_fat_std[3]}\")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Para la consulta\n", "\tobjetivo: \"definicion\"\n", "\tcumplimientoEntrenamiento: \"bien\"\n", "\tcumplimientoDieta: \"regular\"\n", "\tcompromiso: \"bueno\"\n", "\tdiferencia_peso: <= \"0.5\"\n", "\tdiferencia_peso: >= \"0\"\n", "Se recomienda la siguiente variación de macros (g):\n", "\tDía de entrenamiento - proteínas: min: 0.00, max: 0.00, media: 0.00, moda: 0.00\n", "\tDía de entrenamiento - carbohidratos: min: -10.00, max: 10.00, media: -3.33, moda: -10.00\n", "\tDía de entrenamiento - grasa: min: -10.00, max: 0.00, media: -3.33, moda: 0.00\n", "\tIntraentreno - proteínas: min: 0.00, max: 0.00, media: 0.00, moda: 0.00\n", "\tIntraentreno - carbohidratos: min: -15.00, max: 0.00, media: -5.00, moda: 0.00\n", "\tDía de descanso - proteínas: min: 0.00, max: 0.00, media: 0.00, moda: 0.00\n", "\tDía de descanso - carbohidratos: min: -20.00, max: 10.00, media: -3.33, moda: 10.00\n", "\tDía de descanso - grasa: min: -10.00, max: 0.00, media: -3.33, moda: 0.00\n" ] } ], "source": [ "print(f\"Para la consulta\")\n", "for query_item in query:\n", " key = list(query_item.keys())[0]\n", " print(f\"\\t{key}\", end=\": \")\n", " if query_item[key]['operator'] != 'in':\n", " print(f\"{query_item[key]['operator']}\", end=\" \")\n", " print(f\"\\\"{query_item[key]['value']}\\\"\")\n", " \n", "\n", "print(f\"Se recomienda la siguiente variación de macros (g):\")\n", "print(f\"\\tDía de entrenamiento - proteínas: min: {train_day_protein_std[0]:.2f}, max: {train_day_protein_std[1]:.2f}, media: {train_day_protein_std[2]:.2f}, moda: {train_day_protein_std[3]:.2f}\")\n", "print(f\"\\tDía de entrenamiento - carbohidratos: min: {train_day_carbs_std[0]:.2f}, max: {train_day_carbs_std[1]:.2f}, media: {train_day_carbs_std[2]:.2f}, moda: {train_day_carbs_std[3]:.2f}\")\n", "print(f\"\\tDía de entrenamiento - grasa: min: {train_day_fat_std[0]:.2f}, max: {train_day_fat_std[1]:.2f}, media: {train_day_fat_std[2]:.2f}, moda: {train_day_fat_std[3]:.2f}\")\n", "print(f\"\\tIntraentreno - proteínas: min: {intratrain_protein_std[0]:.2f}, max: {intratrain_protein_std[1]:.2f}, media: {intratrain_protein_std[2]:.2f}, moda: {intratrain_protein_std[3]:.2f}\")\n", "print(f\"\\tIntraentreno - carbohidratos: min: {intratrain_carbs_std[0]:.2f}, max: {intratrain_carbs_std[1]:.2f}, media: {intratrain_carbs_std[2]:.2f}, moda: {intratrain_carbs_std[3]:.2f}\")\n", "print(f\"\\tDía de descanso - proteínas: min: {rest_day_protein_std[0]:.2f}, max: {rest_day_protein_std[1]:.2f}, media: {rest_day_protein_std[2]:.2f}, moda: {rest_day_protein_std[3]:.2f}\")\n", "print(f\"\\tDía de descanso - carbohidratos: min: {rest_day_carbs_std[0]:.2f}, max: {rest_day_carbs_std[1]:.2f}, media: {rest_day_carbs_std[2]:.2f}, moda: {rest_day_carbs_std[3]:.2f}\")\n", "print(f\"\\tDía de descanso - grasa: min: {rest_day_fat_std[0]:.2f}, max: {rest_day_fat_std[1]:.2f}, media: {rest_day_fat_std[2]:.2f}, moda: {rest_day_fat_std[3]:.2f}\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.8" } }, "nbformat": 4, "nbformat_minor": 2 }