diff --git a/episodes/01-run-quit.md b/episodes/01-run-quit.md index 94fa9e5..6df10a8 100644 --- a/episodes/01-run-quit.md +++ b/episodes/01-run-quit.md @@ -25,7 +25,7 @@ exercises: 0 Para ejecutar Python, vamos a utilizar [Jupyter Notebooks][jupyter] a través de [JupyterLab][jupyterlab] para el resto de este taller. Los cuadernos Jupyter son comunes -en la ciencia de datos y visualización y sirven como una experiencia conveniente para +en la ciencia de datos y visualización, y sirven como una experiencia conveniente para ejecutar código Python de forma interactiva donde podemos ver y compartir fácilmente los resultados de nuestro código Python. @@ -41,11 +41,11 @@ código Python inmediatamente dentro del cuaderno. JupyterLab tiene otras funciones muy útiles: - Puedes escribir, editar y copiar y pegar fácilmente bloques de código. -- Pestaña completa te permite acceder fácilmente a los nombres de las cosas que estás +- En pestaña completa te permite acceder fácilmente a los nombres de las cosas que estás utilizando y aprender más sobre ellas. - Te permite anotar tu código con enlaces, texto de distinto tamaño, viñetas, etc. para hacerlo más accesible a ti y a tus colaboradores. -- Le permite mostrar figuras junto al código que las produce para contar una historia +- Te permite mostrar figuras junto al código que las produce para contar una historia completa del análisis. Cada cuaderno contiene una o más celdas que contienen código, texto o imágenes. @@ -76,7 +76,7 @@ descargar e instalar Anaconda y JupyterLab ::::::::::::::::::::::::::::::::::::::::: callout -## JupyterLab? ¿Y para los cuadernos Jupyter? +## ¿JupyterLab? ¿Y para los cuadernos Jupyter? JupyterLab es la [siguiente etapa en la evolución del Jupyter Notebook](https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html#overview). @@ -235,7 +235,7 @@ archivos de texto, etc.) y otras actividades (terminales, consolas de código, e paneles de pestañas que se pueden redimensionar o subdividir. A continuación se muestra una captura de pantalla del Área de trabajo principal por defecto. -Si no ves la pestaña Lanzador, haz clic en el signo más azul bajo los menús "Archivo" y +Si no ves la pestaña Launcher, haz clic en el signo más azul bajo los menús "Archivo" y "Editar" y aparecerá.

JupyterLab Main Work Area @@ -250,11 +250,11 @@ defecto). ## Creación de un script Python - Para empezar a escribir un nuevo programa Python haz clic en el icono Archivo de Texto - bajo la cabecera *Otros* en la pestaña Lanzador del Área de Trabajo Principal. - - También puede crear un nuevo archivo de texto sin formato seleccionando *Nuevo -> - Archivo de texto* en el menú *Archivo* de la barra de menús. + bajo la cabecera *Others* en la pestaña Lanzador del Área de Trabajo Principal. + - También puede crear un nuevo archivo de texto sin formato seleccionando *New -> + Textfile* en el menú *File* de la barra de menús. - Para convertir este archivo de texto plano en un programa Python, selecciona la acción - *Guardar Archivo Como* del menú *Archivo* en la Barra de Menú y dale a tu nuevo + *Save file as* del menú *File* en la Barra de Menú y dale a tu nuevo archivo de texto un nombre que termine con la extensión `.py`. - La extensión `.py` permite a todo el mundo (incluido el sistema operativo) saber que este archivo de texto es un programa Python. @@ -262,9 +262,9 @@ defecto). ## Crear un cuaderno Jupyter -Para abrir un nuevo cuaderno haz clic en el icono Python 3 bajo la cabecera *Cuaderno* +Para abrir un nuevo cuaderno haz clic en el icono Python 3 bajo la cabecera *Notebook* en la pestaña Lanzador del área de trabajo principal. También puedes crear un nuevo -cuaderno seleccionando *Nuevo -> Cuaderno* en el menú *Archivo* de la Barra de Menús. +cuaderno seleccionando *New -> Notebook* en el menú *File* de la Barra de Menús. Notas adicionales sobre los cuadernos Jupyter. @@ -341,7 +341,7 @@ humanos. - Si pulsa Esc y Return alternativamente, el borde exterior de su celda de código cambiará de gris a azul. -- Estos son los modos **Comando** (gris) y **Edición** (azul) de tu bloc de notas. +- Estos son los modos **Command/Comando** (gris) y **Edit/Edición** (azul) de tu bloc de notas. - El modo Comando te permite editar las características del cuaderno, y el modo Edición cambia el contenido de las celdas. - En modo Comando (esc/gris), @@ -387,7 +387,7 @@ tu celda es azul). Escriba z. - Como queremos poder escribir muchas líneas de código en una sola celda, al pulsar la tecla Retorno cuando se está en modo Edición (azul) se mueve el cursor a la siguiente línea de la celda, igual que en un editor de texto. -- Necesitamos alguna otra forma de decirle al Cuaderno que queremos ejecutar lo que hay +- Necesitamos alguna otra forma de decirle al Notebook que queremos ejecutar lo que hay en la celda. - Al pulsar conjuntamente Mayús\+Retorno se ejecutará el contenido de la celda. @@ -592,7 +592,7 @@ comandos LaTeX para los símbolos "suma sobre" y "aproxima". ## Cerrar JupyterLab -- En la barra de menús, seleccione el menú "Archivo" y, a continuación, elija "Apagar" +- En la barra de menús, seleccione el menú "File" y, a continuación, elija "Shut down" en la parte inferior del menú desplegable. Se le pedirá que confirme que desea apagar el servidor JupyterLab (¡no olvide guardar su trabajo!). Haga clic en "Shut Down" para apagar el servidor JupyterLab. @@ -626,7 +626,7 @@ https://jupyterlab.readthedocs.io/en/stable/user/notebook.html - Los scripts de Python son archivos de texto sin formato. - Utiliza el Jupyter Notebook para editar y ejecutar Python. -- El Cuaderno dispone de los modos Comando y Edición. +- El Notebook dispone de los modos Command y Edition. - Utilizar el teclado y el ratón para seleccionar y editar celdas. - El Cuaderno convertirá Markdown en documentación con una bonita impresión. - Markdown hace la mayor parte de lo que hace HTML. diff --git a/episodes/03-types-conversion.md b/episodes/03-types-conversion.md index 66df17e..ebf21eb 100644 --- a/episodes/03-types-conversion.md +++ b/episodes/03-types-conversion.md @@ -234,7 +234,7 @@ print(type(3.4)) ## Solución -Es un flotador: los enteros se convierten automáticamente en flotadores cuando es +Es un float: los enteros se convierten automáticamente en floats cuando es necesario. ```python diff --git a/episodes/04-built-in.md b/episodes/04-built-in.md index ff0361b..672a295 100644 --- a/episodes/04-built-in.md +++ b/episodes/04-built-in.md @@ -137,13 +137,13 @@ round(3.712, 1) doble subrayado. ```python -my_string = 'Hello world!' # creation of a string object +my_string = 'Hello world!' # creación de un string -print(len(my_string)) # the len function takes a string as an argument and returns the length of the string +print(len(my_string)) # la función len toma un string y devuelve la longitud del string -print(my_string.swapcase()) # calling the swapcase method on the my_string object +print(my_string.swapcase()) # llamada al método swapcase de mi objeto my_string -print(my_string.__len__()) # calling the internal __len__ method on the my_string object, used by len(my_string) +print(my_string.__len__()) # llamando al método interno __len__ en el objeto my_string, usado por len(my_string) ``` @@ -156,10 +156,10 @@ hELLO WORLD! - Incluso puede verlos encadenados. Funcionan de izquierda a derecha. ```python -print(my_string.isupper()) # Not all the letters are uppercase -print(my_string.upper()) # This capitalizes all the letters +print(my_string.isupper()) # no todas las letras son mayúsculas +print(my_string.upper()) # esto lo convierte todo a mayúsculas -print(my_string.upper().isupper()) # Now all the letters are uppercase +print(my_string.upper().isupper()) # ahora son todo mayúsculas ``` ```output @@ -200,7 +200,7 @@ round(number, ndigits=None) - Ni siquiera intentará ejecutar el programa si no puede ser analizado. ```python -# Forgot to close the quote marks around the string. +# Olvidamos cerrar la comilla name = 'Feng ``` diff --git a/episodes/06-libraries.md b/episodes/06-libraries.md index 45473c8..149e608 100644 --- a/episodes/06-libraries.md +++ b/episodes/06-libraries.md @@ -1,5 +1,5 @@ --- -title: Bibliotecas +title: Librerías teaching: 10 exercises: 10 --- @@ -7,11 +7,11 @@ exercises: 10 ::::::::::::::::::::::::::::::::::::::: objectives -- Explicar qué son las bibliotecas de software y por qué los programadores las crean y +- Explicar qué son las librerías de software y por qué los programadores las crean y utilizan. -- Escribir programas que importen y utilicen módulos de la biblioteca estándar de +- Escribir programas que importen y utilicen módulos de la librería estándar de Python. -- Buscar y leer documentación de la biblioteca estándar de forma interactiva (en el +- Buscar y leer documentación de la librería estándar de forma interactiva (en el intérprete) y en línea. :::::::::::::::::::::::::::::::::::::::::::::::::: @@ -23,37 +23,37 @@ exercises: 10 :::::::::::::::::::::::::::::::::::::::::::::::::: -## La mayor parte de la potencia de un lenguaje de programación está en sus bibliotecas. +## La mayor parte de la potencia de un lenguaje de programación está en sus librerías. -- Una *biblioteca* es una colección de ficheros (llamados *módulos*) que contienen +- Una *librería* es una colección de ficheros (llamados *módulos*) que contienen funciones para ser usadas por otros programas. - También puede contener valores de datos (por ejemplo, constantes numéricas) y otras cosas. - - Se supone que los contenidos de la biblioteca están relacionados, pero no hay forma + - Se supone que los contenidos de la librería están relacionados, pero no hay forma de hacer cumplir esto. -- La [biblioteca estándar][stdlib] de Python es un extenso conjunto de módulos que +- La [librería estándar][stdlib] de Python es un extenso conjunto de módulos que vienen con el propio Python. -- Muchas bibliotecas adicionales están disponibles en [PyPI][pypi] (the Python Package +- Muchas librerías adicionales están disponibles en [PyPI][pypi] (the Python Package Index). -- Veremos más adelante cómo escribir nuevas bibliotecas. +- Veremos más adelante cómo escribir nuevas librerías. ::::::::::::::::::::::::::::::::::::::::: callout -## Bibliotecas y módulos +## librerías y módulos -Una biblioteca es una colección de módulos, pero a menudo los términos se usan -indistintamente, especialmente porque muchas bibliotecas sólo consisten en un único +Una librería es una colección de módulos, pero a menudo los términos se usan +indistintamente, especialmente porque muchas librerías sólo consisten en un único módulo, así que no te preocupes si los mezclas. :::::::::::::::::::::::::::::::::::::::::::::::::: -## Un programa debe importar un módulo de biblioteca antes de usarlo. +## Un programa debe importar un módulo de librería antes de usarlo. -- Utilice `import` para cargar un módulo de biblioteca en la memoria de un programa. +- Utilice `import` para cargar un módulo de librería en la memoria de un programa. - Luego refiérase a cosas del módulo como `module_name.thing_name`. - Python usa `.` para significar "parte de". -- Usando `math`, uno de los módulos de la biblioteca estándar: +- Usando `math`, uno de los módulos de la librería estándar: ```python import math @@ -71,7 +71,7 @@ cos(pi) is -1.0 - `math.cos(pi)` no funciona: la referencia a `pi` no "hereda" de algún modo la referencia de la función a `math`. -## Utilice `help` para conocer el contenido de un módulo de biblioteca. +## Utilice `help` para conocer el contenido de un módulo de librería. - Funciona igual que la ayuda para una función. @@ -104,11 +104,11 @@ FUNCTIONS ⋮ ⋮ ⋮ ``` -## Importar elementos específicos de un módulo de biblioteca para acortar programas. +## Importar elementos específicos de un módulo de librería para acortar programas. - Utilice `from ... import ...` para cargar sólo elementos específicos de un módulo de - biblioteca. -- Luego refiérase a ellos directamente sin el nombre de la biblioteca como prefijo. + librería. +- Luego refiérase a ellos directamente sin el nombre de la librería como prefijo. ```python from math import cos, pi @@ -120,10 +120,10 @@ print('cos(pi) is', cos(pi)) cos(pi) is -1.0 ``` -## Crear un alias para un módulo de biblioteca al importarlo para acortar programas. +## Crear un alias para un módulo de librería al importarlo para acortar programas. -- Utilice `import ... as ...` para dar un *alias* corto a una biblioteca al importarla. -- A continuación, haga referencia a los elementos de la biblioteca utilizando ese nombre +- Utilice `import ... as ...` para dar un *alias* corto a una librería al importarla. +- A continuación, haga referencia a los elementos de la librería utilizando ese nombre abreviado. ```python @@ -136,7 +136,7 @@ print('cos(pi) is', m.cos(m.pi)) cos(pi) is -1.0 ``` -- Comúnmente utilizado para bibliotecas de uso frecuente o con nombres largos. +- Comúnmente utilizado para librerías de uso frecuente o con nombres largos. - Por ejemplo, la librería de ploteo `matplotlib` a menudo tiene el alias `mpl`. - Pero puede hacer que los programas sean más difíciles de entender, ya que los lectores deben aprender los alias de su programa. @@ -147,7 +147,7 @@ cos(pi) is -1.0 1. ¿Qué función del módulo `math` puedes usar para calcular una raíz cuadrada *sin* usar `sqrt`? -2. Dado que la biblioteca contiene esta función, ¿por qué existe `sqrt`? +2. Dado que la librería contiene esta función, ¿por qué existe `sqrt`? ::::::::::::::: solution @@ -161,7 +161,7 @@ cos(pi) is -1.0 programación, por lo que tiene sentido proporcionar una función especial para este caso común específico. -Además, el diseño de la biblioteca `math` de Python tiene su origen en el estándar C, +Además, el diseño de la librería `math` de Python tiene su origen en el estándar C, que incluye tanto `sqrt(x)` como `pow(x,y)`, por lo que un poco de la historia de la programación se muestra en los nombres de las funciones de Python. @@ -181,7 +181,7 @@ Desea seleccionar un carácter aleatorio de una cadena: bases = 'ACTTGCTTGAC' ``` -1. ¿Qué módulo de [biblioteca estándar][stdlib] podría ayudarle? +1. ¿Qué módulo de [librería estándar][stdlib] podría ayudarle? 2. ¿Qué función seleccionarías de ese módulo? ¿Existen alternativas? 3. Intenta escribir un programa que utilice la función. @@ -344,9 +344,9 @@ cuando hay convenciones claras de abreviación. ::::::::::::::::::::::::::::::::::::::: challenge -## ¡Hay Muchas Formas De Importar Bibliotecas! +## ¡Hay Muchas Formas De Importar Librerías! -Empareja las siguientes sentencias de impresión con las llamadas a biblioteca +Empareja las siguientes sentencias de impresión con las llamadas a librería apropiadas. Comandos de impresión: @@ -355,7 +355,7 @@ Comandos de impresión: 2. `print("sin(pi/2) =", m.sin(m.pi/2))` 3. `print("sin(pi/2) =", math.sin(math.pi/2))` -Llamadas a bibliotecas: +Llamadas a librerías: 1. `from math import sin, pi` 2. `import math` @@ -366,24 +366,24 @@ Llamadas a bibliotecas: ## Solución -1. Llamadas a las bibliotecas 1 y 4. Para referirse directamente a `sin` y `pi` sin el - nombre de la biblioteca como prefijo, es necesario utilizar la sentencia `from ... - import ...`. Mientras que la llamada a biblioteca 1 importa específicamente las dos - funciones `sin` y `pi`, la llamada a biblioteca 4 importa todas las funciones del +1. Llamadas a las librerías 1 y 4. Para referirse directamente a `sin` y `pi` sin el + nombre de la librería como prefijo, es necesario utilizar la sentencia `from ... + import ...`. Mientras que la llamada a librería 1 importa específicamente las dos + funciones `sin` y `pi`, la llamada a librería 4 importa todas las funciones del módulo `math`. -2. Llamada a la biblioteca 3. Aquí se hace referencia a `sin` y `pi` con un nombre de - biblioteca abreviado `m` en lugar de `math`. La llamada a biblioteca 3 hace +2. Llamada a la librería 3. Aquí se hace referencia a `sin` y `pi` con un nombre de + librería abreviado `m` en lugar de `math`. La llamada a librería 3 hace exactamente eso utilizando la sintaxis `import ... as ...` - crea un alias para `math` con el nombre abreviado `m`. -3. Llamada a la biblioteca 2. Aquí se hace referencia a `sin` y `pi` con el nombre de - biblioteca normal `math`, por lo que basta con la llamada normal `import ...`. +3. Llamada a la librería 2. Aquí se hace referencia a `sin` y `pi` con el nombre de + librería normal `math`, por lo que basta con la llamada normal `import ...`. -**Nota:** aunque la llamada a biblioteca 4 funciona, importar todos los nombres de un +**Nota:** aunque la llamada a librería 4 funciona, importar todos los nombres de un módulo usando una importación comodín [no es recomendable][pep8-imports] ya que hace que no quede claro qué nombres del módulo se usan en el código. En general, es mejor hacer las importaciones tan específicas como sea posible y sólo importar lo que el código -utiliza. En la llamada a biblioteca 1, la sentencia `import` nos dice explícitamente que -la función `sin` es importada del módulo `math`, pero la llamada a biblioteca 4 no +utiliza. En la llamada a librería 1, la sentencia `import` nos dice explícitamente que +la función `sin` es importada del módulo `math`, pero la llamada a librería 4 no transmite esta información. @@ -420,7 +420,7 @@ Lo más probable es que encuentres esta versión más fácil de leer ya que es m La principal razón para no utilizar esta forma de importación es evitar conflictos de nombres. Por ejemplo, no importaría `degrees` de esta forma si también quisiera usar el nombre `degrees` para una variable o función propia. O si también importaras una función -llamada `degrees` de otra biblioteca. +llamada `degrees` de otra librería. @@ -472,11 +472,11 @@ ValueError: math domain error :::::::::::::::::::::::::::::::::::::::: keypoints -- La mayor parte de la potencia de un lenguaje de programación está en sus bibliotecas. -- Un programa debe importar un módulo de biblioteca para poder utilizarlo. -- Utilice `help` para conocer el contenido de un módulo de biblioteca. -- Importa elementos específicos de una biblioteca para acortar programas. -- Crea un alias para una biblioteca al importarla para acortar programas. +- La mayor parte de la potencia de un lenguaje de programación está en sus librerías. +- Un programa debe importar un módulo de librería para poder utilizarlo. +- Utilice `help` para conocer el contenido de un módulo de librería. +- Importa elementos específicos de una librería para acortar programas. +- Crea un alias para una librería al importarla para acortar programas. :::::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/08-data-frames.md b/episodes/08-data-frames.md index dd96dfe..8fc14bc 100644 --- a/episodes/08-data-frames.md +++ b/episodes/08-data-frames.md @@ -594,48 +594,48 @@ Sugiere distintas formas de realizar las siguientes operaciones en un DataFrame: 1\. Accede a una sola columna: ```python -# by name +# por nombre data["col_name"] # as a Series data[["col_name"]] # as a DataFrame -# by name using .loc +# por nombre utilizando .loc data.T.loc["col_name"] # as a Series data.T.loc[["col_name"]].T # as a DataFrame -# Dot notation (Series) +# notación punto (Series) data.col_name -# by index (iloc) +# por índice (iloc) data.iloc[:, col_index] # as a Series data.iloc[:, [col_index]] # as a DataFrame -# using a mask +# utilizando una máscara data.T[data.T.index == "col_name"].T ``` 2\. Accede a una única fila: ```python -# by name using .loc +# por nombre utilizando .loc data.loc["row_name"] # as a Series data.loc[["row_name"]] # as a DataFrame -# by name +# por nombre data.T["row_name"] # as a Series data.T[["row_name"]].T # as a DataFrame -# by index +# por índice data.iloc[row_index] # as a Series data.iloc[[row_index]] # as a DataFrame -# using mask +# utilizando máscara data[data.index == "row_name"] ``` 3\. Accede a un elemento individual del DataFrame: ```python -# by column/row names +# por nombre de columna/fila data["column_name"]["row_name"] # as a Series data[["col_name"]].loc["row_name"] # as a Series @@ -650,78 +650,78 @@ data.loc[["row_name"], "col_name"] # as a Series. Preserves index. Column name data.loc["row_name", ["col_name"]] # as a Series. Index is moved to `.name.` Sets index to column name. data.loc[["row_name"], ["col_name"]] # as a DataFrame (preserves original index and column name) -# by column/row names: Dot notation +# nombres de columna/fila: notacíon de punto data.col_name.row_name -# by column/row indices +# índices de columna/fila data.iloc[row_index, col_index] # as a value data.iloc[[row_index], col_index] # as a Series. Preserves index. Column name is moved to `.name` data.iloc[row_index, [col_index]] # as a Series. Index is moved to `.name.` Sets index to column name. data.iloc[[row_index], [col_index]] # as a DataFrame (preserves original index and column name) -# column name + row index +# nombre columna + índice fila data["col_name"][row_index] data.col_name[row_index] data["col_name"].iloc[row_index] -# column index + row name +# índice columna + nombre fila data.iloc[:, [col_index]].loc["row_name"] # as a Series data.iloc[:, [col_index]].loc[["row_name"]] # as a DataFrame -# using masks +# utilizando máscaras data[data.index == "row_name"].T[data.T.index == "col_name"].T ``` 4\. Accede a varias columnas: ```python -# by name +# por nombre data[["col1", "col2", "col3"]] data.loc[:, ["col1", "col2", "col3"]] -# by index +# por índice data.iloc[:, [col1_index, col2_index, col3_index]] ``` 5\. Accede a varias filas ```python -# by name +# por nombre data.loc[["row1", "row2", "row3"]] -# by index +# por índice data.iloc[[row1_index, row2_index, row3_index]] ``` 6\. Accede a un subconjunto de filas y columnas específicas ```python -# by names +# por nombres data.loc[["row1", "row2", "row3"], ["col1", "col2", "col3"]] -# by indices +# por indices data.iloc[[row1_index, row2_index, row3_index], [col1_index, col2_index, col3_index]] -# column names + row indices +# nombre columna + indice fila data[["col1", "col2", "col3"]].iloc[[row1_index, row2_index, row3_index]] -# column indices + row names +# índice columna + nombre fila data.iloc[:, [col1_index, col2_index, col3_index]].loc[["row1", "row2", "row3"]] ``` 7\. Accede a un subconjunto de rangos de filas y columnas ```python -# by name +# por nombre data.loc["row1":"row2", "col1":"col2"] -# by index +# por índice data.iloc[row1_index:row2_index, col1_index:col2_index] -# column names + row indices +# nombre columna + indice fila data.loc[:, "col1_name":"col2_name"].iloc[row1_index:row2_index] -# column indices + row names +# índice columna + nombre fila data.iloc[:, col1_index:col2_index].loc["row1":"row2"] ``` diff --git a/episodes/09-plotting.md b/episodes/09-plotting.md index 332f414..09b3fc7 100644 --- a/episodes/09-plotting.md +++ b/episodes/09-plotting.md @@ -83,15 +83,15 @@ import pandas as pd data = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country') -# Extract year from last 4 characters of each column name -# The current column names are structured as 'gdpPercap_(year)', -# so we want to keep the (year) part only for clarity when plotting GDP vs. years -# To do this we use replace(), which removes from the string the characters stated in the argument -# This method works on strings, so we use replace() from Pandas Series.str vectorized string functions +# Extraer el año de los últimos 4 caracteres de cada nombre de columna +# Los nombres actuales de las columnas tienen la estructura 'gdpPercap_(año)', +# por lo que queremos conservar solo la parte del (año) para mayor claridad al graficar PIB vs. años +# Para ello usamos replace(), que elimina de la cadena los caracteres indicados en el argumento +# Este método funciona con cadenas, así que usamos replace() desde las funciones vectorizadas de cadenas de Pandas: Series.str years = data.columns.str.replace('gdpPercap_', '') -# Convert year values to integers, saving results back to dataframe +# Convierte los valores de los años a integers, guardando los resultados de vuelta data.columns = years.astype(int) diff --git a/episodes/14-looping-data-sets.md b/episodes/14-looping-data-sets.md index 06ce1ff..351e111 100644 --- a/episodes/14-looping-data-sets.md +++ b/episodes/14-looping-data-sets.md @@ -61,7 +61,7 @@ dtype: float64 - Los patrones más comunes son: - `*` significa "coincide con cero o más caracteres" - `?` significa "coincide exactamente con un carácter" -- La biblioteca estándar de Python contiene el módulo +- La librería estándar de Python contiene el módulo [`glob`](https://docs.python.org/3/library/glob.html) para proporcionar la funcionalidad de coincidencia de patrones - El módulo [`glob`](https://docs.python.org/3/library/glob.html) contiene una función @@ -208,22 +208,22 @@ import matplotlib.pyplot as plt fig, ax = plt.subplots(1,1) for filename in glob.glob('data/gapminder_gdp*.csv'): dataframe = pd.read_csv(filename) - # extract from the filename, expected to be in the format 'data/gapminder_gdp_.csv'. - # we will split the string using the split method and `_` as our separator, - # retrieve the last string in the list that split returns (`.csv`), - # and then remove the `.csv` extension from that string. - # NOTE: the pathlib module covered in the next callout also offers - # convenient abstractions for working with filesystem paths and could solve this as well: + # extraer del nombre de archivo, que se espera en el formato 'data/gapminder_gdp_.csv' + # dividiremos la cadena utilizando el método split y `_` como separador, + # recuperaremos la última cadena de la lista que devuelve split (`.csv`), + # y luego eliminaremos la extensión `.csv` de esa cadena. + # NOTA: el módulo pathlib, que se cubre en el siguiente apartado, también ofrece + # abstracciones convenientes para trabajar con rutas del sistema de archivos y podría resolver esto también: # from pathlib import Path # region = Path(filename).stem.split('_')[-1] region = filename.split('_')[-1][:-4] - # extract the years from the columns of the dataframe + # exreae los años de las columnas del dataframe headings = dataframe.columns[1:] years = headings.str.split('_').str.get(1) - # pandas raises errors when it encounters non-numeric columns in a dataframe computation - # but we can tell pandas to ignore them with the `numeric_only` parameter + # pandas tira errores cuando se encuentra con columnas no-numŕeicas en la computación de un dataframe + # pero podemos decir a pandas que los ignore con el parámetro 'numeric_only` dataframe.mean(numeric_only=True).plot(ax=ax, label=region) - # NOTE: another way of doing this selects just the columns with gdp in their name using the filter method + # NOTA: otra manera de hacer esto es seleccionar solo las columnas con gdp en su nombre utilizando el método de filtraje # dataframe.filter(like="gdp").mean().plot(ax=ax, label=region) # set the title and labels ax.set_title('GDP Per Capita for Regions Over Time') diff --git a/episodes/16-writing-functions.md b/episodes/16-writing-functions.md index e4b04a7..3db72c4 100644 --- a/episodes/16-writing-functions.md +++ b/episodes/16-writing-functions.md @@ -398,13 +398,13 @@ y éste imprimirá una etiqueta. import random for i in range(10): - # simulating the mass of a chicken egg - # the (random) mass will be 70 +/- 20 grams + # simulando la masa de un huevo de gallina + # la masa (aleatoria) será de 70 +/- 20 gramos mass = 70 + 20.0 * (2.0 * random.random() - 1.0) print(mass) - # egg sizing machinery prints a label + # la maquinaria de los huevos de gallina imprime una etiqueta if mass >= 85: print("jumbo") elif mass >= 70: @@ -420,12 +420,12 @@ evitar repetirlo, podríamos plegarlo en una función, `get_egg_label()`. Revisa programa para usar la función tendríamos esto: ```python -# revised version +# versíón revisada import random for i in range(10): - # simulating the mass of a chicken egg - # the (random) mass will be 70 +/- 20 grams + # simulando la masa de un huevo de gallina + # la masa (aleatoria) será de 70 +/- 20 gramos mass = 70 + 20.0 * (2.0 * random.random() - 1.0) print(mass, get_egg_label(mass)) @@ -447,7 +447,7 @@ for i in range(10): ```python def get_egg_label(mass): - # egg sizing machinery prints a label + # la maquinaria de los huevos de gallina imprime una etiqueta egg_label = "Unlabelled" if mass >= 90: egg_label = "warning: egg might be dirty" diff --git a/episodes/18-style.md b/episodes/18-style.md index 651f79b..94bbc22 100644 --- a/episodes/18-style.md +++ b/episodes/18-style.md @@ -234,10 +234,10 @@ He aquí una solución. ```python def string_machine(input_string, iterations): """ - Takes input_string and generates a new string with -'s and *'s - corresponding to characters that have identical adjacent characters - or not, respectively. Iterates through this procedure with the resultant - strings for the supplied number of iterations. + Toma una cadena de entrada (input_string) y genera una nueva cadena con '-' y '*' + según si los caracteres tienen o no caracteres adyacentes idénticos. + Itera este procedimiento con las cadenas resultantes durante el número de + iteraciones especificado. """ print(input_string) input_string_length = len(input_string)