4  2020-05-27
Examen de Inteligencia de los Negocios

Fecha de publicación

27 de mayo de 2020

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

Ver notebook de la solución en Colab

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']

Ver notebook de la solución en Colab

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:

  1. Leer el fichero de internet https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2020-05-27/horas-trabajo.csv y crear una lista con las líneas del fichero.
  2. Mostrar por pantalla las horas totales del primer operario.
  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. Es decir, un diccionario como el siguiente:
{'OP1': {'Enero': '180', 'Febrero': '160', 'Marzo': '140', 'Abril': '180'},
'OP2': {'Enero': '120', 'Febrero': '140', 'Marzo': '', 'Abril': '100'}, ... }
  1. 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

Ver notebook de la solución en Colab

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:

  1. 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.
  2. Mostrar por pantalla una serie con el número total de horas trabajadas para cada mes.
  3. Mostrar por pantalla una serie con el número de operarios de cada departamento.
  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.
  5. Convertir el DataFrame a formato largo, de manera que todas las horas aparezcan en la misma columna.
  6. Mostrar por pantalla una serie con el número medio de horas trabajadas en cada departamento.
  7. Mostrar por pantalla una serie con el total de horas trabajadas de cada operario.
  8. 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_largo
DataFrame 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

Ver notebook de la solución en Colab