Supongamos que tenemos un fichero de texto encuesta con los datos de una encuesta realizada por un agricultor de rábanos. Dicho fichero recoge información de las preferencias de los consumidores acerca de las distintas variedades.
El fichero dispone de casi 700 opiniones de usuarios. Abre el fichero para ver el contenido.
%pwd
en la siguiente celda.
In [1]:
# Sol:
fichero = open("../datos/radishsurvey.txt")
for i in range(10):
print(fichero.readline())
Escribe una función llamada clientes que devuelva la lista de clientes que han votado por alguna variedad de rábanos.
Nota: El cliente número 15 en la lista es "Jonathan Rolph".
In [2]:
# Sol:
fichero = open("../datos/radishsurvey.txt")
def clientes():
listaClientes = []
for linea in fichero:
nuevaLinea = linea.strip()
#print(nuevaLinea.split(' - '))
cliente = nuevaLinea.split(' - ')[0]
listaClientes.append(cliente)
return listaClientes
clientes()[15]
Out[2]:
In [3]:
fichero.close()
El agricultor desea conocer el número total de votos que ha recibido la variedad de rábanos 'White Icicle'. Define una función denominada votosWI que calcula el dato pedido.
Nota: El resultado es: 59 votos.
In [4]:
# Sol:
# Abrimos el archivo con los datos en modo lectura
fichero = open("../datos/radishsurvey.txt")
def votosWI():
# Inicializamos la variable para contar los votos a 0
cont_votos = 0
# Recorremos todo el archivo comprendido en la variable 'fichero'
for linea in fichero:
# Para cada valor de la variable 'linea' contenida en 'fichero' quitamos los saltos de linea
# defininendo una nueva variable 'lineaSaltos'
lineaSaltos = linea.strip()
# Definimos una variable 'lineaSeparador' para eliminar los espacios y el símbolo -
lineaSeparador = lineaSaltos.split(' - ')
if lineaSeparador[1] == 'White Icicle':
cont_votos = cont_votos + 1
return cont_votos
votosWI()
Out[4]:
Generaliza la función anterior y define una función que calcule el número de votos que ha recibido una variedad cualquiera de rábanos.
Nota: La variedad Snow Belle ha recibido 58 votos.
In [5]:
# Sol:
# Abrimos el archivo con los datos en modo lectura
fichero = open("../datos/radishsurvey.txt")
def votos(rabano):
# Inicializamos la variable para contar los votos a 0
contadorVotos = 0
# Recorremos todo el archivo comprendido en la variable 'fichero'
for linea in fichero:
# Para cada valor de la variable 'linea' contenida en 'fichero' quitamos los saltos de linea
# defininendo una nueva variable 'lineaSaltos'
lineaSaltos = linea.strip()
# Definimos una variable 'lineaSeparador' para eliminar los espacios y el símbolo -
lineaSeparador = lineaSaltos.split(' - ')
# Comparamos la variable 'rabano' introducida al llamar a la función con los valores de la lista 'lineaSeparador'
# lineaSeparador[1] especifica que se comparará con los valores de la posición 1
if rabano == lineaSeparador[1]:
# Sumamos 1 voto al contador
contadorVotos = contadorVotos + 1
return contadorVotos
votos('Snow Belle')
Out[5]:
Define una función llamada clientesPorVariedad que reciba como parámetro una variedad de rábano y devuelva la lista de clientes que han votado por esa variedad. Ten en cuenta que esta función es casi idéntica que la anterior.
Nota: Prueba con la variedad de rábanos White Icicle. La solución será una lista donde los primeros elementos son:
['Luke Komine', 'Bailey Derrington', 'Tyler Forbes', 'Gianfranco Cremonesi', 'Tao Hsiao', ...]
In [6]:
# Sol:
fichero = open("../datos/radishsurvey.txt")
def clientesPorVariedad(rabano):
listaClientes = []
for linea in fichero:
lineaSaltos = linea.strip()
lineaSeparador = lineaSaltos.split(' - ')
if rabano == lineaSeparador[1]:
listaClientes.append(lineaSeparador[0])
return listaClientes
clientesPorVariedad('White Icicle')
Out[6]:
Al agricultor le gustaría conocer el número de votos recibidos por cada variedad. Define una función llamada votos_por_variedad que devuelva la información del número de votos por variedad. Usa un diccionario para almacenar esa información. La clave del diccionario es la variedad y el valor es un entero que representa el número de votos.
In [7]:
fichero = open("../datos/radishsurvey.txt")
def votos_por_variedad():
dicRabanos = {}
listaRabanos = []
for linea in fichero:
lineaSaltos = linea.strip()
lineaSeparador = lineaSaltos.split(' - ')
listaRabanos.append(lineaSeparador[1])
tipoRabano = lineaSeparador[1]
if tipoRabano in lineaSeparador[1]:
dicRabanos[lineaSeparador[1]] = listaRabanos.count(tipoRabano)
return dicRabanos
votos_por_variedad()
Out[7]:
Observa la solución. Si te das cuenta, en el diccionario aparecen variedades con minúscula y mayúscula ('white icicle' y 'White Icicle'). También aparecen variedades con espacios en blanco al principio. Un desastre de datos!.
Tenemos que hacer una limpieza de datos para solventar el problema anterior.
El diccionario generado es el siguiente:
{'April Cross': 72, 'Bunny Tail': 72, 'Champion': 76, 'Cherry Belle': 1, 'Cherry Belle': 57, 'Daikon': 63, 'French Breakfast': 72, 'Plum Purple': 1, 'Plum Purple': 56, 'Red King': 56, 'Sicily Giant': 1, 'Sicily Giant': 56, 'Snow Belle': 63, 'White Icicle': 65}
Pero aún salen cosas raras. Fíjate en las variedades 'Sicily Giant' y 'Sicily Giant'. Deberían ser la misma variedad.
In [2]:
# Sol:
fichero = open("../datos/radishsurvey.txt")
def votos_por_variedad():
dicRabanos = {}
listaRabanos = []
votos = 0
for linea in fichero:
lineaSaltos = linea.strip()
lineaMayus = lineaSaltos.title()
lineaEspacios = lineaMayus.replace(' ',' ')
lineaSeparador = lineaEspacios.split(' - ')
listaRabanos.append(lineaSeparador[1])
tipoRabano = lineaSeparador[1]
if tipoRabano in lineaSeparador[1]:
dicRabanos[lineaSeparador[1]] = listaRabanos.count(tipoRabano)
return dicRabanos
El agricultor desea guardar en un fichero de texto la lista de las variedades junto con el número de votos obtenidos.
In [3]:
# Sol:
ficheroW = open("../datos/resultado.txt", "w")
dic = votos_por_variedad()
for x,y in dic.items():
ficheroW.write(x + ': ' + str(y) + '\n')
ficheroW.close()
In [4]:
import matplotlib.pyplot as plt
import numpy as np
%pylab inline
nombre = dic.keys()
votos = dic.values() # eje y
x = np.arange(len(votos)) # eje x
plt.bar(x, votos) # pinto diagrama de barras
plt.xticks(x, nombre, rotation=90); # etiqueto el eje x con los nombres de las variedades