Scheduled service maintenance on November 22


On Friday, November 22, 2024, between 06:00 CET and 18:00 CET, GIN services will undergo planned maintenance. Extended service interruptions should be expected. We will try to keep downtimes to a minimum, but recommend that users avoid critical tasks, large data uploads, or DOI requests during this time.

We apologize for any inconvenience.

test_generateMessages.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. """
  2. This file will test the differents modules in generate_messages folder
  3. You must have the pip package pytest installed
  4. """
  5. import os
  6. import sys
  7. import pytest
  8. import shutil
  9. import pandas as pd
  10. import yaml
  11. import datetime
  12. fpath = os.path.join(os.path.dirname(__file__),'..', 'generate_messages')
  13. sys.path.append(fpath)
  14. import generate_messages.messages as msg
  15. TEST_DATASET_PATH = os.path.join('tests','test_dataset') #dataset to use for tests changing it
  16. DATASET_PATH = os.path.join('tests','existing_dataset') #dataset already existing, used for tests that don't change it
  17. YAML_PATH = os.path.join(DATASET_PATH, 'extra','messages','definition','metrics_messages.yaml')
  18. with open(YAML_PATH, 'r') as in_yaml:
  19. YAML = yaml.load(in_yaml, Loader=yaml.FullLoader)
  20. def set_up_dataset():
  21. if os.path.exists(TEST_DATASET_PATH):
  22. shutil.rmtree(TEST_DATASET_PATH)
  23. shutil.copytree(DATASET_PATH, TEST_DATASET_PATH)
  24. ########## generate_messages #############
  25. list_of_metrics_label = ['avg_cry_voc_dur_chi', 'avg_non_can_voc_dur_chi', 'non_can_voc_chi_ph', 'voc_chi_ph', 'mean_pitch_range_chi', 'avg_pr_pm_fem', 'mlus_fem', 'avg_can_voc_dur_chi', 'sc_fem_ph', 'chi_adu_turn_transitions', 'mean_mean_pitch_fem', 'avg_voc_dur_fem', 'lp_n', 'voc_dur_fem_ph', 'cp_n', 'cry_voc_dur_chi_ph', 'duration_acoustic', 'cp_dur', 'mean_pitch_range_fem', 'wc_fem_ph', 'duration_vcm', 'avg_voc_dur_chi', 'mean_mean_pitch_chi', 'voc_dur_chi_ph', 'voc_fem_ph', 'mluw_fem', 'can_voc_chi_ph', 'mlup_fem', 'duration_alice_vtc', 'avg_sr_pm_fem', 'lp_dur', 'duration_conversations', 'duration_vtc', 'avg_wr_pm_fem', 'can_voc_dur_chi_ph', 'pc_fem_ph', 'cry_voc_chi_ph', 'non_can_voc_dur_chi_ph']
  26. def test_get_metrics():
  27. met_rec, cols = msg.get_metrics(DATASET_PATH, os.path.join(DATASET_PATH,'extra','metrics','metrics.csv'))
  28. assert sorted(cols) == sorted(list_of_metrics_label)
  29. pd.testing.assert_frame_equal(met_rec, pd.read_csv(os.path.join('tests','data','truth','get_metrics.csv')))
  30. @pytest.mark.parametrize('key,yml,date,evol,truth',[
  31. ([False, False], YAML,'20221101', [('chi_adu_turn_transitions', 0.0, False), ('voc_chi_ph', -6.0, False)],'Gracias por enviarnos el audio. Qué bueno que hayas tomado un rato para conversar con tu hijo/a. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – esto le hará muy bien ahora y en el futuro. La próxima vez probá practicar que haya más ida y vuelta entre ustedes, por ejemplo, haciéndole preguntas a <<nombre-bebe>>.'),
  32. ([False, True], YAML,'20221118', [('voc_chi_ph', 0.0, False), ('chi_adu_turn_transitions', 6.0, True)],'En tu último audio, hubo más ida y vuelta entre ustedes. ¡Muy bien! La próxima vez probá dejar más espacio para que <<nombre-bebe>> hable, por ejemplo, haciéndole preguntas. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a desarrollar más su capacidad de expresarse.'),
  33. ([True, True], YAML,'20221114', [('chi_adu_turn_transitions', 3.0, True), ('voc_chi_ph', 6.0, True)],'En tu último audio, hubo más ida y vuelta entre ustedes y <<nombre-bebe>> habló más que en el audio anterior. ¡Eso es excelente! Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – estarás contribuyendo a desarrollar más su cerebro.'),
  34. ([True, False], YAML,'20221201', [('voc_chi_ph', 9.0, True), ('chi_adu_turn_transitions', -6.0, False)],'En tu último audio, <<nombre-bebe>> habló más que en el audio anterior. ¡Muy bien! La próxima vez probá practicar que haya más ida y vuelta entre ustedes, por ejemplo, haciéndole preguntas a <<nombre-bebe>>. Comunicate con <<nombre-bebe>> en todas las oportunidades que tengas – le ayudarás a estimular sus habilidades sociales.'),
  35. ])
  36. def test_fill_template(key,yml,evol,truth, date):
  37. start = datetime.datetime.strptime(YAML['start_date'],'%Y-%m-%d')
  38. end = datetime.datetime.strptime(YAML['end_date'],'%Y-%m-%d')
  39. datet = datetime.datetime.strptime(date,'%Y%m%d')
  40. res = msg.fill_template(key,yml,evol,datet, start,end)
  41. #print(res)
  42. assert truth == res
  43. #dependent on get_metrics - fill_template
  44. @pytest.mark.parametrize('date,dateThrow',[
  45. ('20220117',False),
  46. ('20220207',False),
  47. ('2022-01-01',True),
  48. ])
  49. def test_build_messages(date, dateThrow):
  50. if dateThrow:
  51. with pytest.raises(ValueError):
  52. msg.build_messages(pd.DataFrame(),[],YAML_PATH,date) #wrong date format will throw ValueError
  53. else:
  54. metrics = pd.read_csv(os.path.join('tests' ,'data','mockup_messages','metrics.csv'))
  55. columns = list(set(metrics.columns) - set(['recording_filename', 'child_id']))
  56. recordings = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages','recordings.csv'))
  57. metrics_recordings = pd.merge(metrics, recordings, on='recording_filename', suffixes=('', '_drop'))
  58. metrics_recordings.drop([col for col in metrics_recordings.columns if 'drop' in col], axis=1, inplace=True)
  59. # Handle file with the same child_id that have the same date -> keep the longest one
  60. metrics_recordings = (metrics_recordings.groupby(['child_id', 'date_iso'], as_index=False)
  61. # Keep only the first segment for each candidate speaker
  62. .apply(lambda rows: (rows.sort_values(by='start_time', ascending=False) # take last instead
  63. .head(n=1))))
  64. messages = msg.build_messages(metrics_recordings, columns, YAML_PATH, date)
  65. truth = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date)), sep=';')
  66. pd.testing.assert_frame_equal(messages, truth, check_like=True)
  67. #dependent on build_messages - get_metrics - fill_template
  68. def test_generate_messages():
  69. set_up_dataset()
  70. data_path = os.path.join('tests','data', 'mockup_messages')
  71. metadata_path = os.path.join(TEST_DATASET_PATH,'metadata')
  72. shutil.copyfile(os.path.join(data_path,'recordings.csv'), os.path.join(metadata_path, 'recordings.csv'))
  73. shutil.copyfile(os.path.join(data_path,'children.csv'), os.path.join(metadata_path,'children.csv'))
  74. shutil.copyfile(os.path.join(data_path,'annotations.csv'), os.path.join(metadata_path,'annotations.csv'))
  75. date1 = '20220117'
  76. msg.generate_messages(TEST_DATASET_PATH, os.path.join(data_path,'metrics.csv'), YAML_PATH, date1)
  77. messages1 = pd.read_csv(os.path.join(TEST_DATASET_PATH, 'extra','messages','generated','messages_{}.csv'.format(date1)), sep=';')
  78. date2 = '20220207'
  79. msg.generate_messages(TEST_DATASET_PATH, os.path.join(data_path,'metrics.csv'), YAML_PATH, date2)
  80. messages2 = pd.read_csv(os.path.join(TEST_DATASET_PATH, 'extra','messages','generated','messages_{}.csv'.format(date2)), sep=';')
  81. truth1 = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date1)), sep=';')
  82. truth2 = pd.read_csv(os.path.join('tests', 'data', 'mockup_messages', 'messages_{}.csv'.format(date2)), sep=';')
  83. pd.testing.assert_frame_equal(messages1, truth1, check_like=True)
  84. pd.testing.assert_frame_equal(messages2, truth2, check_like=True)
  85. ##########################################