10 2022-06-04
Examen de Inteligencia de los Negocios
Grado: Inteligencia de los Negocios
Fecha: 4 de junio de 2022
Ejercicio 10.1 Realizar un programa que pregunte al usuario por un número entero impar y dibuje un rombo con el número de filas introducidas por el usuario.
Ejemplo de ejecución
Introduce el número de filas del rombo (un número impar): 7
*
***
*****
*******
*****
***
*Solución 1
# Preguntamos el número de filas del rombo
n = int(input("Introduce el número de filas (un número impar): "))
# Otenemos el cociente de la división entera del número de filas del rombo por 2
m = n // 2
# Bucle iterativo para recorrer por posición las filas de la mitad superior del rombo. i toma como valores los valores de la secuencia de enteros desde 1 hasta la mitad de las filas del rombo.
for i in range(1, m + 1):
# Mostramos por pantalla la cadena que contiene m-i espacios y 2*i-1 asteriscos. A medida que i se va incrementando, los espacios disminuyen y el número de asteriscos de cada línea aumenta.
print(" " * (m - i), "*" * (2 * i - 1))
# Mostramos por pantalla la línea central del rombo que tendrá tantos asteriscos como el número de filas del rombo.
print("*" * n)
# Bucle iterativo para recorrer por posición las filas de la mitad inferior del rombo. i toma como valores los valores de la secuencia de enteros desde m hasta 1.
for i in range(m, 0, -1):
# Mostramos por pantalla la cadena que contiene m-i espacios y 2*i-1 asteriscos. A medida que i se va decrementando, los espacios aumentan y el número de asteriscos de cada línea disminuye.
print(" " * (m - i), "*" * (2 * i - 1)) *
***
*****
*******
*****
***
*
Solución 2
# Preguntamos el número de filas del rombo
n = int(input("Introduce el número de filas (un número impar): "))
# Otenemos el cociente de la división entera del número de filas del rombo por 2
m = n // 2
# Bucle iterativo para recorrer por posición las filas de la mitad superior del rombo. i toma como valores los valores de la secuencia de enteros desde 1 hasta la mitad de las filas del rombo.
for i in range(m):
# Bucle iterativo para mostrar los espacios de cada línea de la mitad superior del rombo. A medida que i se va incrementando, los espacios disminuyen.
for j in range(m - i):
print(" ", end = "")
# Bucle iterativo para mostrar los asteriscos de cada línea de la mitad superior del rombo. A medida que i se va incrementando, los asteriscos aumentan.
for j in range(2 * i + 1):
print("*", end = "")
# Cambiamos de línea
print("")
# Mostramos por pantalla la línea central del rombo que tendrá tantos asteriscos como el número de filas del rombo.
print("*" * n)
# Bucle iterativo para recorrer por posición las filas de la mitad inferior del rombo. i toma como valores los valores de la secuencia de enteros desde m hasta 1.
for i in range(m, 0, -1):
# Bucle iterativo para mostrar los espacios de cada línea de la mitad inferior del rombo. A medida que i se va decrementando, los espacios aumentan.
for j in range(m - i + 1):
print(" ", end = "")
# Bucle iterativo para mostrar los asteriscos de cada línea de la mitad inferior del rombo. A medida que i se va decrementando, los asteriscos disminuyen.
for j in range(2 * i - 1):
print("*", end = "")
# Cambiamos de línea
print("") *
***
*****
*******
*****
***
*
Ejercicio 10.2 Realizar un programa que simule la operativa de una cuenta bancaria. El programa debe preguntar al usuario si desea realizar un ingreso o un reintegro hasta que el usuario decida terminar el programa.
Si el usuario selecciona la opción de ingreso, debe preguntarle por la cantidad a ingresar e incrementar el saldo en esa cantidad.
Si el usuario selecciona la opción de reintegro deberá preguntarle por la cantidad a sacar y sustraerla del saldo, siempre y cuando haya saldo suficiente. Si no hubiese saldo suficiente avisará al usuario y no realizará el reintegro.
Las cantidades de las operaciones deben guardarse en una sola lista (positivos para ingresos y negativos para reintegros), y después de cada operación debe mostrarse el saldo por pantalla.
Cuando el usuario ya no quiera hacer más operaciones, a partir de la lista de operaciones se deben crear dos listas más, una para los ingresos y otra para los reintegros y deben mostrarse por pantalla.
Ejemplo de ejecución
OPERATIVA CUENTA BANCARIA
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 1
Introduce la cantidad: 1000
Saldo: 1000.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 2
Introduce la cantidad: 1200
Lo siento, no hay saldo suficiente.
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 2
Introduce la cantidad: 800
Saldo: 200.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 1
Introduce la cantidad: 500
Saldo: 700.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 2
Introduce la cantidad: 400
Saldo: 300.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Elige una opción (cualquier otra para terminar): 3
Ingresos: [1000.0, 500.0]
Reintegros: [-800.0, -400.0]print("OPERATIVA CUENTA BANCARIA")
# Inicializamos a 0 una variable real para guardar el saldo.
saldo = 0
# Inicializamos una lista vacía para guardar las operaciones bancarias.
operaciones = []
# Bucle infinito
while True:
print("¿Qué deseas hacer?")
print("1- Ingreso")
print("2- Reintegro")
# Preguntamos al usuario por la operación que quiere realizar.
opcion = input("Elige una opción (cualquier otra para terminar): ")
# Condicional para ver qué operacion ha seleccionado el usuario.
if opcion == "1": # Si el usuario elige la opción de realizar un ingreso.
# Preguntamos al usuario por la cantidad a ingresar y la convertimos en un número real.
cantidad = float(input("Introduce la cantidad: "))
# Añadimos la cantidad a la lista de operaciones.
operaciones.append(cantidad)
# Sumamos al saldo en la cantidad del ingreso.
saldo += cantidad
# Mostramos el saldo por pantalla.
print("Saldo: ", saldo)
elif opcion == "2": # Si el usuario elige la opción de realizar un reintegro.
# Preguntamos al usuario por la cantidad a reintegrar y la convertimos en un número real.
cantidad = float(input("Introduce la cantidad: "))
# Condicional para ver si el hay saldo suficiente para realizar el reintegro.
if saldo < cantidad: # No hay saldo suficiente.
# Mostramos por pantalla un mensaje informando al usuario de que no hay saldo.
print("Lo siento, no hay saldo suficiente.")
else: # Hay saldo suficiente.
# Añadimos la cantidad en negativo a la lista de operaciones.
operaciones.append(-cantidad)
# Restamos del saldo la cantidad del ingreso.
saldo -= cantidad
# Mostramos el saldo por pantalla.
print("Saldo: ", saldo)
else: # Si el usuario introduce cualquier otro número el bucle termina
break
# Creamos dos listas vacías, una para los ingresos y otra para los reintegros.
ingresos = []
reintegros = []
# Bucle iterativo para recorrer por valor los elementos de la lista de operaciones bancarias.
for i in operaciones:
# Condicional para ver si la operación es un ingreso o un reintegro.
if i < 0: # La operación es un reintegro.
# Agregramos la operación a la lista de reintegros.
reintegros.append(i)
else: # La operación es un ingreso.
# Agregamos la operación a la lista de ingresos.
ingresos.append(i)
# Mostramos la lista de ingresos y reintegros por pantalla.
print("Ingresos: ", ingresos)
print("Reintegros:", reintegros)OPERATIVA CUENTA BANCARIA
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Saldo: 1000.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Lo siento, no hay saldo suficiente.
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Saldo: 200.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Saldo: 700.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Saldo: 300.0
¿Qué deseas hacer?
1- Ingreso
2- Reintegro
Ingresos: [1000.0, 500.0]
Reintegros: [-800.0, -400.0]
Ejercicio 10.3 Existe un texto que se usa frecuentemente para demostraciones dentro del ámbito del diseño gráfico. De hecho, este texto cuyo nombre es Lorem ipsum es un estándar utilizado desde el año 1500 y sirve principalmente para probar el diseño visual antes de insertar el texto definitivo. Dicho pasaje es el siguiente:
“Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.”
Realizar un programa que analice dicho pasaje y realice las siguientes operaciones:
- Crear un diccionario con la frecuencia de cada carácter sin tener en cuenta el espacio.
- Muestre por pantalla el carácter que más se repite.
- Muestre por pantalla las palabras que contienen el carácter más repetido y su frecuencia por palabra.
Ejemplo de ejecución
Carácter más repetido: i
Las palabras donde se encuentra el carácter que más se repite:
{'ipsum': 1, 'sit': 1, 'adipiscing': 3, 'elit,': 1, 'eiusmod': 1, 'incididunt': 3, 'aliqua.': 1, 'enim': 1, 'minim': 2, 'veniam,': 1, 'quis': 1, 'exercitation': 2, 'laboris': 1, 'nisi': 2, 'aliquip': 2, 'Duis': 1, 'irure': 1, 'in': 1, 'reprehenderit': 1, 'velit': 1, 'cillum': 1, 'fugiat': 1, 'pariatur.': 1, 'sint': 1, 'cupidatat': 1, 'proident,': 1, 'qui': 1, 'officia': 2, 'mollit': 1, 'anim': 1, 'id': 1}# Definimos una variable con la cadena a analizar.
texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
# Definimos un diccionario vacío para ir guardando la frecuencia de cada carácter.
frecuencias = {}
# Bucle iterativo para recorrer por valor los caracteres de la frase una vez eliminados los espacios. i toma como valores los caracteres de la frase.
for i in texto.replace(" ", ""):
# Condicional para ver si el carácter está ya como clave en el diccionario.
if i in frecuencias: # El carácter es ya una clave del diccionario.
# Incrementamos la frecuencia del carácter en 1.
frecuencias[i] += 1
else: # El carácter no es una clave del diccionario.
# Añadimos al diccionario un nuevo par con clave el carácter y valor 1.
frecuencias[i] = 1
# Mostramos por pantalla el diccionario.
print(frecuencias)
# Calculamos el máximo valor del diccionario.
frec_max = max(frecuencias.values())
# Obtenemos la posición del máximo en la lista de los valores del diccionario.
pos_max = list(frecuencias.values()).index(frec_max)
# Obtenemos el caracter más repetido en la misma posición de la lista de claves.
caracter_max = list(frecuencias.keys())[pos_max]
# Mostramos por pantalla el carácter más repetido.
print("Carácter más repetido:", caracter_max)
# Definimos un diccionario vacío para añadir las palabras que contienen el caracter más repetido y su frecuencia.
palabras = {}
# Creamos una lista de palabras dividiendo el texto por el espacio.
texto = texto.split(" ")
# Bucle iterativo para recorrer por valor las palabras de la lista.
for i in texto:
# Condicional para ver si la palabra contiene el carácter más repetido y no está aún en el diccionario.
if caracter_max in i and not i in palabras:
# Inicializamos a 0 un contador para la frecuencia del carácter en la palabra.
freq = 0
# Bucle iterativo para recorrer por valor los caracteres de la palabra.
for j in i:
# Condicional para ver si el carácter coincide con el más repetido.
if j == caracter_max:
# Si el carácter es el más repetido incrementamos su frecuencia en 1.
freq += 1
# Añadimos al diccionario de palabras la palabra y su frecuencia.
palabras[i] = freq
# Mostramos por pantalla el diccionario de palabras.
print(palabras){'L': 1, 'o': 29, 'r': 22, 'e': 37, 'm': 17, 'i': 42, 'p': 11, 's': 18, 'u': 28, 'd': 18, 'l': 21, 't': 32, 'a': 29, ',': 4, 'c': 16, 'n': 24, 'g': 3, 'b': 3, 'q': 5, '.': 4, 'U': 1, 'v': 3, 'x': 3, 'D': 1, 'h': 1, 'f': 3, 'E': 1}
Carácter más repetido: i
{'ipsum': 1, 'sit': 1, 'adipiscing': 3, 'elit,': 1, 'eiusmod': 1, 'incididunt': 3, 'aliqua.': 1, 'enim': 1, 'minim': 2, 'veniam,': 1, 'quis': 1, 'exercitation': 2, 'laboris': 1, 'nisi': 2, 'aliquip': 2, 'Duis': 1, 'irure': 1, 'in': 1, 'reprehenderit': 1, 'velit': 1, 'cillum': 1, 'fugiat': 1, 'pariatur.': 1, 'sint': 1, 'cupidatat': 1, 'proident,': 1, 'qui': 1, 'officia': 2, 'mollit': 1, 'anim': 1, 'id': 1}
Ejercicio 10.4 Escriba un programa que obtenga el máximo y el mínimo de una serie de datos proporcionados en Hexadecimal. Para ello se le pasará una lista de datos en formato hexadecimal, y tendrá que convertirlos primero a formato Binario, y a continuación a formato Decimal. Para ello, se pide lo siguiente:
Crear una función de conversión de formato hexadecimal a binario en base a la siguiente tabla:
Hexadecimal 0 1 2 3 4 5 6 7 Decimal 0000 0001 0010 0011 0100 0101 0110 0111 Hexadecimal 8 9 A B C D E F Decimal 1000 1001 1010 1011 1100 1101 1110 1111 Ejemplo de ejecución
Introduce un número hexadecimal: AA55 El número hexadecimal AA55 en binario es 1010101001010101Crear una función de conversión de formato binario a decimal. El procedimiento se detalla a continuación:

Conversión de binario a decimal Ejemplo de ejecución
sh Introduce un número binario: 1010101001010101 El número binario 1010101001010101 es en decimal 43605Crear una función que reciba una lista de números hexadecimales y devuelva una tupla con el máximo y su valor decimal.
Ejemplo de ejecución
Usando como entrada de la última función la lista:
["AA55", "1010", "BEBE", "0101", "0FEA"]sh Máximo: ('BEBE', 48830)
def conversion_hex_bin(num_hex):
"""
Función que convierte un número hexadecimal en binario.
Parámetros:
- num_hex: Es una cadena con un número hexadecimal.
Salida:
- Una cadena con el número binario correspondiente al número hexadecimal dado.
"""
# Definimos un diccionario con el número binario asociado a cada dígito hexadecimal
hexbin = {"0":"0000", "1":"0001", "2":"0010", "3":"0011", "4":"0100", "5":"0101", "6":"0110", "7":"0111", "8":"1000", "9":"1001", "A":"1010", "B":"1011", "C":"1100", "D":"1101", "E":"1110", "F":"1111"}
# Inicializamos la cadena para guardar el número binario a la cadena vacía.
num_bin = ""
# Bucle iterativo para recorrer los dígitos del número hexadecimal por valor. i toma como valores cada uno de los caracteres que forman la cadena con el número hexadecimal.
for i in num_hex:
try:
# Accedemos al diccionario mediante la clave correspondiente al dígito hexadecimal y añadimos a la cadena con el número binario los dígitos binarios correspondientes al dígito hexadecimal.
num_bin += hexbin[i]
# Controlamos la excepción en caso de que alguno de los dígitos del número hexadecimal no sea válido.
except KeyError:
return "El número introducido no es hexadecimal."
# Devolvemos la cadena con el número binario.
return num_bin
def conversion_bin_dec(num_bin):
"""
Función que convierte un número binario en decimal.
Parámetros:
- num_bin: Es una cadena con un número binario.
Salida:
- El número decimal correspondiente al número binario dado.
"""
# Convertimos la cadena con el número binario en una lista de caracteres. Cada dígito del número binario es un elemento de la lista.
num_bin = list(num_bin)
# Para recorrer la lista de derecha a izquierda la invertimos.
num_bin.reverse()
# Inicializamos a 0 una variable entera para ir guardando el número decimal.
num_dec = 0
# Bucle iterativo para recorrer la lista de dígitos binarios por posición. i toma como valores los enteros de la secuencia desde 0 al tamaño de la lista menos 1.
for i in range(len(num_bin)):
# Multiplicamos el dígito binario por la potencia de 2 correspondiente a la posición del dígito en la lista y lo sumamos al número decimal.
num_dec += int(num_bin[i]) * 2 ** i
# Devolvemos el número decimal
return num_dec
def maximo_hex(lista_hex):
"""
Función que devuelve el número mayor de una lista de números hexadecimales.
Parámetros:
- lista_hex: Es una lista de cadenas con números hexadecimales.
Salida:
El número mayor de la lista de números hexadecimales dada y su valor decimal.
"""
# Inicializamos una lista vacía para guardar los números decimales correspondientes a los números hexadecimales.
lista_dec = []
# Bulce iterativo para recorrer los valores de la lista de números hexadecimales. i toma como valores cada uno de los números hexadecimales de la lista.
for i in lista_hex:
# Aplicamos a cada número hexadecimal la función de conversión a binario y después la función de conversión a decimal y añadimos el número decimal obtenido a la lista de números decimales.
lista_dec.append(conversion_bin_dec(conversion_hex_bin(i)))
# Obtenemos el máximo valor de la lista de números decimales.
max_dec = max(lista_dec)
# Obtenemos el número hexadecimal máximo accediendo a la misma posición de la lista de números hexadecimales que ocupa el máximo de la lista de números decimales.
max_hex = lista_hex[lista_dec.index(max_dec)]
# Devolvemos una tupla con el número hexadecimal máximo y su valor decimal.
return (max_hex, max_dec)
# Ejemplo de prueba
print("El número hexadecimal AA55 es", conversion_bin_dec(conversion_hex_bin("AA55")), "en binario.")
hex = ["AA55", "1010", "BEBE", "0101", "0FEA"]
print(maximo_hex(hex))El número hexadecimal AA55 es 43605 en binario.
('BEBE', 48830)
Ejercicio 10.5 El fichero coches.csv contiene información sobre los modelos de coches vendidos en USA un determinado año. Se pide:
- Crear un DataFrame a partir del fichero anterior.
- Eliminar las filas con valores desconocidos y mostrar el número de filas del dataframe resultante.
- Crear una columna con el precio en euros (cambio 1$ = 0.94€)
- Mostrar por pantalla las 10 últimas filas del DataFrame.
- Mostrar por pantalla el número de marcas que contiene el DataFrame.
- Mostrar por pantalla el número de modelos de cada marca que hay en el DataFrame, de mayor a menor frecuencia.
- Mostrar por pantalla la marca y el modelo del coche más caro.
- Mostrar por pantalla el precio medio en euros de los coches agrupando por marca y ordenando de menor a mayor precio.
- Dibujar el diagrama de barras del porcentaje de modelos de cada marca.
- Dibujar el diagrama de dispersión de la potencia y el precio.
Los gráficos deben guardarse en una carpeta con el nombre gráficos y deben tener un título adecuado.
import pandas as pd
import matplotlib.pyplot as plt
# Creamos el dataframe desde el fichero csv.
df = pd.read_csv("https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2022-06-04/coches.csv", sep = ";")
print(df) Marca Modelo Tipo Potencia Precio
0 Acura MDX SUV 265.0 33337.0
1 Acura RSX Type S 2dr Sedan 200.0 21761.0
2 Acura TSX 4dr Sedan 200.0 24647.0
3 Acura TL 4dr Sedan 270.0 30299.0
4 Acura 3.5 RL 4dr Sedan 225.0 39014.0
.. ... ... ... ... ...
423 Volvo C70 LPT convertible 2dr Sedan 197.0 38203.0
424 Volvo C70 HPT convertible 2dr Sedan 242.0 40083.0
425 Volvo S80 T6 4dr Sedan 268.0 42573.0
426 Volvo V40 Wagon 170.0 24641.0
427 Volvo XC70 Wagon 208.0 33112.0
[428 rows x 5 columns]
# Eliminar las filas con valores desconocidos y mostrar el número de filas del dataframe resultante.
df.dropna(inplace = True)
filas, columnas = df.shape
print("Número de filas:", filas)
print("Número de columnas:", columnas)Número de filas: 421
Número de columnas: 5
# Crear una columna con el precio en euros (cambio 1$ = 0.94€)
df["Precio€"] = df.Precio * 0.94
# Mostrar las últimas 10 filas del dataframe
print(df.tail(10)) Marca Modelo Tipo Potencia Precio Precio€
418 Volvo S60 2.5 4dr Sedan 208.0 29916.0 28121.04
419 Volvo S60 T5 4dr Sedan 247.0 32902.0 30927.88
420 Volvo S60 R 4dr Sedan 300.0 35382.0 33259.08
421 Volvo S80 2.9 4dr Sedan 208.0 35542.0 33409.48
422 Volvo S80 2.5T 4dr Sedan 194.0 35688.0 33546.72
423 Volvo C70 LPT convertible 2dr Sedan 197.0 38203.0 35910.82
424 Volvo C70 HPT convertible 2dr Sedan 242.0 40083.0 37678.02
425 Volvo S80 T6 4dr Sedan 268.0 42573.0 40018.62
426 Volvo V40 Wagon 170.0 24641.0 23162.54
427 Volvo XC70 Wagon 208.0 33112.0 31125.28
# Mostrar el número de marcas
print("Número de marcas:", len(df.Marca.unique()))Número de marcas: 38
# Mostrar una tabla con el número de coches de cada marca de mayor a menor frecuencia
print(df.Marca.value_counts(ascending = False))Toyota 28
Chevrolet 27
Mercedes-Benz 26
Ford 23
BMW 19
Audi 19
Nissan 17
Honda 16
Volkswagen 15
Chrysler 14
Dodge 13
Mitsubishi 13
Volvo 12
Hyundai 12
Jaguar 12
Kia 11
Mazda 11
Pontiac 10
Subaru 10
Lexus 10
Lincoln 9
Buick 9
Mercury 9
Cadillac 8
Suzuki 8
Infiniti 8
GMC 8
Saturn 8
Saab 7
Porsche 7
Acura 7
Oldsmobile 3
Land Rover 3
MINI 2
Scion 2
Isuzu 2
Jeep 2
Hummer 1
Name: Marca, dtype: int64
# Mostrar la marca y modelo del coche más caro.
print(df[df.Precio == df.Precio.max()][["Marca", "Modelo"]]) Marca Modelo
334 Porsche 911 GT2 2dr
# Precio medio en euros de los coches por marcas
print(df.groupby("Marca")["Precio€"].mean().sort_values())Marca
Scion 12135.400000
Kia 13996.941818
Suzuki 14937.775000
Hyundai 15073.213333
Saturn 15103.920000
MINI 15779.780000
Honda 18773.092500
Mazda 18980.907273
Toyota 19078.172857
Jeep 19856.560000
Oldsmobile 20444.060000
Mitsubishi 20524.683077
Ford 20635.820000
Pontiac 20878.528000
Subaru 21351.442000
Nissan 21617.622353
Chevrolet 22617.165926
Dodge 22710.472308
Isuzu 23141.860000
Chrysler 23778.105714
Mercury 24118.102222
GMC 24712.012500
Buick 26183.595556
Volkswagen 27901.706667
Infiniti 30907.200000
Volvo 32163.196667
Saab 33483.068571
Acura 36275.405714
Lincoln 36787.631111
Audi 36970.298947
BMW 37391.864211
Lexus 37501.864000
Land Rover 39339.940000
Hummer 43066.100000
Cadillac 43641.262500
Jaguar 52732.511667
Mercedes-Benz 53066.109231
Porsche 69243.085714
Name: Precio€, dtype: float64
# Diagrama de barras del porcentaje de modelos por marcas
df.Marca.value_counts(normalize = True).plot(kind = "barh", title = "Distribución del número de modelos por marca")
plt.show()<Figure size 432x288 with 1 Axes>
# Diagrama de dispersión de la potencia y el precio
df.plot(x = "Potencia", y = "Precio€", kind = "scatter", title = "Diagrama de dispersión de la potencia frente al precio")
plt.show()<Figure size 432x288 with 1 Axes>
Ejercicio 10.6 El fichero bitcoin-tweets.csv contiene los tweets obtenidos en una búsqueda en Twitter sobre bitcoins (cada línea contiene información de un tweet). Se pide:
Crear una función que reciba la url de un fichero csv como el anterior y devuelva una lista con los tweets del fichero, donde cada tweet se represente con un diccionario con sus campos, tal y como se muestra en la siguiente salida:
[{'fecha': '2022-05-20 15:11:03+00:00', 'usuario': 'infobaeeconomia', 'texto': 'Bill Gates contra el Bitcoin: “No aporta nada” https://t.co/pZBlC664gw', 'likes': '496'}, {'fecha': '2022-05-21 14:26:51+00:00', 'usuario': 'DaniaGonzalz', 'texto': 'El Salvador hoy es un referente en materia de Inclusión Financiera gracias a la Ley #Bitcoin, países de la región c… https://t.co/P8oS2nfm36', 'likes': '554'}, {'fecha': '2022-05-20 20:42:04+00:00', 'usuario': 'LaHuellaSV', 'texto': 'El asesor en criptoeconomía y fundador de Criptokuántica, Néstor Kreimer, afirmó que El Salvador tiene actualmente… https://t.co/HbSqrQYk67', 'likes': '57'}, {'fecha': '2022-05-20 11:38:19+00:00', 'usuario': 'carmenaidalazo', 'texto': 'La ironía con bitcoin es que años de bajas tasas y politica monetaria expansiva alimentaron incrementos en precios… https://t.co/cm2mo86eKy', 'likes': '284'}, {'fecha': '2022-05-20 11:56:30+00:00', 'usuario': 'garciabanchs', 'texto': 'Cuando a soberbios del #Bitcoin aún les cambiaban los pañales, ya me quemaba las pestañas en mi doctorado de Econom… https://t.co/82tj5Dcalp', 'likes': '74'}, {'fecha': '2022-05-21 14:27:07+00:00', 'usuario': 'DaniaGonzalz', 'texto': '"El Salvador es la capital del #Bitcoin #Ethereum , invitamos a todos los países a invertir en el futuro, por eso nuestro p… https://t.co/UnQVQZj7aw"', 'likes': '89'}, {'fecha': '2022-05-14 00:07:00+00:00', 'usuario': 'ActualidadRT', 'texto': "@ActualidadRT's account has been withheld in Belgium, Austria, Bulgaria, Sweden, Croatia, Spain, Slovenia, Cyprus, Slovakia, Czech Republic, Romania, Portugal, Poland, Denmark, Netherlands, Estonia, Malta, Luxembourg, Finland, France, Lithuania, Germany, Greece, Latvia, Hungary, Italy, Ireland, United Kingdom in response to a legal demand. Learn more.", 'likes': '1037'}, {'fecha': '2022-05-14 14:01:45+00:00', 'usuario': 'ChiguireBipolar', 'texto': 'Testigo de Jehová se esconde de promotor del Bitcoin https://t.co/odVOELmYKu https://t.co/GOtuWLoGhT', 'likes': '1082'}, {'fecha': '2022-05-15 01:21:58+00:00', 'usuario': 'el_pais', 'texto': 'El Salvador convirtió al Bitcoin en su moneda legal. Con la caída de las criptomonedas, han caído en picado también… https://t.co/fFlk1P1LSj', 'likes': '551'}, {'fecha': '2022-05-13 23:00:28+00:00', 'usuario': 'garciabanchs', 'texto': 'La cantidad de dinero que han perdido fans por hacerle caso a celebridades en torno a la adquisición de criptomoned… https://t.co/UOjmvj4Jxq', 'likes': '1143'}, {'fecha': '2022-05-14 15:44:24+00:00', 'usuario': 'juanrallo', 'texto': 'Llevas diciendo que Bitcoin es una burbuja desde que cotizaba a 100 dólares. Que sepamos los patrones típicos de un… https://t.co/2inCgvPHnE', 'likes': '1423'}, {'fecha': '2022-05-14 16:01:48+00:00', 'usuario': 'wallstwolverine', 'texto': 'Los mismos políticos que asesoraban a Venezuela en sus políticas económicas te dan lecciones hoy de lo peligroso qu… https://t.co/wRje03EydN', 'likes': '1543'}, {'fecha': '2022-05-18 06:18:46+00:00', 'usuario': 'EdgardoMulatoSV', 'texto': 'Ya se preguntaron, ¿Por qué sube la ola de homicidios y ataques al Gobierno cuando vienen INVERSIONISTAS al país?… https://t.co/T5PCT8RgKB', 'likes': '796'}]Crear una función que reciba una lista de tweets como la que devuelve la función anterior, y devuelva un diccionario con los hashtags contenidos en los tweets y su frecuencia, tal y como se muestra en la siguiente salida:
{'#Bitcoin': 3, '#Ethereum': 1}
def parsear_tweets(url):
"""
Función que parsea un fichero csv con información de tweets organizada por campos y devuelve una lista de diccionarios donde cada diccionario contiene los campos de un tweet.
Parámetros:
- url: Es una cadena con la url del fichero.
Salida:
Una lista de diccionarios donde cada diccionario contiene la información de los campos de un tweet.
"""
from urllib import request
from urllib.error import URLError
# Abrimos el diccionario en modo lectura
try:
# Abrimos el diccionario en modo lectura
with request.urlopen(url) as f:
# Leemos el contenido del fichero y creamos una lista con cada una de las líneas del contenido.
lista_contenido = f.read().decode("utf-8").split("\n")
except URLError:
print("La url", url, "no existe.")
return
else:
# Creamos una lista con los nombres de los campos que serán las claves de los diccionarios.
lista_claves = lista_contenido.pop(0).split(";")
# Creamos una lista vacía para guardar los diccionarios de los tweets.
lista_tweets = []
# Bucle iterativo para recorrer la lista de tweets.
for i in lista_contenido:
# Creamos un diccionario vacío para guardar la información del tweet.
dict_tweet = {}
# Creamos la lista de los campos dividiendo la cadena con la información del tweet por el separador punto y coma.
lista_campos = i.split(";")
# Bucle iterativo para recorrer la lista de campos
for j in range(len(lista_campos)):
# Añadimos al diccionario del tweet el par formado por el nombre del campo y la información correspondiente.
dict_tweet[lista_claves[j]] = lista_campos[j]
# Añadimos el diccionario con la información del tweet a la lista de diccionarios.
lista_tweets.append(dict_tweet)
return lista_tweets
def hashtags(tweets):
"""
Función que recibe una lista de diccionarios con información de tweets y devuelve una lista con los hashtags contenidos en los tweets.
Parámetros:
- tweets: Es una lista de diccionarios, donde cada diccionario contienen información de un tweet.
Salida:
- Una lista con los hashtags contenidos en los tweets.
"""
# Creamos una diccionario vacío para guardar los hashtags.
hashtags = {}
# Bucle iterativo para recorrer por valor los tweets.
for tweet in tweets:
# Creamos la lista de palabras del tweet dividiendo el texto del tweet por el espacio.
lista_palabras = tweet["texto"].split(" ")
# Bucle iterativo para recorrer las palabras del tweet por valor.
for palabra in lista_palabras:
# Condicional para ver si el primer caracter de la plabra es el símbolo #.
if palabra[0] == "#":
# Si el primer caracter de la palabra es el símbolo #, añadimos la palabra a la lista de hashtags.
# Condicional para ver si el hashtag está ya en el diccionario de hashtags.
if palabra in hashtags:
# Si el hashtag está ya en el diccionario, incrementamos su frecuencia.
hashtags[palabra] += 1
else:
# Si el hashtag no está en el diccionario, lo añadimos con frecuencia 1.
hashtags[palabra] = 1
return hashtags
# Ejemplo de prueba
print(parsear_tweets("https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2022-06-04/bitcoin-tweets.csv"))
print(hashtags(parsear_tweets("https://aprendeconalf.es/docencia/python/examenes/inteligencia-negocios/soluciones/examen-2022-06-04/bitcoin-tweets.csv")))[{'fecha': '2022-05-20 15:11:03+00:00', 'usuario': 'infobaeeconomia', 'texto': 'Bill Gates contra el Bitcoin: “No aporta nada” https://t.co/pZBlC664gw', 'likes': '496'}, {'fecha': '2022-05-21 14:26:51+00:00', 'usuario': 'DaniaGonzalz', 'texto': 'El Salvador hoy es un referente en materia de Inclusión Financiera gracias a la Ley #Bitcoin , países de la región c… https://t.co/P8oS2nfm36', 'likes': '554'}, {'fecha': '2022-05-20 20:42:04+00:00', 'usuario': 'LaHuellaSV', 'texto': 'El asesor en criptoeconomía y fundador de Criptokuántica, Néstor Kreimer, afirmó que El Salvador tiene actualmente… https://t.co/HbSqrQYk67', 'likes': '57'}, {'fecha': '2022-05-20 11:38:19+00:00', 'usuario': 'carmenaidalazo', 'texto': 'La ironía con bitcoin es que años de bajas tasas y politica monetaria expansiva alimentaron incrementos en precios… https://t.co/cm2mo86eKy', 'likes': '284'}, {'fecha': '2022-05-20 11:56:30+00:00', 'usuario': 'garciabanchs', 'texto': 'Cuando a soberbios del #Bitcoin aún les cambiaban los pañales, ya me quemaba las pestañas en mi doctorado de Econom… https://t.co/82tj5Dcalp', 'likes': '74'}, {'fecha': '2022-05-21 14:27:07+00:00', 'usuario': 'DaniaGonzalz', 'texto': '"El Salvador es la capital del #Bitcoin #Ethereum , invitamos a todos los países a invertir en el futuro, por eso nuestro p… https://t.co/UnQVQZj7aw"', 'likes': '89'}, {'fecha': '2022-05-14 00:07:00+00:00', 'usuario': 'ActualidadRT', 'texto': "@ActualidadRT's account has been withheld in Belgium, Austria, Bulgaria, Sweden, Croatia, Spain, Slovenia, Cyprus, Slovakia, Czech Republic, Romania, Portugal, Poland, Denmark, Netherlands, Estonia, Malta, Luxembourg, Finland, France, Lithuania, Germany, Greece, Latvia, Hungary, Italy, Ireland, United Kingdom in response to a legal demand. Learn more.", 'likes': '1037'}, {'fecha': '2022-05-14 14:01:45+00:00', 'usuario': 'ChiguireBipolar', 'texto': 'Testigo de Jehová se esconde de promotor del Bitcoin https://t.co/odVOELmYKu https://t.co/GOtuWLoGhT', 'likes': '1082'}, {'fecha': '2022-05-15 01:21:58+00:00', 'usuario': 'el_pais', 'texto': 'El Salvador convirtió al Bitcoin en su moneda legal. Con la caída de las criptomonedas, han caído en picado también… https://t.co/fFlk1P1LSj', 'likes': '551'}, {'fecha': '2022-05-13 23:00:28+00:00', 'usuario': 'garciabanchs', 'texto': 'La cantidad de dinero que han perdido fans por hacerle caso a celebridades en torno a la adquisición de criptomoned… https://t.co/UOjmvj4Jxq', 'likes': '1143'}, {'fecha': '2022-05-14 15:44:24+00:00', 'usuario': 'juanrallo', 'texto': 'Llevas diciendo que Bitcoin es una burbuja desde que cotizaba a 100 dólares. Que sepamos los patrones típicos de un… https://t.co/2inCgvPHnE', 'likes': '1423'}, {'fecha': '2022-05-14 16:01:48+00:00', 'usuario': 'wallstwolverine', 'texto': 'Los mismos políticos que asesoraban a Venezuela en sus políticas económicas te dan lecciones hoy de lo peligroso qu… https://t.co/wRje03EydN', 'likes': '1543'}, {'fecha': '2022-05-18 06:18:46+00:00', 'usuario': 'EdgardoMulatoSV', 'texto': 'Ya se preguntaron, ¿Por qué sube la ola de homicidios y ataques al Gobierno cuando vienen INVERSIONISTAS al país?… https://t.co/T5PCT8RgKB', 'likes': '796'}]
{'#Bitcoin': 3, '#Ethereum': 1}