Ejercicios 6

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.

  • Cada línea del fichero tiene el siguiente formato: $$ nombre\_cliente \ - \ variedad\_de\_rábano $$

1 Ejercicio

El fichero dispone de casi 700 opiniones de usuarios. Abre el fichero para ver el contenido.

  1. Consulta el directorio de trabajo de Ipython. Para ello ejecuta el comando mágico %pwd en la siguiente celda.
  2. Descárgate el fichero encuesta en tu directorio de trabajo
  3. Ábrelo con la instrucción open.
  4. Realiza un print de las 10 primeras líneas del fichero. Utiliza un bucle for de 10 iteraciones para leer el contenido del fichero.

In [1]:
# Sol:
fichero = open("../datos/radishsurvey.txt")
for i in range(10):
    print(fichero.readline())


Evie Pulsford - April Cross

Matilda Condon - April Cross

Samantha Mansell - Champion

geronima trevisani - cherry belle

Alexandra Shoebridge - Snow Belle

Sarah Ahuia Ova - Snow Belle

Emma Slattery - Bunny Tail

Fabiana  Milanesi - Champion

Makayla McMinn - Snow Belle

Julian O'Leary - Sicily Giant

2 Ejercicio

Escribe una función llamada clientes que devuelva la lista de clientes que han votado por alguna variedad de rábanos.

  1. Utiliza un bucle for para leer el contenido completo del fichero.
  2. Usa la función strip para eliminar los saltos de línea.
  3. Usa la función split para separar el nombre del cliente y la variedad de rábano
  4. Utiliza la función append para añadir el nombre del cliente a una lista de clientes (previamente inicializada).
  5. No te olvides de realizar un return para devolver el resultado.

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]:
'Jonathan Rolph'

In [3]:
fichero.close()

3 Ejercicio

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.

  1. Utiliza una variable entera inicializada a 0 para almacenar el contador de votos.
  2. Utiliza un bucle for para leer el contenido del fichero.
  3. Usa la función strip para eliminar los saltos de línea.
  4. Usa la función split para separar el nombre del cliente y la variedad de rábano
  5. Usa la instrucción if para comprobar si la variedad de rábano es 'White Icicle'. En caso afirmativo suma 1 al contador de votos.
  6. No te olvides de devolver el número de votos mediante la instrucción return

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]:
59

4 Ejercicio

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.

  • Define una función llamada votos que reciba como parámetro una variedad de rábano y devuelva la cantidad de votos.

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]:
58

5 Ejercicio

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]:
['Luke Komine',
 'Bailey Derrington',
 'Tyler Forbes',
 'Gianfranco Cremonesi',
 'Tao Hsiao',
 'Emily Walters',
 'Thomas Oom',
 'Stephanie Schnaars',
 'Anna Denning',
 'Ruby Fox',
 'Ali Dedman',
 'Sarah Milford',
 'Hudson Dodgshun',
 'Lara Salting',
 'Amelie Farber',
 'Isabella Pardey',
 'Zhi Chin',
 'Caitlyn Mullah',
 'Taj Shackell',
 'Xin Qian Shih',
 'Abigail Clark',
 'Bianca Knopwood',
 'Mia Legg',
 'Lilian Macquarie',
 'Zachary Bass',
 'Hayley Coverdale',
 'David Moynihan',
 'Angus De Mestre',
 'Emily Plante',
 'Kiara Maxwell-Mahon',
 'Alex Falk',
 'George Carandini',
 'Makayla Fairbairn',
 'Yue Wan Yeh',
 'Timothy Beeton',
 'Blake Hurst',
 'Zhen Juan Tsai',
 'Christopher Moss',
 'Alicia Farmer',
 'Jasmine Baughan',
 'Dominic Nangle',
 'Yue Yan Hu',
 'Adele Buccho',
 'Archie Mathy',
 'Pia Folliero',
 'Koby Ledger',
 'Jasper Harper',
 'Patrick Tilly',
 'Isabelle Camden',
 'Amy Clunie',
 'Declan Winston',
 'James Luke',
 'Riley Stewart',
 'Rory Evenden',
 'Eleuterio Lombardo',
 'Yong Hsiao',
 'Toby Queale',
 'Jasper Alfred',
 'Durante Ferri']

6 Ejercicio

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.

  1. Crea un diccionario vacío.
  2. Utiliza un bucle for para leer el contenido del fichero.
  3. Usa la función strip para eliminar los saltos de línea.
  4. Usa la función split para separar el nombre del cliente y la variedad de rábano
  5. Usa la instrucción if para comprobar si la variedad está en el diccionario. En caso afirmativo suma 1 al valor. En caso contrario añade una nueva variedad al diccionario.
  6. No te olvides de devolver el diccionario pedido mediante la instrucción return.

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]:
{' Cherry Belle': 2,
 ' Daikon': 1,
 ' Plum Purple': 1,
 ' Red King': 1,
 ' Sicily Giant': 1,
 ' Snow Belle': 2,
 ' White Icicle': 1,
 ' plum purple': 1,
 'April Cross': 67,
 'April cross': 1,
 'Bunny Tail': 68,
 'Champion': 75,
 'Cherry  Belle': 1,
 'Cherry Belle': 53,
 'Daikon': 58,
 'French Breakfast': 65,
 'Plum  Purple': 1,
 'Plum Purple': 53,
 'Red King': 52,
 'Sicily  Giant': 1,
 'Sicily Giant': 52,
 'Snow Belle': 58,
 'White Icicle': 59,
 'april cross': 4,
 'bunny tail': 4,
 'champion': 1,
 'cherry belle': 2,
 'daikon': 4,
 'french breakfast': 7,
 'plum purple': 1,
 'red king': 3,
 'sicily giant': 3,
 'snow belle': 3,
 'white icicle': 5}

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.

  • Corrige la función anterior haciendo uso de la función strip y title en cada variedad de rábanos.

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.

  • Usa el método replace para sustituir las apariciones de dos espacios en blanco por un solo espacio en blanco.

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

7 Ejercicio

El agricultor desea guardar en un fichero de texto la lista de las variedades junto con el número de votos obtenidos.

  • Abre un fichero llamado resultado.txt en modo escritura
  • Invoca la función votos_por_variedad para obtener el diccionario que contiene el número de votos por variedad.
  • Utiliza la instrucción for para iterar sobre los elementos del diccionario y escribir en el fichero.
  • Cierra el fichero.

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()

Esto no es un ejercicio. Solo ejecuta a ver qué sale ...


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


Populating the interactive namespace from numpy and matplotlib

Referencias