Skip to content

Instantly share code, notes, and snippets.

@defvol
Last active April 3, 2020 04:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save defvol/b802c12afb57557b7322b164ccf7970c to your computer and use it in GitHub Desktop.
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.
(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