4 2020-05-27
Examen de Inteligencia de los Negocios
Grado: Inteligencia de los Negocios
Fecha: 27 de Mayo de 2020
Ejercicio 4.1 Escribir un programa al que al introducirle la altura de una línea sea capaz de dibujarla en diagonal con asteriscos. Por ejemplo, si introducimos altura = 5 dibujaría lo siguiente:
*
*
*
*
*Solución 1
altura = int(input('Altura de la línea: '))
for i in range(altura, 0, -1):
print(' ' * (i-1) + '*')*
*
*
*
*
Solución 2
altura = int(input("Altura de la línea: "))
for i in range(altura, 0, -1):
for j in range(i - 1):
print(" ", end="")
print("*")*
*
*
*
*
Ejercicio 4.2 Escribir una función que cuente las palabras que hay en una frase y las devuelva dentro de un diccionario. También tiene que devolver una lista con las palabras que aparecen más de una vez. Por ejemplo si se le pasa la frase: La caracola está enterrada al lado de otra caracola de color la función debe devolver el diccionario y la lista siguientes:
{'La': 1, 'caracola': 2, 'está': 1, 'enterrada': 1, 'al': 1, 'lado': 1, 'de': 2, 'otra': 1, 'color': 1}
['caracola', 'de']def contar_palabras(frase):
''' Función que recibe una frase y devuelve la frecuencia de las palabras en la frase y las palabras que se repiten.
Parámetros:
- frase: Es una cadena de caracteres.
Devuelve: Una tupla con un diccionario con las palabras y su frecuencia, y una lista con las palabras que se repiten.
'''
# Dividimos la frase por el espacio en blanco y guardamos las palabras en una lista.
palabras = frase.strip().split()
# Creamos un diccionario vacío para guardar las frecuencias de las palabras.
frecuencias = {}
# Recorremos la lista de palabras y vamos contando sus frecuencias.
for palabra in palabras:
# Si la palabra no está todavía en le diccionario, la añadimos con frecuencia 0.
if palabra not in frecuencias:
frecuencias[palabra] = 0
# Incrementamos la frecuencia de la palabra en el diccionario.
frecuencias[palabra] += 1
# Creamos una lista vacía para guardar las palabras repetidas.
repetidas=[]
# Recorremos el diccionario de frecuencias
for clave, valor in frecuencias.items():
# Si la frecuencia de una palabra es mayor que 1 la añadimos a la lista.
if valor > 1: repetidas.append(clave)
# Devolvemos el diccionario de frecuencias y la lista de palabras repetidas.
return frecuencias, repetidas
# Ejemplo
freq, rep = contar_palabras('La caracola está enterrada al lado de otra caracola de color')
print('Frecuencia de palabras:', freq)
print('Palabras repetidas: ', rep)Frecuencia de palabras: {'La': 1, 'caracola': 2, 'está': 1, 'enterrada': 1, 'al': 1, 'lado': 1, 'de': 2, 'otra': 1, 'color': 1}
Palabras repetidas: ['caracola', 'de']
Solución 2
def contar_palabras(frase):
''' Función que recibe una frase y devuelve la frecuencia de las palabras en la frase y las palabras que se repiten.
Parámetros:
- frase: Es una cadena de caracteres.
Devuelve: Una tupla con un diccionario con las palabras y su frecuencia, y una lista con las palabras que se repiten.
'''
# Dividimos la frase por el espacio en blanco y guardamos las palabras en una lista.
palabras = frase.strip().split()
# Recorremos la lista de palabras, contamos sus frecuencias y las añadimos a un diccionario.
frecuencias = {palabra:palabras.count(palabra) for palabra in palabras}
# Recorremos el diccionario de frecuencias y generamos la lista con las palabras con frecuencia mayor que 1.
repetidas = [palabra for palabra, frecuencia in frecuencias.items() if frecuencia > 1]
# Devolvemos el diccionario de frecuencias y la lista de palabras repetidas.
return frecuencias, repetidas
# Ejemplo
freq, rep = contar_palabras('La caracola está enterrada al lado de otra caracola de color')
print('Frecuencia de palabras:', freq)
print('Palabras repetidas: ', rep)Frecuencia de palabras: {'La': 1, 'caracola': 2, 'está': 1, 'enterrada': 1, 'al': 1, 'lado': 1, 'de': 2, 'otra': 1, 'color': 1}
Palabras repetidas: ['caracola', 'de']
Ejercicio 4.3 El fichero horas-trabajo.csv contiene el número de horas mensuales trabajadas por los empleados de una empresa durante el primer cuatrimestre. Crear un programa que realice las siguientes operaciones sin utilizar la librería Pandas:
- Leer el fichero de internet
https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2020-05-27/horas-trabajo.csvy crear una lista con las líneas del fichero. - Mostrar por pantalla las horas totales del primer operario.
- Crear un diccionario de diccionarios tal que las claves del diccionario principal serán los identificadores de los operarios y sus valores serán, a su vez, otros diccionarios cuyas claves serán los meses y sus valores las horas trabajadas en esos meses para cada operario. Es decir, un diccionario como el siguiente:
{'OP1': {'Enero': '180', 'Febrero': '160', 'Marzo': '140', 'Abril': '180'},
'OP2': {'Enero': '120', 'Febrero': '140', 'Marzo': '', 'Abril': '100'}, ... }- Crear una función que reciba la base de datos de las horas trabajadas (puede utilizarse el diccionario del apartado anterior u otra estructura de datos), el identificador de un operario y el precio de la hora, y devuelva una tupla con el número totales de horas trabajadas y el salario de ese operario.
Solución 1
# Apartado 1
from urllib import request
from urllib.error import URLError
# Leemos el fichero desde la url.
try:
f = request.urlopen('http://aprendeconalf.es/python/examenes/soluciones/examen-2020-05-27/horas-trabajo.csv')
# El fichero no existe
except URLError:
print('¡La url no existe!')
else:
# Guardamos cada línea en una lista
lineas = f.read().decode('utf-8').splitlines()
print("Lista de líneas del fichero")
print(lineas)Lista de líneas del fichero
['Id;Departamento;Enero;Febrero;Marzo;Abril', 'OP1;Proveedores;180;160;140;180', 'OP2;Ventas;120;140;;100', 'OP3;Ventas;80;90;80;80', 'OP5;IT;180;170;180;180', 'OP6;Marketing;100;;100;', 'OP7;Ventas;160;160;160;160', 'OP8;Proveedores;100;80;110;80', 'OP9;IT;80;80;80;80', 'OP10;Ventas;180;160;180;180']
# Apartado 2
# Mostrar por pantalla las horas totales del primer operario.
# Dividimo la segunda línea de la lista por el separador ; y guardamos cada campo en una lista.
op1 = lineas[1].split(';')
# Recorremos la lista desde la posición 2 hasta el final, convertimos las horas en enteros y creamos una lista con las horas.
horas_op1 = [int(i) for i in op1[2:]]
# Sumamos las horas de la lista.
print('Horas totales del primer operario:', sum(horas_op1))Horas totales del primer operario: 660
# Apartado 3
# Crear un diccionario de diccionarios tal que las claves del diccionario principal serán los identificadores de los operarios y sus valores serán, a su vez, otros diccionarios cuyas claves serán los meses y sus valores las horas trabajadas en esos meses para cada operario.
# Extraemos los nombres de columnas de la primera fila
columnas = lineas[0].split(';')
# Creamos el diccionario para guardar las horas de cada operario
operarios = {}
# Recorremos las líneas del fichero desde la primera hasta el final
for linea in lineas[1:]:
# Creamos un diccionario para guardar las horas mensuales de cada operario
operario = {}
# Dividimos las línea en campos utilizando la coma como separador
campos = linea.split(';')
# Recorremos la lista de campos desde el tercer campo hasta el final (los dos primeros campos no contienen horas)
for i in range(2, len(campos)):
# Añadimos al diccionario las horas de cada mes
operario[columnas[i]] = campos[i]
# Añadimos el diccionario con las horas de un operario al diccionario de operarios
operarios[campos[0]] = operario
print('Diccionario de diccionaros con las horas mensuales de cada operario')
print(operarios)Diccionario de diccionaros con las horas mensuales de cada operario
{'OP1': {'Enero': '180', 'Febrero': '160', 'Marzo': '140', 'Abril': '180'}, 'OP2': {'Enero': '120', 'Febrero': '140', 'Marzo': '', 'Abril': '100'}, 'OP3': {'Enero': '80', 'Febrero': '90', 'Marzo': '80', 'Abril': '80'}, 'OP5': {'Enero': '180', 'Febrero': '170', 'Marzo': '180', 'Abril': '180'}, 'OP6': {'Enero': '100', 'Febrero': '', 'Marzo': '100', 'Abril': ''}, 'OP7': {'Enero': '160', 'Febrero': '160', 'Marzo': '160', 'Abril': '160'}, 'OP8': {'Enero': '100', 'Febrero': '80', 'Marzo': '110', 'Abril': '80'}, 'OP9': {'Enero': '80', 'Febrero': '80', 'Marzo': '80', 'Abril': '80'}, 'OP10': {'Enero': '180', 'Febrero': '160', 'Marzo': '180', 'Abril': '180'}}
# Apartado 4
# Crear una función que reciba la base de datos de las horas trabajadas (puede utilizarse el diccionario del apartado anterior u otra estructura de datos), el identificador de un operario y el precio de la hora, y devuelva una tupla con el número totales de horas trabajadas y el salario de ese operario.
def salario(horas, operario, precio):
''' Función que recibe un diccionario de diccionarios con las horas mensuales trabajadas por los operarios de la empresa y devuelve el salario de un operario dado.
Parámetrso:
- horas: Es un diccionari de diccionarios con las horas mensuales de cada operario.
- operario: Es una cadena con el identificador del operario.
- precio: Es un número real con el precio de la hora.
Devuelve: El salario del opeario dado.
'''
# Creamos una lista con las horas correspondientes al operario. Las horas se convierten a enteros salvo si no hay horas.
horas = [int(i) for i in horas[operario].values() if i != '']
# Sumamos el total de horas
total_horas = sum(horas)
# Calculamos el salario multiplicando el total de horas por el precio.
salario = total_horas * precio
return total_horas, salario
# Ejemplo operario 2
horas, salario = salario(operarios, 'OP2', 10)
print('Horas trabajadas del segundo operario:', horas)
print('Salario del segundo operario:', salario)Horas trabajadas del segundo operario: 360
Salario del segundo operario: 3600
Ejercicio 4.4 El fichero horas-trabajo.csv contiene el número de horas mensuales trabajadas por los empleados de una empresa durante el primer cuatrimestre. Crear un programa que realice las siguientes operaciones utilizando la librería Pandas:
- Crear un DataFrame leyendo el fichero desde internet con la url
http://aprendeconalf.es/python/examenes/soluciones/examen-2020-05-27/horas-trabajo.csv. Obsérvese que el separador de campos es el punto y coma. - Mostrar por pantalla una serie con el número total de horas trabajadas para cada mes.
- Mostrar por pantalla una serie con el número de operarios de cada departamento.
- Mostrar por pantalla el número de empleados que han trabajado todos los meses, es decir, que tienen un número de horas todos los meses del cuatrimestre.
- Convertir el DataFrame a formato largo, de manera que todas las horas aparezcan en la misma columna.
- Mostrar por pantalla una serie con el número medio de horas trabajadas en cada departamento.
- Mostrar por pantalla una serie con el total de horas trabajadas de cada operario.
- Mostrar por pantalla una serie con los salarios de todos los operarios ordenados de mayor a menor.
Solución 1
import pandas as pd
# Apartado 1
# Crear un DataFrame leyendo el fichero desde internet.
operarios = pd.read_csv('https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2020-05-27/horas-trabajo.csv', sep = ';')
operarios Id Departamento Enero Febrero Marzo Abril
0 OP1 Proveedores 180 160.0 140.0 180.0
1 OP2 Ventas 120 140.0 NaN 100.0
2 OP3 Ventas 80 90.0 80.0 80.0
3 OP5 IT 180 170.0 180.0 180.0
4 OP6 Marketing 100 NaN 100.0 NaN
5 OP7 Ventas 160 160.0 160.0 160.0
6 OP8 Proveedores 100 80.0 110.0 80.0
7 OP9 IT 80 80.0 80.0 80.0
8 OP10 Ventas 180 160.0 180.0 180.0
# Apartado 2
# Mostrar por pantalla una serie con el número total de horas trabajadas para cada mes.
print('Número de horas trabajadas por meses')
print(operarios[['Enero', 'Febrero', 'Marzo']].sum())Número de horas trabajadas por meses
Enero 1180.0
Febrero 1040.0
Marzo 1030.0
dtype: float64
# Apartado 3
# Mostrar por pantalla una serie con el número de operarios de cada departamento.
print('Número de operarios por departamentos')
print(operarios.Departamento.value_counts())Número de operarios por departamentos
Ventas 4
IT 2
Proveedores 2
Marketing 1
Name: Departamento, dtype: int64
# Apartado 4
# Mostrar por pantalla el número de empleados que han trabajado todos los meses, es decir, que tienen un número de horas todos los meses del cuatrimestre.
print('Número operarios que han trabajado todos los meses: ', operarios.dropna().shape[0])Número operarios que han trabajado todos los meses: 7
# Apartado 5
# Convertir el DataFrame a formato largo, de manera que todas las horas aparezcan en la misma columna.
operarios_largo = operarios.melt(id_vars=['Id', 'Departamento'], var_name='Mes', value_name='Horas')
print("DataFrame en formato largo")
operarios_largoDataFrame en formato largo
Id Departamento Mes Horas
0 OP1 Proveedores Enero 180.0
1 OP2 Ventas Enero 120.0
2 OP3 Ventas Enero 80.0
3 OP5 IT Enero 180.0
4 OP6 Marketing Enero 100.0
5 OP7 Ventas Enero 160.0
6 OP8 Proveedores Enero 100.0
7 OP9 IT Enero 80.0
8 OP10 Ventas Enero 180.0
9 OP1 Proveedores Febrero 160.0
10 OP2 Ventas Febrero 140.0
11 OP3 Ventas Febrero 90.0
12 OP5 IT Febrero 170.0
13 OP6 Marketing Febrero NaN
14 OP7 Ventas Febrero 160.0
15 OP8 Proveedores Febrero 80.0
16 OP9 IT Febrero 80.0
17 OP10 Ventas Febrero 160.0
18 OP1 Proveedores Marzo 140.0
19 OP2 Ventas Marzo NaN
20 OP3 Ventas Marzo 80.0
21 OP5 IT Marzo 180.0
22 OP6 Marketing Marzo 100.0
23 OP7 Ventas Marzo 160.0
24 OP8 Proveedores Marzo 110.0
25 OP9 IT Marzo 80.0
26 OP10 Ventas Marzo 180.0
27 OP1 Proveedores Abril 180.0
28 OP2 Ventas Abril 100.0
29 OP3 Ventas Abril 80.0
30 OP5 IT Abril 180.0
31 OP6 Marketing Abril NaN
32 OP7 Ventas Abril 160.0
33 OP8 Proveedores Abril 80.0
34 OP9 IT Abril 80.0
35 OP10 Ventas Abril 180.0
# Apartado 6
# Mostrar por pantalla una serie con el número medio de horas trabajadas en cada departamento.
print("Media de horas mensuales trabajadas por departamentos")
print(operarios_largo.groupby('Departamento').Horas.mean())Media de horas mensuales trabajadas por departamentos
Departamento
IT 128.750000
Marketing 100.000000
Proveedores 128.750000
Ventas 135.333333
Name: Horas, dtype: float64
# Apartado 7
# Mostrar por pantalla una serie con el total de horas trabajadas de cada operario.
print("Total de horas trabajadas de cada operario")
print(operarios_largo.groupby('Id').Horas.sum())Total de horas trabajadas de cada operario
Id
OP1 660.0
OP10 700.0
OP2 360.0
OP3 330.0
OP5 710.0
OP6 200.0
OP7 640.0
OP8 370.0
OP9 320.0
Name: Horas, dtype: float64
# Apartado 8
# Mostrar por pantalla una serie con los salarios de todos los operarios ordenados de mayor a menor.
print("Salarios de los operarios")
print((operarios_largo.groupby('Id').Horas.sum()*10).sort_values(ascending = False))Salarios de los operarios
Id
OP5 7100.0
OP10 7000.0
OP1 6600.0
OP7 6400.0
OP8 3700.0
OP2 3600.0
OP3 3300.0
OP9 3200.0
OP6 2000.0
Name: Horas, dtype: float64