Skip to content

Instantly share code, notes, and snippets.

@jazzido
Last active August 12, 2017 20:09
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 jazzido/1050fd9169adb7fd9ff1d1002649fd16 to your computer and use it in GitHub Desktop.
Save jazzido/1050fd9169adb7fd9ff1d1002649fd16 to your computer and use it in GitHub Desktop.
Matrices y nombres
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Esta semana, la [Dirección Nacional de Datos e Información Pública](https://datosgobar.github.io/) publicó [\"Tu nombre en los últimos 100 años\"](http://nombres.historias.datos.gob.ar), un sitio muy divertido que permite consultar frecuencias de uso de nombres propios. Parecido al [Popular Baby Names](https://www.ssa.gov/oact/babynames/) de la Social Security Administration de Estados Unidos. Junto con el sitio, el equipo de datos públicos subió [el dataset al portal de datos públicos](http://datos.gob.ar/dataset/nombres-personas-fisicas).\n",
"\n",
"El diario La Nación [publicó un enlace al sitio de nombres en su home page](http://www.lanacion.com.ar/2051547-conoce-en-que-ano-tu-nombre-fue-el-mas-utilizado-en-la-argentina)…y se vino abajo por el tráfico.\n",
"\n",
"Para poner a andar un ratito la croqueta, me puse a pensar cómo hacer un método eficiente de consulta de esta información. Dado uno o varios nombres, quiero obtener la serie temporal de sus frecuencias. No es nada del otro mundo, y es apenas un prototipo. \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preparando el dataset\n",
"\n",
"```bash\n",
"cat historico-nombres.csv | uconv -t ASCII -x nfd -c | tr '[:upper:]' '[:lower:]' | tr -s ' ' | sed -e 's/^ *//' -e 's/ *$//' | csvfix sort -smq -rh -f 1:S,3:N > sorted-ascii-historico-nombres.csv > ascii-historico-nombres.csv\n",
"```\n",
"\n",
"Ese _pipeline_ de comandos procesa el archivo original aplicando las siguientes transformaciones:\n",
"\n",
" - `uconv -t ASCII -x nfd -c`: Aplicar la forma de normalización _Canonical Decomposition_ de Unicode (NFD). En criollo, sacarle acentos a los caracteres\n",
" - `tr '[:upper:]' '[:lower:]'`: pasar todo a minísculas\n",
" - `tr -s ' '`: convertir espacios repetidos a uno sólo.\n",
" - `sed -e 's/^ *//' -e 's/ *$//'`: sacar espacios del principio y final de cada línea.\n",
" - `csvfix sort -smq -rh -f 1:S,3:N`: ordenar la tabla según nombre y luego año.\n",
" \n",
"Nos queda algo así:\n",
"\n",
"| nombre | cantidad | anio | \n",
"|--------------------------------|----------|------| \n",
"| aage tomasen | 2 | 1931 | \n",
"| aago peter | 1 | 1987 | \n",
"| aakash | 2 | 1985 | \n",
"| aalam yamir | 2 | 2013 | \n",
"| aale rene | 1 | 1987 | \n",
"| aalejandro daniel | 1 | 2002 | \n",
"| aaleyah nayara | 2 | 2013 | \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Una estructura eficiente\n",
"\n",
"Lo más simple que se me ocurrió es [pivotear](https://en.wikipedia.org/wiki/Pivot_table) ese dataset, para convertirlo en una matriz donde cada fila es un nombre y cada columna es un año. Tenemos 3044402 nombres únicos y un período de 94 años. Es decir, una matriz de 3044402 x 94. \n",
"\n",
"Para poder obtener la fila correspondiente al nombre que nos interesa, también construimos un diccionario `NAMES` cuyas claves son los nombres y sus valores el índice de la fila de la matriz que contiene la serie temporal de frecuencias.\n",
"\n",
"El siguiente script construye esas estructuras de datos."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# coding: utf-8\n",
"import csv, sys, pickle\n",
"import numpy as np\n",
"\n",
"YEAR_MIN, YEAR_MAX = 1922, 2015\n",
"YEARS_Q = YEAR_MAX - YEAR_MIN\n",
"NAMES_Q = 3044402 # count-distinct on the name column\n",
"NAMES = {}\n",
"\n",
"FREQS = np.zeros((NAMES_Q, YEARS_Q+1), int)\n",
"\n",
"reader = csv.reader(sys.stdin)\n",
"next(reader) # skip header\n",
"\n",
"# Pivotear el dataset de nombres:\n",
"# a partir de una tabla de (nombre, frecuencia, año), construir una matriz\n",
"# de frecuencias |nobmres| x |años|\n",
"cur_name, cur_row, i = None, None, -1\n",
"for row in reader:\n",
" if row[0] != cur_name:\n",
" i += 1\n",
" NAMES[row[0]] = i\n",
"\n",
" if i % 2000 == 0:\n",
" print(\"%d names processed\" % i)\n",
"\n",
" FREQS[i, int(row[2]) - YEAR_MIN] += int(row[1])\n",
" cur_name = row[0]\n",
"\n",
"# save FREQS\n",
"np.save('freqs', FREQS)\n",
"# save NAMES\n",
"with open('names.pickle', 'wb') as f:\n",
" pickle.dump(NAMES, f)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Consultando las frecuencias\n",
"\n",
"Cómo consultamos esto? Fácil. Obtenemos el índice del nombre que nos interesa, y con él, la fila correspondiente en la matriz:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pickle\n",
"\n",
"FREQS = np.load('freqs.npy')\n",
"with open('names.pickle', 'rb') as f:\n",
" NAMES = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 56, 70, 121, 123, 159, 151, 205, 232, 287, 306, 328,\n",
" 271, 331, 338, 332, 333, 348, 363, 394, 450, 445, 430,\n",
" 439, 499, 464, 514, 431, 424, 444, 365, 374, 345, 319,\n",
" 327, 310, 308, 246, 253, 257, 183, 203, 208, 221, 180,\n",
" 167, 165, 162, 151, 193, 158, 144, 174, 220, 223, 274,\n",
" 271, 245, 246, 286, 241, 272, 303, 387, 437, 460, 415,\n",
" 487, 458, 566, 627, 555, 801, 1013, 1135, 1012, 783, 786,\n",
" 760, 729, 678, 736, 815, 857, 0, 718, 726, 705, 650,\n",
" 581, 600, 814, 789, 849, 711])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FREQS[NAMES['manuel']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Visualizamos el resultado para verificar que al menos se parezca a lo que reporta. Para esto, también vamos a calcular el _pormilaje_ (?) del nombre de interés para cada año. Con los datos en esta matriz, es fácil: la cantidad de nombres en cada año es la suma de cada columna."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"manuel_1000ct = (FREQS[NAMES['manuel']] / np.sum(FREQS, axis=0)) * 1000"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div class=\"vega-embed\" id=\"d6e278d4-8893-460d-84ef-1ee67290a90a\"></div>\n",
"\n",
"<style>\n",
".vega-embed svg, .vega-embed canvas {\n",
" border: 1px dotted gray;\n",
"}\n",
"\n",
".vega-embed .vega-actions a {\n",
" margin-right: 6px;\n",
"}\n",
"</style>\n"
]
},
"metadata": {
"jupyter-vega": "#d6e278d4-8893-460d-84ef-1ee67290a90a"
},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"var spec = {\"config\": {\"cell\": {\"width\": 500, \"height\": 350}}, \"encoding\": {\"x\": {\"field\": \"year\", \"type\": \"nominal\"}, \"y\": {\"field\": \"freq\", \"type\": \"quantitative\"}}, \"mark\": \"line\", \"data\": {\"values\": [{\"freq\": 2.3661638568470864, \"year\": 1922}, {\"freq\": 2.3110700254217704, \"year\": 1923}, {\"freq\": 3.09660908509277, \"year\": 1924}, {\"freq\": 2.5451084257573253, \"year\": 1925}, {\"freq\": 2.7249357326478147, \"year\": 1926}, {\"freq\": 2.1213228063274423, \"year\": 1927}, {\"freq\": 2.3932102873019763, \"year\": 1928}, {\"freq\": 2.3483682889302777, \"year\": 1929}, {\"freq\": 2.474884663476049, \"year\": 1930}, {\"freq\": 2.419928825622776, \"year\": 1931}, {\"freq\": 2.2960344405166078, \"year\": 1932}, {\"freq\": 1.8065703162498, \"year\": 1933}, {\"freq\": 2.034894443693057, \"year\": 1934}, {\"freq\": 1.8413397108333969, \"year\": 1935}, {\"freq\": 1.6957636554943762, \"year\": 1936}, {\"freq\": 1.574460640848034, \"year\": 1937}, {\"freq\": 1.5037658964907807, \"year\": 1938}, {\"freq\": 1.4244063992340381, \"year\": 1939}, {\"freq\": 1.3913215435900332, \"year\": 1940}, {\"freq\": 1.5214833448289853, \"year\": 1941}, {\"freq\": 1.5063503669401792, \"year\": 1942}, {\"freq\": 1.2488310360650785, \"year\": 1943}, {\"freq\": 1.1794290381339767, \"year\": 1944}, {\"freq\": 1.2328019191193, \"year\": 1945}, {\"freq\": 1.1146290255163567, \"year\": 1946}, {\"freq\": 1.1719720824393436, \"year\": 1947}, {\"freq\": 0.9272925209877925, \"year\": 1948}, {\"freq\": 0.8902513280282193, \"year\": 1949}, {\"freq\": 0.877690645675891, \"year\": 1950}, {\"freq\": 0.7313661920467434, \"year\": 1951}, {\"freq\": 0.742085577943788, \"year\": 1952}, {\"freq\": 0.6664812110253379, \"year\": 1953}, {\"freq\": 0.6049205259584862, \"year\": 1954}, {\"freq\": 0.6049573199835718, \"year\": 1955}, {\"freq\": 0.5578409037742436, \"year\": 1956}, {\"freq\": 0.5503695338298572, \"year\": 1957}, {\"freq\": 0.43664866822156195, \"year\": 1958}, {\"freq\": 0.4427767879956737, \"year\": 1959}, {\"freq\": 0.4407832564106522, \"year\": 1960}, {\"freq\": 0.30668883317468193, \"year\": 1961}, {\"freq\": 0.3262983620786652, \"year\": 1962}, {\"freq\": 0.3352994562667952, \"year\": 1963}, {\"freq\": 0.353034015865764, \"year\": 1964}, {\"freq\": 0.2845426924694196, \"year\": 1965}, {\"freq\": 0.2662504444150382, \"year\": 1966}, {\"freq\": 0.2580431260439017, \"year\": 1967}, {\"freq\": 0.24877455496996279, \"year\": 1968}, {\"freq\": 0.22135796514858103, \"year\": 1969}, {\"freq\": 0.2693168561652629, \"year\": 1970}, {\"freq\": 0.20840148149711402, \"year\": 1971}, {\"freq\": 0.18595545592016313, \"year\": 1972}, {\"freq\": 0.22050688703837706, \"year\": 1973}, {\"freq\": 0.26509761014504457, \"year\": 1974}, {\"freq\": 0.2514271024886773, \"year\": 1975}, {\"freq\": 0.3059350278858662, \"year\": 1976}, {\"freq\": 0.2836493424254635, \"year\": 1977}, {\"freq\": 0.25001581732721867, \"year\": 1978}, {\"freq\": 0.24117788928170167, \"year\": 1979}, {\"freq\": 0.297419109281764, \"year\": 1980}, {\"freq\": 0.23613768884891206, \"year\": 1981}, {\"freq\": 0.2623912330458606, \"year\": 1982}, {\"freq\": 0.30511167792290445, \"year\": 1983}, {\"freq\": 0.3828340004075649, \"year\": 1984}, {\"freq\": 0.4135586676029307, \"year\": 1985}, {\"freq\": 0.4174376407150525, \"year\": 1986}, {\"freq\": 0.37799159856745734, \"year\": 1987}, {\"freq\": 0.4353111536192502, \"year\": 1988}, {\"freq\": 0.41004704797460934, \"year\": 1989}, {\"freq\": 0.4846205746264312, \"year\": 1990}, {\"freq\": 0.503285806136234, \"year\": 1991}, {\"freq\": 0.4413592592798766, \"year\": 1992}, {\"freq\": 0.5928020070899416, \"year\": 1993}, {\"freq\": 0.7629264442506375, \"year\": 1994}, {\"freq\": 0.924057156395249, \"year\": 1995}, {\"freq\": 0.8933907622335828, \"year\": 1996}, {\"freq\": 0.8346328947691009, \"year\": 1997}, {\"freq\": 0.8258176224857741, \"year\": 1998}, {\"freq\": 0.876472704794767, \"year\": 1999}, {\"freq\": 0.8642304614563884, \"year\": 2000}, {\"freq\": 0.8570269255612705, \"year\": 2001}, {\"freq\": 0.9851188165724825, \"year\": 2002}, {\"freq\": 1.0109881385661583, \"year\": 2003}, {\"freq\": 1.0308707911121375, \"year\": 2004}, {\"freq\": 0.0, \"year\": 2005}, {\"freq\": 0.9570194309599784, \"year\": 2006}, {\"freq\": 1.0263457003749132, \"year\": 2007}, {\"freq\": 1.012698230291887, \"year\": 2008}, {\"freq\": 1.1145748668511717, \"year\": 2009}, {\"freq\": 1.0640207163551523, \"year\": 2010}, {\"freq\": 1.3322379376956723, \"year\": 2011}, {\"freq\": 0.8561751898521152, \"year\": 2012}, {\"freq\": 0.876639393441093, \"year\": 2013}, {\"freq\": 0.9633856708579805, \"year\": 2014}, {\"freq\": 0.8964075615949246, \"year\": 2015}]}};\n",
"var selector = \"#d6e278d4-8893-460d-84ef-1ee67290a90a\";\n",
"var type = \"vega-lite\";\n",
"\n",
"var output_area = this;\n",
"require(['nbextensions/jupyter-vega/index'], function(vega) {\n",
" vega.render(selector, spec, type, output_area);\n",
"}, function (err) {\n",
" if (err.requireType !== 'scripterror') {\n",
" throw(err);\n",
" }\n",
"});\n"
]
},
"metadata": {
"jupyter-vega": "#d6e278d4-8893-460d-84ef-1ee67290a90a"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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"
},
"metadata": {
"jupyter-vega": "#d6e278d4-8893-460d-84ef-1ee67290a90a"
},
"output_type": "display_data"
}
],
"source": [
"from altair import Chart, Bin, X, Axis\n",
"import pandas as pd\n",
"\n",
"data = pd.DataFrame({'year': list(range(1922,2016)), 'freq': manuel_1000ct})\n",
"chart = Chart(data).mark_line().encode(\n",
" x='year:N',\n",
" y='freq:Q',\n",
")\n",
"chart"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Es _parecido_, pero no igual 😔. El 0 en 2005 no coincide con la fuente, sospecho algun problema de comparacion de strings."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Mirá, mamá: sin base de datos."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El tamaño de la matriz `FREQS` es relativamente chico, apenas 2.13 gigabytes en memoria."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.132160872220993"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"FREQS.nbytes / 1024**3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El diccionario de nombres (`NAMES`) tampoco ocupa mucho; 160 megabytes."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"160.0000991821289"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.getsizeof(NAMES) / 1024**2"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Este pequeño ejercicio se puede exponer a través de un _endpoint_ HTTP muy simple que mantenga esta matriz `numpy` en memoria y envíe los datos serializados en la respuesta.\n",
"\n",
"Con eso, estimo, se pueden mejorar bastante la estabilidad y robustez del servicio."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment