Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions data_bridges_knots/labels.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
from typing import Union

import ast
import json

import pandas as pd


def to_dict(x):
if isinstance(x, str):
try:
return ast.literal_eval(x)
except Exception:
return x # keep original if parsing fails
return x


def get_variable_labels(
xlsform_df: pd.DataFrame, format: str = "dict"
) -> Union[dict[str, str], str, pd.DataFrame]:
Expand Down Expand Up @@ -112,6 +122,20 @@ def get_choice_labels(
>>> get_choice_labels(df, format="df")
"""

def cast_to_dict_or_nan(x):
if isinstance(x, dict):
return x
if pd.isna(x):
return None
if isinstance(x, str):
try:
return ast.literal_eval(x)
except Exception:
return None
return None

xlsform_df["choiceList"] = xlsform_df["choiceList"].apply(cast_to_dict_or_nan)

choiceList = pd.json_normalize(xlsform_df["choiceList"])
choiceList = choiceList.rename(columns={"name": "choice_name"})
choiceList = choiceList.join(xlsform_df["name"]).dropna()
Expand Down
23 changes: 7 additions & 16 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,26 @@

import pandas as pd
import pytest
from dotenv import load_dotenv

from data_bridges_knots import DataBridgesShapes, config_from_env

load_dotenv()


@pytest.fixture
def sample_survey_df():
"""Fixture providing a sample survey dataset"""
client = DataBridgesShapes(config_from_env())
df = client.get_household_survey(
4872, "full"
) # FIXME: this should read from a static file
df = pd.read_csv("tests/static/test_survey.csv")
return df


@pytest.fixture
def sample_xlsform_df():
"""Fixture providing a sample questionnaire in xlsForm"""
client = DataBridgesShapes(config_from_env())
df = client.get_household_questionnaire(
1883
) # FIXME: this should read from a static file
df = pd.read_csv("tests/static/test_xlsform.csv")
return df


@pytest.fixture
def sample_xlsform_pkl():
"""Fixture providing a sample survey dataset"""
return pd.read_pickle("tests/static/test_xlsform.pkl")


@pytest.fixture
def sample_list():
"""Fixture providing a sample list for testing."""
Expand All @@ -45,6 +35,7 @@ def sample_values_labels_expected():
) as f: # adjust path
return json.load(f)


def pytest_addoption(parser):
parser.addoption(
"--run-integration",
Expand All @@ -53,6 +44,7 @@ def pytest_addoption(parser):
help="Run integration tests (API calls)",
)


def pytest_collection_modifyitems(config, items):
if config.getoption("--run-integration"):
return
Expand All @@ -62,4 +54,3 @@ def pytest_collection_modifyitems(config, items):
for item in items:
if "integration" in item.keywords:
item.add_marker(skip_integration)

Binary file removed tests/static/test_df.pkl
Binary file not shown.
26 changes: 26 additions & 0 deletions tests/static/test_survey.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
chocImpactAlim,tempsRecolte_12,HHIncSec_Est,HHExpFEgg_Purch_7D,comeneSaison2019_17,HHAssetSofa,HHIncThird_Dur,HHExpFPuls_Own_MN_7D,HHHDisabRemember,raisonCulture7_autre,raisonCulture11_autre,WORRIED,perteSaisonier_2,comeneSaison2019_10,HHExpFCer_GiftAid_MN_7D
1,3,48000,1,1,2,10,3200,1,Marche local,Consommation,2,0,1,1300
0,5,26000,0,0,1,6,1400,2,Usage domestique,Vente,1,1,0,0
1,2,61000,1,1,3,12,5100,1,Demande elevee,Stockage,2,0,1,2100
0,8,17000,0,0,0,4,700,3,Tradition familiale,Consommation,1,1,0,400
1,4,73000,1,1,4,11,4300,2,Profit,Transformation,2,0,1,1900
0,6,31000,0,0,2,7,1200,1,Autoconsommation,Semence,1,0,0,300
1,1,92000,1,1,5,12,6200,1,Exportation,Vente,2,0,1,2600
0,7,23000,0,0,1,5,950,2,Climat favorable,Consommation,1,1,0,0
1,3,50000,1,1,3,9,3600,2,Demande locale,Transformation,2,0,1,1400
0,9,28000,0,0,2,6,1150,3,Habitude,Stockage,1,1,0,200
1,2,66000,1,1,4,10,4800,1,Marche urbain,Vente,2,0,1,2200
0,10,21000,0,0,0,3,650,4,Tradition,Consommation,1,1,0,0
1,4,59000,1,1,3,8,4000,2,Diversification,Transformation,2,0,1,1700
0,11,16000,0,0,1,4,500,888,Aucune,Aucune,3,1,0,0
1,3,78000,1,1,5,12,5600,1,Demande marche,Export,2,0,1,2400
0,2,22000,0,0,1,5,1000,2,Besoin menage,Consommation,1,1,0,300
1,6,69000,1,1,4,9,4500,1,Revenus,Transformation,2,0,1,2000
0,7,24000,0,0,2,6,1300,2,Climat,Stockage,1,1,0,150
1,5,83000,1,1,5,11,5300,1,Commerce,Vente,2,0,1,2300
0,8,20000,0,0,1,4,800,999,Autre,Consommation,4,1,0,0
1,3,54000,1,1,3,9,3700,2,Demande locale,Transformation,2,0,1,1500
0,6,30000,0,0,2,7,1250,1,Autoconsommation,Semence,1,0,0,250
1,2,70000,1,1,4,10,4900,1,Marche extra,Vente,2,0,1,2100
0,9,26000,0,0,2,6,1100,3,Habitudes,Stockage,1,1,0,100
1,4,75000,1,1,5,12,5400,1,Commerce international,Export,2,0,1,2600
21 changes: 21 additions & 0 deletions tests/static/test_xlsform.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name,label,type,choiceList
chocImpactAlim,CHOC.5 - Est-ce que ce choc ont diminues la capacite de votre menage à produire ou acheter de la nourriture?,select_one,"{'name': 'Yesno', 'choices': [{'name': '0', 'label': 'Non'}, {'name': '1', 'label': 'Oui'}]}"
choc_module1,,end_group,
tempsRecolte_12,2039.4. Quand pensez vous recolter pour le TAROT ?,select_one,"{'name': 'tempsRecolte', 'choices': [{'name': '1', 'label': 'Déjà récolté'}, {'name': '2', 'label': ""Moins d'un mois""}, {'name': '3', 'label': '1 mois'}, {'name': '4', 'label': '2 mois'}, {'name': '5', 'label': '3 mois'}, {'name': '6', 'label': '4 mois'}, {'name': '7', 'label': '5 mois'}, {'name': '8', 'label': '6 mois'}, {'name': '9', 'label': '7 mois'}, {'name': '10', 'label': '8 mois'}, {'name': '11', 'label': '9 mois'}]}"
HHIncSec_Est,1408. Quelle est la valeur estimée en monnaie locale de la deuxième source de revenus du ménage?,decimal,
HHExpFEgg_Purch_7D,"1161. Votre ménage a-t-il acheté des œufs pour sa consommation au cours des 7 derniers jours, en espèces ou à crédit ?",select_one,"{'name': 'Yesno', 'choices': [{'name': '0', 'label': 'Non'}, {'name': '1', 'label': 'Oui'}]}"
comeneSaison2019_17,2056.1. Pensez vous que la recolte de PALMIER A HUILE pour cette saison (2022-2023) sera meilleure que celle de la saison dernière (2021-2022)?,select_one,"{'name': 'Yesno', 'choices': [{'name': '0', 'label': 'Non'}, {'name': '1', 'label': 'Oui'}]}"
HHAssetSofa,1908. Combien de fauteils votre ménage possède-t-il?,integer,
HHIncThird_Dur,1416. Durée de pratique pour la première source de revenus (Nombre de mois de génération de revenus annuels),integer,
HHExpFPuls_Own_MN_7D,"1124. Quelle serait la valeur (en FCFA) des légumineuses et des noix consommées que vous avez produites, récoltées ou reçues en échange de travail si vous deviez les acheter au marché ?",decimal,
HHHDisabRemember,123. Le chef de ménage a-t-il des difficultés à se rappeler les choses ou à se concentrer ? Diriez-vous…,select_one,"{'name': 'Disab', 'choices': [{'name': '1', 'label': 'Aucune difficulté'}, {'name': '2', 'label': 'Quelques difficultés'}, {'name': '3', 'label': 'Beaucoup de difficulté'}, {'name': '4', 'label': 'Ne peut pas faire du tout'}, {'name': '888', 'label': 'Ne sais pas'}, {'name': '999', 'label': 'Refuser'}]}"
raisonCulture7_autre,Preciser autre raison principale de culture de l'ARACHIDE ?,text,
HHExpFSgr,"Je vais maintenant vous poser des questions sur vos dépenses et votre consommation en sucre, confiseries et desserts. Cela inclut des articles tels que le sucre brut, le miel, les confitures, le chocolat, la crème glacée et les produits similaires.",note,
raisonCulture11_autre,Preciser autre raison principale de culture de la POMME DE TERRE ?,text,
HHExpNFMedServ,"Je vais maintenant vous poser des questions sur vos dépenses et votre consommation de services de santé. Ceux-ci comprennent des éléments tels que les services ambulatoires et hospitaliers, les honoraires des médecins, les soins traditionnels.",note,
WORRIED,801. Vous même ou d’autres membres de votre menage avez été inquiet de ne pas avoir suffisamment de nourriture en manque d’argent ou d’autres ressources,select_one,"{'name': 'fies', 'choices': [{'name': '1', 'label': 'Non'}, {'name': '2', 'label': 'Oui'}, {'name': '3', 'label': 'Ne sait pas'}, {'name': '4', 'label': 'Refus'}]}"
perteSaisonier_2,PAM.10 Est-ce que la perte de PORCINS est habituelle à cette periode de l'annee,select_one,"{'name': 'Yesno', 'choices': [{'name': '0', 'label': 'Non'}, {'name': '1', 'label': 'Oui'}]}"
comeneSaison2019_10,2040.2. Pensez vous que la recolte de PATATE DOUCE pour cette saison (2022-2023) sera meilleure que celle de la saison dernière (2021-2022)?,select_one,"{'name': 'Yesno', 'choices': [{'name': '0', 'label': 'Non'}, {'name': '1', 'label': 'Oui'}]}"
VOLAILLES1,,end_group,
HHExpFCer_GiftAid_MN_7D,1104. Quelle serait la valeur (en FCFA) des céréales consommées provenant des dons en nature ou de l'assistance si vous deviez les acheter au marché ?,decimal,
Demographic_module1,,end_group,
Binary file removed tests/static/test_xlsform.pkl
Binary file not shown.
7 changes: 5 additions & 2 deletions tests/unit/test_labels.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from typing import Dict


import pandas as pd

from data_bridges_knots.labels import get_choice_labels, get_variable_labels
from data_bridges_knots.labels import (
get_choice_labels,
get_variable_labels,
)


def test_sample_questionnaire_df(sample_xlsform_df):
Expand Down Expand Up @@ -67,7 +71,6 @@ def test_return_column_labels_as_json(sample_xlsform_df):
assert isinstance(result, str)


# % TESTS FOR get_choice_labels
def test_return_value_labels_as_df(sample_xlsform_df):
result = get_choice_labels(sample_xlsform_df, "df")
assert isinstance(result, pd.DataFrame)
Expand Down
Loading