Last active
April 3, 2020 04:01
-
-
Save defvol/b802c12afb57557b7322b164ccf7970c to your computer and use it in GitHub Desktop.
Script que agrupa en una serie de tiempo, los reportes diarios del gobierno sobre COVID-19. De paso deja los estados en formato compatible con el Marco Geoestadístico de INEGI (i.e. listo para mapas). Referencia coronavirus.gob.mx via https://github.com/guzmart/covid19_mex/issues/2.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(async () => { | |
const assert = require('assert') | |
const path = require('path') | |
const aliases = { | |
'ciudad de mexico': 'ciudad de méxico', | |
'coahuila': 'coahuila de zaragoza', | |
'michoacan': 'michoacán de ocampo', | |
'michoacán': 'michoacán de ocampo', | |
'queretaro': 'querétaro', | |
'veracruz': 'veracruz de ignacio de la llave' | |
} | |
const { promisify } = require('util') | |
const fs = require('fs') | |
const args = process.argv.slice(2) | |
let db = {} | |
const dirname = args[0] | |
const filenames = await promisify(fs.readdir)(dirname) | |
const csvs = filenames.filter(f => f.endsWith('csv')) | |
for (let csvname of csvs) { | |
// Parse results and append to database | |
const res = await parseFile(path.join(dirname, csvname)) | |
db = { ...db, ...res } | |
} | |
console.log('%j', db) | |
async function parseFile (filename) { | |
const series = {} | |
const states = [ | |
'aguascalientes', | |
'baja california', | |
'baja california sur', | |
'campeche', | |
'coahuila de zaragoza', | |
'colima', | |
'chiapas', | |
'chihuahua', | |
'ciudad de méxico', | |
'durango', | |
'guanajuato', | |
'guerrero', | |
'hidalgo', | |
'jalisco', | |
'méxico', | |
'michoacán de ocampo', | |
'morelos', | |
'nayarit', | |
'nuevo león', | |
'oaxaca', | |
'puebla', | |
'querétaro', | |
'quintana roo', | |
'san luis potosí', | |
'sinaloa', | |
'sonora', | |
'tabasco', | |
'tamaulipas', | |
'tlaxcala', | |
'veracruz de ignacio de la llave', | |
'yucatán', | |
'zacatecas' | |
] | |
const input = await promisify(fs.readFile)(filename) | |
const data = input.toString().trim() | |
const entries = data | |
.split('\n') // split by rows | |
.slice(1) // skip header | |
.filter(l => l.length) // filter out empty lines | |
.map(l => l.split(',')) // break columns | |
for (let entry of entries) { | |
// State name found in the data file | |
let stateName = entry[1] | |
.toLowerCase() | |
.replace(/"/g, '') | |
let match | |
let matchIndex = states.indexOf(stateName) | |
if (matchIndex === -1) { | |
matchIndex = states.indexOf(aliases[stateName]) | |
if (matchIndex === -1) { | |
console.log(-1, stateName) | |
continue | |
} | |
match = aliases[stateName] | |
} else { | |
match = stateName | |
} | |
// Find the CVE_ENT code for the match | |
const code = String(matchIndex + 1).padStart(2, '0') | |
// Create key if it doesn't exist yet | |
if (!series[code]) { | |
series[code] = series[code] || {} | |
series[code]['NOM_ENT'] = match | |
series[code]['CVE_ENT'] = code | |
series[code]['CASOS'] = 0 | |
} | |
series[code]['CASOS'] += 1 | |
} | |
const total = Object | |
.values(series) | |
.map(o => o.CASOS) | |
.reduce((p, c) => p + c, 0) | |
assert.strictEqual(total, entries.length, filename) | |
const date = filename.substr(filename.lastIndexOf('_') + 1, 8) | |
return { [date]: series } | |
} | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment