User Tools

Site Tools


medicacion2021

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
medicacion2021 [2021/03/28 14:41]
osotolongo [Reglas]
medicacion2021 [2021/04/03 10:42]
osotolongo [tl;dr]
Line 2: Line 2:
  
 Ver programas en github: https://github.com/asqwerty666/medica Ver programas en github: https://github.com/asqwerty666/medica
 +
 +===== tl;dr =====
 +
 +El formato de la base de datos de input ha de ser:
 +<code>
 +<ID_Subject>;<ID_visita>;<Texto libre>
 +</code>
 +
 +y se ejecutan dos scripts consecutivos,
 +
 +<code bash>
 +$ ./parse.pl medicamentos.db
 +$ ./apply_rules.pl -r med_rules_ed_0219.txt
 +</code>
 +
 +Y los resultados quedan en el archivo //meds_matrix.csv//. ;-)
 ===== Antes de empezar ===== ===== Antes de empezar =====
  
Line 235: Line 251:
 </code> </code>
  
-**Ahora, las reglas han de revisarse y editarse a mano. Esto no hay manera de evitarlo pero solo ha de hacerse una vez. La proxima ve que se haga el analisis se usara el mismo archivo de reglas.**+**Ahora, las reglas han de revisarse y editarse a mano. Esto no hay manera de evitarlo pero solo ha de hacerse una vez. La proxima vez que se haga el analisis se usara el mismo archivo de reglas.** 
 + 
 +===== Reglas de CIMA ===== 
 + 
 +https://cima.aemps.es/cima/publico/nomenclator.html 
 + 
 +Me bajo la lista de medicamentos comercializados en España y la convierto a CSV. Luego hago esto: 
 + 
 +<code bash> 
 +[osotolongo@brick03 medicaion_dev]$ awk -F";" '{print $2}' Medicamentos.csv | tail -n +2 | sed 's/\// /g' |awk '{print $1}' | tr '[:upper:]' '[:lower:]' | sort | uniq > medicamentos.list 
 +</code> 
 + 
 +O si quiero tener los principios activos, 
 + 
 +<code bash> 
 +[osotolongo@brick03 medicaion_dev]$ awk -F";" '{print $2";"$8";"$9}' Medicamentos.csv | tail -n +2 | sed 's/\// /g' | tr '[:upper:]' '[:lower:]' | sort | uniq | sed 's/\.//g' > medicamentos_pa.list 
 +[osotolongo@brick03 medicaion_dev]$ sed 's/\([^ ]*\).*;\(.*\);\(.*\)/\1;\2;\3/' medicamentos_pa.list | uniq > mpa.list 
 +</code> 
 + 
 + 
 +===== Aplicando las reglas ===== 
 + 
 +Aqui he de leer tres cosas antes que nada. Primero, las reglas que hemos construido. Estas las voy a asignar a un hash de arrays, 
 + 
 +<code perl> 
 +my %wrules; 
 +open RDF, "<$rules_file" or die "No rules file"; 
 +while (<RDF>){ 
 +        (my $rkey, my $rvalue) = /^(\w*): (.*)$/; 
 +        chomp $rvalue; 
 +        my @lpat = split /\|/, $rvalue; 
 +        %{$wrules{$rkey}} = map {$_ => 1} @lpat unless !$rkey; 
 +
 +close RDF; 
 + 
 +</code> 
 + 
 +Luego, la lista de principios activos de [[https://cima.aemps.es/cima/publico/home.html|CIMA]]. 
 + 
 +<code perl> 
 +my %cima; 
 +open ADF, "<$mpa"; 
 +while (<ADF>){ 
 +        my ($med, $pal, $pan) = /^(.*);(.*);(.*)$/; 
 +        my @pas = split /, /, $pal; 
 +        for (@pas) {s/\s+/_/g;
 +        $cima{$med} = [ @pas ]; 
 +
 +close ADF; 
 +</code> 
 + 
 + 
 +Ahora cargo base de datos ya revisada, que si todo va bien sera el output del script anterior. 
 + 
 +<code perl> 
 +my $dbfile = 'parsed_meds.csv'; 
 + 
 +my %visits; 
 +my %meds; 
 +open IDF, "<$dbfile" or die "Database file do not exists\n"; 
 +while(<IDF>){ 
 +        my ($pid, $vid, $ldata) = /^(\d+);(\d+);(.*)$/; 
 +</code> 
 + 
 +Pero voy a ir llenando el hash de output (// %visits //) a medida que leo. Primero meto toda la medicacion de la visita en un array, 
 + 
 +<code perl> 
 +        if($ldata){ 
 +                my @mlist = split /,/, $ldata; 
 +</code> 
 + 
 +y ahora, para cada elemento de este array, recorro las reglas, buscando si este termino existe dentro de alguna regla.  
 + 
 +<code perl> 
 +                foreach my $med (@mlist){ 
 +                        if ($med){ 
 +                                foreach my $rkey (sort keys %wrules){ 
 +                                        if(exists($wrules{$rkey}{$med})){ 
 +                                                foreach my $pa (@{$cima{$rkey}}){ 
 +                                                        $meds{$pa} = 1; 
 +                                                        $visits{$pid}{$vid}{$pa} = 1; 
 +                                                } 
 +                                                last; 
 +                                        } 
 +                                } 
 +                        } 
 +                } 
 +</code> 
 + 
 +Cuando encuentro este elemento en las reglas, marco tods los ID de principios activos correspondientes a este medicamento como existentes en esa visita y ademas los sumo a las variables que he de escribir. Si no se encuentra este termino, se concluye que no es ningun medicamento (pues no esta en ninguna regla) y no se hace nada. 
 + 
 +Una vez llenados los medicamentos de cada visita hemos de escribirlo en forma matricial. Primero escribimos los headers, 
 + 
 +<code perl> 
 + open ODF, ">$ofile" or die "Could not open file !!!!!!\n"; 
 +print ODF "Interno,Fecha_visita"; 
 +foreach my $med (sort keys %meds){ 
 +        print ODF ",$med"; 
 +
 +print ODF "\n"; 
 +</code> 
 + 
 +Y ahora llenamos los valores correspondientes a cada visita con un 1, caso de existir y un 0 en caso contrario. 
 + 
 +<code perl> 
 +foreach my $pid (sort keys %visits){ 
 +        foreach my $vid (sort keys %{$visits{$pid}}){ 
 +                print ODF "$pid,$vid"; 
 +                foreach my $med (sort keys %meds){ 
 +                        if(exists($visits{$pid}{$vid}{$med})){ 
 +                                print ODF ",1"; 
 +                        }else{ 
 +                                print ODF ",0"; 
 +                        } 
 +                } 
 +                print ODF "\n"; 
 +        } 
 +
 +close ODF; 
 +</code> 
 + 
 +**TADA!**
  
medicacion2021.txt · Last modified: 2021/04/03 10:42 by osotolongo