8 2021-06-05
Examen de Inteligencia de los Negocios
Grado: Inteligencia de los Negocios
Fecha: 5 de junio de 2021
Ejercicio 8.1 A veces, al tratar con tuplas, podemos tener un problema en el que necesitamos extraer solo \(k\) elementos extremos, es decir, los \(k\) máximos y mínimos. Este problema puede tener aplicaciones en campos como el desarrollo web y la ciencia de datos. Desarrollar un programa que dada una tupla y un número \(k\) devuelva otra tupla con los \(k\) elementos máximos y mínimos.
Ejemplo:
La tupla original es: (5, 20, 3, 7, 6, 8)
La tupla con los k = 2 máximos y mínimos es: (3, 5, 8, 20) Solución 1
# Definimos la tupla
tupla = (5, 20, 3, 7, 6, 8)
# Preguntamos por el valor de k
k = int(input('¿Cuántos máximos y mínimos quieres? '))
# Convertimos la tupla en una lista para poder eliminar elmentos.
lista = list(tupla)
# Condicional para ver si la lista contiene suficientes elementos.
if len(lista) < 2 * k:
print('No se pueden extraer', k, 'máximos y mínimos de la tupla porque solo cotinene', len(lista), 'elementos.')
else:
# Ordenamos la lista
lista.sort()
# Creamos una tupla concatenando los k primeros y los k últimos elementos de la lista ordenada.
tupla2 = tuple(lista[:k] + lista[-k:])
print(tupla2)(3, 5, 8, 20)
Solución 2
# Definimos la tupla
tupla = (5, 20, 3, 7, 6, 8)
# Preguntamos por el valor de k
k = int(input('¿Cuántos máximos y mínimos quieres? '))
# Convertimos la tupla en una lista para poder eliminar elmentos.
lista = list(tupla)
# Condicional para ver si la lista contiene suficientes elementos.
if len(lista) < 2 * k:
print('No se pueden extraer ', k, 'máximos y mínimos de la tupla porque solo cotinene', len(lista), 'elementos.')
else:
# Creamos una lista vacía para ir añadiendo los máximos y mínimos.
lista2 = []
# Bucle iterativo para realizar k iteraciones. i toma valores de 0 a k-1.
for i in range(k):
# Añadimos a la lista2 el mínimo de la lista.
lista2.append(min(lista))
# Eliminiamos de la lista el mínimo.
lista.remove(min(lista))
# Añadimos a la lista 2 el máximo de la lista.
lista2.append(max(lista))
# Eliminiamos de la lista el máximo.
lista.remove(max(lista))
# Convertimos la lista2 en una tupla.
tupla2 = tuple(lista2)
print(tupla2)(3, 20, 5, 8)
Ejercicio 8.2 Construir un programa que evalúe operaciones aritméticas sencillas (sumas, restas, productos, cocientes y potencias) introducidas por el usuario. El programa preguntará por la operación a realizar y el usuario tecleará por pantalla la operación con el siguiente formato:
operando1 operador operando2
Después el programa debe mostrar por pantalla el resultado de la operación con el siguiente formato:
operando1 operador operando2 = resultado
El programa debe preguntar al usuario hasta que este introduzca la palabra “salir”. También mostrará un mensaje de error si el usuario introduce un número de valores distinto de 3 y si introduce un operador no válido.
Ejemplo:
Introduce la operación con el formato operando1 operador operando2: 2+3
Entrada no válida. Debes introducir exactamente tres valores separados por espacio.
Introduce la operación con el formato operando1 operador operando2: 2 + 3
2 + 3 = 5.0
Introduce la operación con el formato operando1 operador operando2: 4 ^ 2
Operación no válida.
Introduce la operación con el formato operando1 operador operando2: 4 ** 2
4 ** 2 = 16.0
Introduce la operación con el formato operando1 operador operando2: salir # Bucle condicional para preguntar al usuario hasta que introduzca salir.
while True:
# Preguntamos al usuario por la operación a realizar
operacion = input("Introduce la operación con el formato operando1 operador operando2:")
# Si el usuario introduce salir salimos del bucle y terminamos
if operacion.lower() == 'salir':
break
# Dividimos la entrada por el espacio en blanco y obtenemos la lista de valores
operacion = operacion.split()
# Condicional para ver si la lista no contiene 3 valores. En tal caso mostramos un mensaje de error.
if len(operacion) != 3:
print('Operación no válida. Se necesitan tres argumentos separados por espacio.')
# Si entrada es válida hacemos la operación.
else:
# Creamos variables para los operandos y el operador
a = float(operacion[0])
operador = operacion[1]
b = float(operacion[2])
if operador == "+":
print(a, operador, b, '=', a + b)
elif operador == "-":
print(a, operador, b, '=', a - b)
elif operador == "*":
print(a, operador, b, '=', a * b)
elif operador == "/":
print(a, operador, b, '=', a / b)
elif operador == "**":
print(a, operador, b, '=', a ** b)
else:
print('Operador no válido. Introduce uno de los siguientes operadores: + (suma), - (resta), * (producto), / (cociente), ** (potencia).')Operación no válida. Se necesitan tres argumentos separados por espacio.
2.0 + 3.0 = 5.0
Operador no válido. Introduce uno de los siguientes operadores: + (suma), - (resta), * (producto), / (cociente), ** (potencia).
4.0 ** 2.0 = 16.0
Ejercicio 8.3 El siguiente diccionario contiene pares formados por números de teléfonos y propietarios:
{'919654665':'Pedro', '917489210': 'Luis', '623543213':'Carmen', '674833721':'Luis'}
Crear un programa que construya un diccionario con la misma información, pero tomando como claves los nombres de los usuarios y como valores los teléfonos. Como un usuario puede tener dos teléfonos, uno móvil y uno fijo, los teléfonos deben agruparse a su vez en un diccionario cuyos elementos tendrán clave “movil” o “fijo” según el teléfono empiece por 6 o no. Por ejemplo, a partir del diccionario anterior debe construirse el siguiente diccionario:
{'Pedro': {'fijo': '919654665'}, 'Luis': {'fijo': '917489210', 'movil': '674833721'}, 'Carmen': {'movil': '623543213'}}
Después el programa debe recorrer este diccionario y mostrar por pantalla los teléfonos del listín en orden alfabético.
Ejemplo:
Teléfonos de Carmen
movil : 623543213
Teléfonos de Luis
fijo : 917489210
movil : 674833721
Teléfonos de Pedro
fijo : 919654665 # Definimos el diccionario con el listín telefónico.
listin = {'919654665':'Pedro', '917489210': 'Luis', '623543213':'Carmen', '674833721':'Luis'}
# Definimos un diccionario vacío para el nuevo listín telefónico.
listin2 = {}
# Bucle iterativo para recorrer el diccionario. i toma como valores los valores del diccionario.
for i in listin.values():
# Añadimos al listin nuevo un par con la clave el nombre de la persona y el valor un diccionario vacío.
listin2[i] = {}
# Bucle iterativo para recorrer el diccionario. k toma como valores las claves y v los valores.
for k,v in listin.items():
# Condicional para ver si el teléfono empieza por 6.
if k[0] == '6':
# Si el teléfono empieza por 6 añadimos al diccionario de la persona un nuevo par con la clave 'movil' y el valor el telefono.
listin2[v]['movil'] = k
else:
# Si el teléfono no empieza por 6 añadimos al diccionario de la persona un nuevo par con la clave 'fijo' y el valor el telefono.
listin2[v]['fijo'] = k
print(listin2)
# Bucle iterativo para recorrer el segundo diccionario alfabéticamente. i toma como valores las claves.
for i in sorted(listin2.keys()):
print('Teléfonos de', i)
# Bucle iterativo anidado para recorrer el diccionario de los teléfonos de una persona. k toma como valores las claves y v los valores.
for k,v in listin2[i].items():
print('\t', k, ':', v){'Pedro': {'fijo': '919654665'}, 'Luis': {'fijo': '917489210', 'movil': '674833721'}, 'Carmen': {'movil': '623543213'}}
Teléfonos de Carmen
movil : 623543213
Teléfonos de Luis
fijo : 917489210
movil : 674833721
Teléfonos de Pedro
fijo : 919654665
Ejercicio 8.4 Construir un programa para realizar las siguientes operaciones con dos números proporcionados por el usuario:
- Comprobar si uno de los dos números es divisible por el otro. Un número es divisible por otro cuando el resto de la división entera es cero.
- Calcular su Máximo Común Divisor.
- Calcular su Mínimo Común Múltiplo.
Cada una de las operaciones deben estar separadas en funciones que tengan como parámetros los 2 números y devuelvan el resultado adecuado.
def div(a, b):
'''Función que comprueba si un número es divisible por otro.
Parámetros:
- a: Es un número entero.
- b: Es un número entero.
Salida: Un booleano, True si alguno de los números es divisible por el otro y False en caso contrario.
'''
return a % b == 0 or b % a == 0
def mcd(a, b):
'''Función que devuelve el máximo común divisior de dos números por el algoritmo de Euclides.
Parámetros:
- a: Es un número entero.
- b: Es un número entero.
Salida: El máximo común divisor de los dos números dados.
'''
# Bucle condicional mientras b (el divisor) sea distinto de 0.
while b:
# b pasa a ser el nuevo dividendo y el resto de la división entera de a por b pasa a ser el nuevo divisor
a, b = b, a%b
# Devolvemos el último divisor distinto de 0.
return a
def mcm(a, b):
'''Función que devuelve el mínimo común múltiplo de dos números por el algoritmo de Euclides.
Parámetros:
- a: Es un número entero.
- b: Es un número entero.
Salida: El mínimo común múltiplo de los dos números dados.
'''
# Aprovechando que tenemos el mcd aplicamos la propiedad a * b = mcd(a,b) * mcm (a,b).
return a / mcd(a,b) * b
print(div(12, 18))
print(mcd(12, 18))
print(mcm(12, 18))False
6
36.0
Ejercicio 8.5 El fichero cercanias.csv contiene información sobre las líneas de tren de cercanías de Madrid: id (identificador del tren), línea (nombre de la línea), estaciones (estaciones de origen y destino separadas por un guion). Se pide:
- Construir una función que lea el fichero
cercanias.csvy cree un diccionario donde la clave de cada par sea el identificador de la línea y el valor asociado una lista de dos elementos con la estación de origen y la estación de destino como el que se muestra a continuación a modo de ejemplo:
{'10T0001C1': ['Principe Pio', 'Aeropuerto'], '10T0002C1': ['Aeropuerto', 'Principe Pio'], ...}
La función debe recibir el nombre del fichero como parámetro. 2. Construir otra función que guarde la información del diccionario obtenido en el apartado anterior en un fichero csv separado por punto y coma con 3 columnas con los encabezados id, origen y destino. La función debe recibir como parámetros el diccionario con los trenes y el nombre del fichero resultante.
def importar_trenes(fichero):
'''Función que genera un diccionario con las líneas de trenes (origen y destino) a partir de un fichero de texto.
Parámetros:
- fichero: Es una cadena con el nombre del fichero.
Salida: Un diccionario con las líneas de tren. Las claves son los identificadores de las líneas y los valores son listas de dos elementos con el origen y el destino.
'''
try:
# Intentamos abrir el fichero en modo lectura.
f = open(fichero, 'r')
except FileNotFoundError:
# Si el fichero no existe captuarmos la excepción y mostramos un aviso por pantalla.
print('El fichero', f, 'no existe.')
else:
# Leemos las líneas del fichero en una lista.
lineas = f.read().split('\n')
# Cerramos el fichero.
f.close()
# Creamos un diccionario vacío para guardar las líneas de trenes.
trenes = {}
# Bucle iterativo para recorrer las líneas del fichero. i toma como valores cada línea menos la primera que es el encabezado.
for i in lineas[1:]:
# Creamos una lista con los campos dividiendo la línea por la coma.
campos = i.split(',')
# Añadimos al diccionario un nuevo par con la clave el identificador del tren y valor la lista que se obtiene de dividir el último campo por el guión.
trenes[campos[0]] = campos[2].split('-')
return trenes
def exportar_trenes(trenes, fichero):
'''Función que crea un fichero csv separado por ; con los identificadores de las líneas de tren, su origen y su destino a partir de un diccionario.
Parámetros:
- trenes: Es un diccionario cuyas claves son los identificadores de los trenes y cuyos valores son listas de dos elementos con el origen y el destino.
- fichero: Es una cadena con el nombre del fichero.
'''
# Definimos una cadena con el encabezado del fichero.
lineas = 'id;origen;destino'
# Bucle iterativo para recorrer el diccionario. id recorre las claves y estaciones recorre los valores.
for id, estaciones in trenes.items():
# Añadimos a la cadena una nueva línea con el identificador del tren y sus estaciones de origen y destino.
lineas += '\n' + id + ';' + ';'.join(estaciones)
# Abrimos el fichero en modo escritura.
f = open(fichero, 'w')
# Escribimos la cadena en el fichero.
f.write(lineas)
# Cerramos el fichero.
f.close()
return
trenes = importar_trenes('cercanias.csv')
print(trenes)
exportar_trenes(trenes, 'trenes_cercanias.csv'){'10T0001C1': ['Principe Pio', 'Aeropuerto'], '10T0002C1': ['Aeropuerto', 'Principe Pio'], '10T0003C10': ['Villalba', 'Aeropuerto'], '10T0004C10': ['Aeropuerto', 'Villalba'], '10T0005C2': ['Guadalajara', 'Chamartin'], '10T0006C2': ['Chamartin', 'Guadalajara'], '10T0007C3': ['Chamartin', 'Aranjuez'], '10T0008C3': ['Aranjuez', 'Chamartin '], '10T0009C3a': ['Chamartin', 'El Escorial'], '10T0010C3a': ['El Escorial', 'Chamartin'], '10T0011C4': ['Chamartin', 'Parla'], '10T0012C4': ['Parla', 'Chamartin'], '10T0013C4a': ['Alcobendas', 'Parla'], '10T0014C4a': ['Parla', 'Alcobendas'], '10T0015C4b': ['Colmenar Viejo', 'Parla'], '10T0016C4b': ['Parla', 'Colmenar Viejo'], '10T0017C5': ['Mostoles el Soto', 'Humanes'], '10T0018C5': ['Humanes', 'Mostoles el Soto'], '10T0019C7': ['Alcala de Henares', 'Principe Pio'], '10T0020C7': ['Principe Pio', 'Alcala de Henares'], '10T0021C8': ['Atocha', 'Cercedilla'], '10T0022C8': ['Cercedilla', 'Atocha'], '10T0023C3a': ['Atocha', 'El Escorial'], '10T0024C3a': ['El Escorial', 'Atocha'], '10T0025C9': ['Cercedilla', 'Cotos'], '10T0026C9': ['Cotos', 'Cercedilla'], '10T0027C3a': ['Atocha', 'El Escorial'], '10T0028C3a': ['El Escorial', 'Atocha']}
Ejercicio 8.6 Construir un programa que realize las siguientes operaciones con la librería Pandas:
Crear un DataFrame con las siguientes columnas:
- Nombre: Juan, Marta, Pedro, Jorge, Blas, Lisa, Antonio
- Edad: 23,78,22,19,45,33,20
- Género: M, F, M, M, M, F, M
- Provincia’: Burgos, Madrid, Toledo, Burgos, Madrid, Toledo, Madrid
- Hijos: 2,0,0,3,2,1,4
- Mascotas: 5,1,0,5,2,2,3
Mostrar la información básica del DataFrame.
Obtener los principales estadísticos de las columnas numéricas.
Obtener los porcentajes de hombres y mujeres por provincias.
Representar, mediante un diagrama de dispersión, en número de hijos frente al número de mascotas para las personas de Madrid.
Realizar la siguiente gráfica.

import pandas as pd
import matplotlib.pyplot as plt
# Creamos un diccionario con claves los nombres de las columnas y valores las listas con los elementos de las columnas.
datos = {
'Nombre': ['Juan', 'Marta', 'Pedro', 'Jorge', 'Blas', 'Lisa', 'Antonio'],
'Edad': [23, 78, 22, 19, 45, 33, 20],
'Género': ['M', 'F', 'M', 'M', 'M', 'F', 'M'],
'Provincia': ['Burgos', 'Madrid', 'Toledo', 'Burgos', 'Madrid', 'Toledo', 'Madrid'],
'Hijos': [2, 0, 0, 3, 2, 1, 4],
'Mascotas': [5, 1, 0, 5, 2, 2, 3]
}
df = pd.DataFrame(datos)
print(df) Nombre Edad Género Provincia Hijos Mascotas
0 Juan 23 M Burgos 2 5
1 Marta 78 F Madrid 0 1
2 Pedro 22 M Toledo 0 0
3 Jorge 19 M Burgos 3 5
4 Blas 45 M Madrid 2 2
5 Lisa 33 F Toledo 1 2
6 Antonio 20 M Madrid 4 3
# Información básica del DataFrame
print(df.info())<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Nombre 7 non-null object
1 Edad 7 non-null int64
2 Género 7 non-null object
3 Provincia 7 non-null object
4 Hijos 7 non-null int64
5 Mascotas 7 non-null int64
dtypes: int64(3), object(3)
memory usage: 464.0+ bytes
None
# Principales estadísticos de las columnas numéricas
print(df.describe()) Edad Hijos Mascotas
count 7.000000 7.000000 7.000000
mean 34.285714 1.714286 2.571429
std 21.383126 1.496026 1.902379
min 19.000000 0.000000 0.000000
25% 21.000000 0.500000 1.500000
50% 23.000000 2.000000 2.000000
75% 39.000000 2.500000 4.000000
max 78.000000 4.000000 5.000000
# Porcentaje de hombres y mujeres por provincias
print(df.groupby('Provincia').Género.value_counts(normalize = True) * 100)Provincia Género
Burgos M 100.000000
Madrid M 66.666667
F 33.333333
Toledo F 50.000000
M 50.000000
Name: Género, dtype: float64
# Diagrama de dispersión del número de hijos y el número de mascotas de Madrid.
# Inicializamos la figura y los ejes.
fig, ax = plt.subplots()
# Filtramos el data frame para quedarnos con las filas de Madrid y dibujamos el diagrama de dispersión.
df[df.Provincia == 'Madrid'].plot(kind = 'scatter', x = 'Hijos', y = 'Mascotas', ax = ax)
# Mostramos el gráfico por pantalla.
plt.show()<Figure size 432x288 with 1 Axes>
# Diagrama de barras de las frecuencias por provincia.
# Inicializamos la figura y los ejes.
fig, ax = plt.subplots()
# Agrupamos por provincia y contamos el número de elementos de cada grupo. A partir de la serie con las frecuencias dibujamos el diagrama de barras.
df.groupby('Provincia').size().plot(kind = 'bar')
# Añadimos un título.
plt.title('Distribución de frecuencias por provincia')
# Mostramos el gráfico.
plt.show()<Figure size 432x288 with 1 Axes>