1. Configuración del Ambiente
Para desarrollar este desafío te recomendamos trabajar directamente desde la plataforma Google Colab. (Recuerda que debes tener una cuenta en gmail, si aún no la tienes, debes crearla).
- Accede a la siguiente URL: Google Colaboratory
- Debes crear un nuevo Notebook, y asignarle el nombre que desees: Ej.
Desafio Data Insider
- Tras seguir los pasos anteriores, debes conectar tu notebook con tu cuenta de Google Drive. Para ello, en una nueva celda de código digita y ejecuta:
from google.colab import drive
drive.mount('/content/drive')
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
- Accede a las siguientes URLs para descargar los datasets que estaremos utilizando:
- Después de descargar los datasets, crea un directorio en tu cuenta de Drive y haz el upload de todos ellos.
- Ya estás listo para avanzar a la siguiente etapa. ¡Te deseo muchos Éxitos!
import pandas as pd
# Leer el archivo CSV desde tu unidad de Google Drive y almacenarlo en un DataFrame
ano_2000_2008 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2008_unified_industry.csv')
ano_2000_2009 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2009_unified_industry.csv')
ano_2000_2010 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2010_unified_industry.csv')
ano_2000_2011 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2011_unified_industry.csv')
ano_2000_2012 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2012_unified_industry.csv')
ano_2000_2013 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2013_unified_industry.csv')
ano_2000_2014 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2014_unified_industry.csv')
ano_2000_2015 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2015_unified_industry.csv')
ano_2000_2016 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2016_unified_industry.csv')
ano_2000_2017 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2017_unified_industry.csv')
ano_2000_2018 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2018_unified_industry.csv')
ano_2000_2019 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2019_unified_industry.csv')
ano_2000_2020 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2020_unified_industry.csv')
ano_2000_2021 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2021_unified_industry.csv')
ano_2000_2022 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/aroissues-forbes-global-2000-2008-2019/data/forbes_global_2000_2022_unified_industry.csv')
# import os
# # Obtener la lista de archivos HTML en la carpeta
# ruta_carpeta = '/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500'
# archivos_html = [f for f in os.listdir(ruta_carpeta) if f.endswith('.html')]
# import pandas as pd
# # Recorrer la lista de archivos HTML y convertirlos a CSV
# for archivo_html in archivos_html:
# # Leer el archivo HTML y convertirlo en un dataframe de pandas
# ruta_archivo_html = f'{ruta_carpeta}/{archivo_html}'
# df = pd.read_html(ruta_archivo_html)[0]
# # Exportar el dataframe a un archivo CSV
# ruta_archivo_csv = f'{ruta_carpeta}/{archivo_html[:-5]}.csv'
# df.to_csv(ruta_archivo_csv, index=False)
import pandas as pd
# Leer el archivo CSV desde tu unidad de Google Drive y almacenarlo en un DataFrame
continente = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/continentes_y_paises/continente.csv')
country = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/continentes_y_paises/country_code.csv')
2. Obtención de los datos
-
Para que puedas cargar en tu notebook los archivos que almacenaste previamente en tu cuenta de Drive, debes utilizar la biblioteca pandas.
Recomendación: Utiliza nombres de variables que faciliten tu análisis, pues son varios los datasets que estarás consultando.
-
Adicionalmente, vas a utilizar una API para obtener datos históricos de las acciones de las empresas que entrarán en el análisis:
El enlace de la API es el siguiente: polygon.io
debes seguir los pasos para obtener una API Key y también debes consultar su documentación para que puedas utilizarla de manera correcta.
-
Vas a obtener los datos históricos de las acciones de 5 empresas de una misma industria (Ejemplos de Industrias: Automotriz, Tecnología, Bancos, entre otras): entre el 1 de enero y el 31 de diciembre de 2022 y los vas a almacenar en 5 datasets diferentes. (Las variables que necesitas almacenar en el dataset son: El Símbolo, la Fecha, y los Precios de Apertura, Cierre, Máximo y Mínimo de las acciones)
-
Vas a exportar estos 5 datasets en formato
.csv
y los guardarás en el directorio donde están los demás datasets.
¡Ahora sí puedes avanzar a la siguiente fase! :)
# import os
# from dotenv import load_dotenv
# import requests
# import pandas as pd
# # Cargar las variables de entorno desde el archivo .env
# load_dotenv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/config/.env')
# # Configurar las variables de la consulta a la API
# simbolos = ['AAPL', 'GOOG', 'MSFT', 'TSLA', 'AMZN'] # Símbolos de las empresas
# fecha_inicio = '2022-01-01' # Fecha de inicio de la consulta
# fecha_fin = '2022-12-31' # Fecha de fin de la consulta
# api_key = os.getenv('POLYGON_API_KEY') # API Key de Polygon.io
# # Realizar la consulta y guardar los datos en archivos CSV por separado
# for simbolo in simbolos:
# # Realizar la consulta a la API
# url = f'https://api.polygon.io/v2/aggs/ticker/{simbolo}/range/1/day/{fecha_inicio}/{fecha_fin}?apiKey={api_key}'
# response = requests.get(url)
# # Convertir la respuesta en un dataframe de pandas
# datos = response.json()['results']
# df = pd.DataFrame(datos)
# # Exportar los datos a un archivo CSV
# ruta_archivo = f'/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/{simbolo}.csv'
# df.to_csv(ruta_archivo, index=False)
3. Data Wrangling
Data Wrangling (o "manipulación de datos") es el proceso de transformación y preparación de datos en bruto a un formato más adecuado para su análisis y toma de decisiones. Esta etapa es esencial en cualquier proyecto de análisis de datos, ya que los datos en bruto suelen estar incompletos, inconsistentes o tener formatos diferentes que necesitan ser estandarizados antes de poder ser analizados con precisión.
El Data Wrangling incluye varias tareas, como la eliminación de datos duplicados o irrelevantes, el llenado de datos faltantes, la estandarización de formatos de datos, la fusión de conjuntos de datos diferentes y la creación de variables o métricas adicionales para ayudar en el análisis. En general, el objetivo es transformar los datos en bruto en datos limpios, coherentes y listos para ser analizados mediante las técnicas de visualización de datos que estaremos desarrollando.
A. En esta fase vas a explorar mejor cada uno de tus datasets de Forbes Global 2000, cambiar los nombres de las columnas (Empresa, Industria, Pais, Ingresos, Ganancias, Activos y Valor de Mercado), y crear las siguientes variables (para los datasets de Forbes 2000):
-Margen de Rentabilidad: Ganancias/Ingresos
-Rentabilidad de los Activos (ROA): Ganancias/Activos
-Año: Según el nombre de cada dataset
import pandas as pd
ano_2000_2008 = ano_2000_2008.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2009 = ano_2000_2009.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2010 = ano_2000_2010.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2011 = ano_2000_2011.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2012 = ano_2000_2012.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2013 = ano_2000_2013.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2014 = ano_2000_2014.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2015 = ano_2000_2015.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2016 = ano_2000_2016.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2017 = ano_2000_2017.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2018 = ano_2000_2018.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2019 = ano_2000_2019.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2020 = ano_2000_2020.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2021 = ano_2000_2021.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2022 = ano_2000_2022.rename(columns={'company': 'Empresa', 'industry': 'Industria', 'country': 'Pais', 'sales': 'Ingresos',
'profits': 'Ganancias', 'assets': 'Activos', 'market_value': 'Valor de Mercado'})
ano_2000_2020.loc[ano_2000_2020['rank_nr'] == 402, 'Activos'] = 41000.0
# Crear las variables adicionales
ano_2000_2008['Margen de Rentabilidad'] = ano_2000_2008['Ganancias'] / ano_2000_2008['Ingresos']
ano_2000_2008['Rentabilidad de los Activos (ROA)'] = ano_2000_2008['Ganancias'] / ano_2000_2008['Activos']
ano_2000_2008['Año'] = '2008'
ano_2000_2009['Margen de Rentabilidad'] = ano_2000_2009['Ganancias'] / ano_2000_2009['Ingresos']
ano_2000_2009['Rentabilidad de los Activos (ROA)'] = ano_2000_2009['Ganancias'] / ano_2000_2009['Activos']
ano_2000_2009['Año'] = '2009'
ano_2000_2010['Margen de Rentabilidad'] = ano_2000_2010['Ganancias'] / ano_2000_2010['Ingresos']
ano_2000_2010['Rentabilidad de los Activos (ROA)'] = ano_2000_2010['Ganancias'] / ano_2000_2010['Activos']
ano_2000_2010['Año'] = '2010'
ano_2000_2011['Margen de Rentabilidad'] = ano_2000_2011['Ganancias'] / ano_2000_2011['Ingresos']
ano_2000_2011['Rentabilidad de los Activos (ROA)'] = ano_2000_2011['Ganancias'] / ano_2000_2011['Activos']
ano_2000_2011['Año'] = '2011'
ano_2000_2012['Margen de Rentabilidad'] = ano_2000_2012['Ganancias'] / ano_2000_2012['Ingresos']
ano_2000_2012['Rentabilidad de los Activos (ROA)'] = ano_2000_2012['Ganancias'] / ano_2000_2012['Activos']
ano_2000_2012['Año'] = '2012'
ano_2000_2013['Margen de Rentabilidad'] = ano_2000_2013['Ganancias'] / ano_2000_2013['Ingresos']
ano_2000_2013['Rentabilidad de los Activos (ROA)'] = ano_2000_2013['Ganancias'] / ano_2000_2013['Activos']
ano_2000_2013['Año'] = '2013'
ano_2000_2014['Margen de Rentabilidad'] = ano_2000_2014['Ganancias'] / ano_2000_2014['Ingresos']
ano_2000_2014['Rentabilidad de los Activos (ROA)'] = ano_2000_2014['Ganancias'] / ano_2000_2014['Activos']
ano_2000_2014['Año'] = '2014'
ano_2000_2015['Margen de Rentabilidad'] = ano_2000_2015['Ganancias'] / ano_2000_2015['Ingresos']
ano_2000_2015['Rentabilidad de los Activos (ROA)'] = ano_2000_2015['Ganancias'] / ano_2000_2015['Activos']
ano_2000_2015['Año'] = '2015'
ano_2000_2016['Margen de Rentabilidad'] = ano_2000_2016['Ganancias'] / ano_2000_2016['Ingresos']
ano_2000_2016['Rentabilidad de los Activos (ROA)'] = ano_2000_2016['Ganancias'] / ano_2000_2016['Activos']
ano_2000_2016['Año'] = '2016'
ano_2000_2017['Margen de Rentabilidad'] = ano_2000_2017['Ganancias'] / ano_2000_2017['Ingresos']
ano_2000_2017['Rentabilidad de los Activos (ROA)'] = ano_2000_2017['Ganancias'] / ano_2000_2017['Activos']
ano_2000_2017['Año'] = '2017'
ano_2000_2018['Margen de Rentabilidad'] = ano_2000_2018['Ganancias'] / ano_2000_2018['Ingresos']
ano_2000_2018['Rentabilidad de los Activos (ROA)'] = ano_2000_2018['Ganancias'] / ano_2000_2018['Activos']
ano_2000_2018['Año'] = '2018'
ano_2000_2019['Margen de Rentabilidad'] = ano_2000_2019['Ganancias'] / ano_2000_2019['Ingresos']
ano_2000_2019['Rentabilidad de los Activos (ROA)'] = ano_2000_2019['Ganancias'] / ano_2000_2019['Activos']
ano_2000_2019['Año'] = '2019'
ano_2000_2020['Margen de Rentabilidad'] = ano_2000_2020['Ganancias'] / ano_2000_2020['Ingresos']
ano_2000_2020['Rentabilidad de los Activos (ROA)'] = ano_2000_2020['Ganancias'] / ano_2000_2020['Activos']
ano_2000_2020['Año'] = '2020'
ano_2000_2021['Margen de Rentabilidad'] = ano_2000_2021['Ganancias'] / ano_2000_2021['Ingresos']
ano_2000_2021['Rentabilidad de los Activos (ROA)'] = ano_2000_2021['Ganancias'] / ano_2000_2021['Activos']
ano_2000_2021['Año'] = '2021'
ano_2000_2022['Margen de Rentabilidad'] = ano_2000_2022['Ganancias'] / ano_2000_2022['Ingresos']
ano_2000_2022['Rentabilidad de los Activos (ROA)'] = ano_2000_2022['Ganancias'] / ano_2000_2022['Activos']
ano_2000_2022['Año'] = '2022'
# Mostrar las primeras filas del dataframe
ano_2000_2022
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Berkshire Hathaway | Diversified Financials | United States | 276094 | 89795.0 | 958784 | 741476 | 0.325233 | 0.093655 | 2022 |
1 | 2 | ICBC | Banking | China | 208127 | 54028.3 | 5518508 | 214425 | 0.259593 | 0.009790 | 2022 |
2 | 3 | Saudi Arabian Oil Company (Saudi Aramco) | Oil & Gas Operations | Saudi Arabia | 400376 | 105363.0 | 576041 | 2292077 | 0.263160 | 0.182909 | 2022 |
3 | 4 | JPMorgan Chase | Diversified Financials | United States | 124542 | 42115.0 | 3954687 | 374446 | 0.338159 | 0.010649 | 2022 |
4 | 5 | China Construction Bank | Banking | China | 202069 | 46887.3 | 4746951 | 181325 | 0.232036 | 0.009877 | 2022 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1995 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37 | 1408.3 | 166 | 1136 | 38.062162 | 8.483735 | 2022 |
1996 | 1997 | NMDC | Materials | India | 3520 | 1406.4 | 5715 | 6401 | 0.399545 | 0.246089 | 2022 |
1997 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716 | 53.1 | 12105 | 1957 | 0.003379 | 0.004387 | 2022 |
1998 | 1999 | Satellite Chemical | Chemicals | China | 4413 | 931.3 | 7640 | 9521 | 0.211036 | 0.121898 | 2022 |
1999 | 2000 | Sun Communities | Diversified Financials | United States | 2273 | 375.7 | 13494 | 21714 | 0.165288 | 0.027842 | 2022 |
2000 rows × 11 columns
B. A los datasets de Fortune Global 500 les vas a cambiar únicamente el nombre de las dos columnas que vas a utilizar (Empresa, Empleados) y añadir una nueva columna para el Año. De esta manera, vas a obtener datasets de Fortune con 3 columnas y 500 filas cada uno.
import pandas as pd
# Cargar el dataset de Fortune Global 500
ano_500_2015 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2015.csv')
ano_500_2016 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2016.csv')
ano_500_2017 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2017.csv')
ano_500_2018 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2018.csv')
ano_500_2019 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2019.csv')
ano_500_2020 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2020.csv')
ano_500_2021 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2021.csv')
ano_500_2022 = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/fortune_global_500/data/fortune_global_2022.csv')
# Cambiar los nombres de las columnas
ano_500_2015 = ano_500_2015.rename(columns={'Name': 'Empresa', 'Employees': 'Empleados'})
ano_500_2016 = ano_500_2016.rename(columns={'Name': 'Empresa', 'Revenues': 'Empleados'})
ano_500_2017 = ano_500_2017.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
ano_500_2018 = ano_500_2018.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
ano_500_2019 = ano_500_2019.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
ano_500_2020 = ano_500_2020.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
ano_500_2021 = ano_500_2021.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
ano_500_2022 = ano_500_2022.rename(columns={'Name': 'Empresa', 'Unnamed: 7': 'Empleados'})
# Agregar una columna para el año
ano_500_2015['Año'] = '2015'
ano_500_2016['Año'] = '2016'
ano_500_2017['Año'] = '2017'
ano_500_2018['Año'] = '2018'
ano_500_2019['Año'] = '2019'
ano_500_2020['Año'] = '2020'
ano_500_2021['Año'] = '2021'
ano_500_2022['Año'] = '2022'
# Seleccionar únicamente las columnas que necesitas
ano_500_2015 = ano_500_2015[['Empresa', 'Empleados', 'Año']]
ano_500_2016 = ano_500_2016[['Empresa', 'Empleados', 'Año']]
ano_500_2017 = ano_500_2017[['Empresa', 'Empleados', 'Año']]
ano_500_2018 = ano_500_2018[['Empresa', 'Empleados', 'Año']]
ano_500_2019 = ano_500_2019[['Empresa', 'Empleados', 'Año']]
ano_500_2020 = ano_500_2020[['Empresa', 'Empleados', 'Año']]
ano_500_2021 = ano_500_2021[['Empresa', 'Empleados', 'Año']]
ano_500_2022 = ano_500_2022[['Empresa', 'Empleados', 'Año']]
**C. A los datasets de country_code y de continente les vas a renombrar sus nombres de columna únicamente. Vas a mantener en ambos datasets las columnas del nombre de pais y codigo (3 letras) y en el de continente, vas a mantener el **nombre del continente.**
En este paso te sugerimos colocar nombres sencillos a tus columnas como: Pais, Codigo y Continente.
import pandas as pd
# Cargar el dataset de country_code
country = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/continentes_y_paises/country_code.csv')
# Cambiar los nombres de las columnas
country = country.rename(columns={'Country': 'Pais', 'Code': 'Codigo'})
# Cargar el dataset de continente
continente = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/continentes_y_paises/continente.csv')
# Cambiar los nombres de las columnas
continente = continente.rename(columns={'Continent_Name': 'Continente', 'Three_Letter_Country_Code': 'Codigo'})
4. Junción de Tablas y Análisis Exploratorio
Parte 1
A. Es esencial aclarar que el dataframe principal, del cual vamos a partir para desarrollar el análisis es el de Forbes 2000 - 2022
import pandas as pd
# Crear un diccionario con las variables que deseamos combinar
dict_anos = {'ano_2000_2015': ano_2000_2015, 'ano_2000_2016': ano_2000_2016, 'ano_2000_2017': ano_2000_2017,
'ano_2000_2018': ano_2000_2018, 'ano_2000_2019': ano_2000_2019, 'ano_2000_2020': ano_2000_2020,
'ano_2000_2021': ano_2000_2021, 'ano_2000_2022': ano_2000_2022}
# Concatenar los dataframes del diccionario en uno solo
df_forbes_concat = pd.concat(dict_anos.values())
# Mostrar las primeras filas del dataframe resultante
df_forbes_concat
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1995 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 |
1996 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 |
1997 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 |
1998 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 |
1999 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 |
15998 rows × 11 columns
B. Al dataframe indicado, le vamos a añadir los dataframes de continente y de country_code, seleccionando únicamente las columnas de Continente, Pais y Codigo. Asegúrate de escoger la junción que mantiene todo el primer dataset completo.
# Cargar el dataset de continente
df_country = (country )[['Pais', 'Codigo']]
# Cargar el dataset de country_code
df_continente = (continente)[['Continente', 'Codigo']]
# Unir los dataframes
df_forbes_un = df_forbes_concat
df_forbes_un = pd.merge(df_forbes_un, df_country, on='Pais', how='left')
df_forbes_un = pd.merge(df_forbes_un, df_continente, on='Codigo', how='left')
# Mostrar las primeras filas del dataframe
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16286 rows × 13 columns
C. Vas a identificar en que columnas tienes valores faltantes, localizar los registros o las filas con los datos faltantes y tomar una acción de acuerdo con lo que veas (Ejemplo: El nombre del país está escrito de forma incorrecta, hay inconsistencias en la fila, etc).
Observación: En la medida de lo posible, debes tratar de preservar todos los datos contenidos en tu dataset antes de ir a eliminar alguna fila.
# Identificar los valores faltantes
##print(df_forbes_un.isna().sum())
# Tomar acciones para tratar los valores faltantes
# Por ejemplo, rellenar los valores faltantes de la columna Codigo con 'N/A'
##df_forbes['Codigo'] = df_forbes['Codigo'].fillna('N/A')
# Mostrar las primeras filas del dataframe
print(df_forbes_un.isna().sum())
df_forbes_un
rank_nr 0
Empresa 0
Industria 0
Pais 0
Ingresos 8
Ganancias 2
Activos 15
Valor de Mercado 6
Margen de Rentabilidad 10
Rentabilidad de los Activos (ROA) 16
Año 0
Codigo 513
Continente 513
dtype: int64
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16286 rows × 13 columns
import pandas as pd
# Mostrar las filas con valores nulos en la columna 'Codigo'
df_vacias = df_forbes_un[df_forbes_un['Codigo'].isnull()]
df_vacias
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
17 | 18 | Samsung Electronics | Semiconductors | South Korea | 195891.0 | 21927.8 | 209637.0 | 199356.0 | 0.111939 | 0.104599 | 2015 | NaN | NaN |
119 | 117 | Hyundai Motor | Consumer Durables | South Korea | 84791.0 | 6979.3 | 133945.0 | 32854.0 | 0.082312 | 0.052106 | 2015 | NaN | NaN |
174 | 171 | Korea Electric Power | Utilities | South Korea | 54600.0 | 2552.5 | 148941.0 | 27040.0 | 0.046749 | 0.017138 | 2015 | NaN | NaN |
283 | 279 | Shinhan Financial Group | Diversified Financials | South Korea | 20072.0 | 1948.6 | 307530.0 | 17791.0 | 0.097081 | 0.006336 | 2015 | NaN | NaN |
302 | 298 | Hyundai Mobis | Consumer Durables | South Korea | 34375.0 | 3251.2 | 35584.0 | 21106.0 | 0.094580 | 0.091367 | 2015 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16082 | 1798 | Korea Zinc | Materials | South Korea | 8712.0 | 704.5 | 8382.0 | 8857.0 | 0.080865 | 0.084049 | 2022 | NaN | NaN |
16136 | 1850 | Korean Air | Transportation | South Korea | 7873.0 | 489.8 | 22437.0 | 8813.0 | 0.062213 | 0.021830 | 2022 | NaN | NaN |
16176 | 1891 | F&F | Consumer Durables | South Korea | 635.0 | 1661.6 | 2450.0 | 892.0 | 2.616693 | 0.678204 | 2022 | NaN | NaN |
16181 | 1893 | Samsung SDS | IT Software & Services | South Korea | 11902.0 | 533.7 | 8847.0 | 8708.0 | 0.044841 | 0.060326 | 2022 | NaN | NaN |
16262 | 1976 | JB Financial Group | Banking | South Korea | 2002.0 | 426.0 | 47441.0 | 1413.0 | 0.212787 | 0.008980 | 2022 | NaN | NaN |
513 rows × 13 columns
¡Extra!
Trata de localizar los nombres de las empresas que aparecen en la lista de Fortune que no tuvieron correspondiente con la lista de Forbes. (Si los logras ubicar, realiza los respectivos ajustes a los nombres para que puedas traer la información faltante sobre el número de empleados)
# Actualizar los valores para el país 'South Korea'
df_forbes_un.loc[df_forbes_un['Pais'] == 'South Korea', 'Codigo'] = 'SKS'
df_forbes_un.loc[df_forbes_un['Pais'] == 'South Korea', 'Continente'] = 'Asia'
# Mostrar las primeras filas del dataframe
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16286 rows × 13 columns
import pandas as pd
# Mostrar las filas con valores nulos en la columna 'Codigo'
df_vacias = df_forbes_un[df_forbes_un['Codigo'].isnull()]
df_vacias
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
13711 | True | fred/companies/F2K/2021/105837 | IT Software & Services | 5855 | 68126.0 | 1793.0 | NaN | 235.0 | 0.026319 | NaN | 2021 | NaN | NaN |
14997 | True | fred/companies/F2K/2022/105837 | IT Software & Services | 21274 | 28636.0 | 370.0 | 1468.0 | 632.0 | 0.012921 | 0.252044 | 2022 | NaN | NaN |
import pandas as pd
# Eliminar las filas con valores nulos en la columna 'Codigo'
df_forbes_un = df_forbes_un.dropna(subset=['Codigo'])
# Mostrar las primeras filas del dataframe resultante
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16284 rows × 13 columns
# Mostrar las primeras filas del dataframe
print(df_forbes_un.isna().sum())
df_forbes_un
rank_nr 0
Empresa 0
Industria 0
Pais 0
Ingresos 8
Ganancias 2
Activos 14
Valor de Mercado 6
Margen de Rentabilidad 10
Rentabilidad de los Activos (ROA) 15
Año 0
Codigo 0
Continente 0
dtype: int64
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16284 rows × 13 columns
import pandas as pd
# Mostrar las filas con valores nulos en la columna 'Rentabilidad de los Activos (ROA)'
df_vacias = df_forbes_un[df_forbes_un['Rentabilidad de los Activos (ROA)'].isnull()]
df_vacias
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1966 | 1927 | Shanghai Material Trading | Trading Companies | China | 12381.0 | 6.2 | NaN | 908.0 | 0.000501 | NaN | 2015 | CHN | Asia |
3558 | 1492 | Ambac Financial Group | Insurance | United States | 638.0 | NaN | NaN | NaN | NaN | NaN | 2016 | USA | North America |
3915 | 1840 | Banque nationale de Belgique | Banking | Belgium | 1742.0 | 902.8 | NaN | 1343.0 | 0.518255 | NaN | 2016 | BEL | Europe |
5835 | 1727 | Bank of Greece | Banking | Greece | 1935.0 | 1208.4 | NaN | 240.0 | 0.624496 | NaN | 2017 | GRC | Europe |
6970 | 842 | Infineon Technologies | Semiconductors | Germany | 8486.0 | 1275.0 | NaN | 32351.0 | 0.150247 | NaN | 2018 | DEU | Europe |
7792 | 1650 | IndusInd Bank | Banking | India | 2770.0 | 427.7 | NaN | 16896.0 | 0.154404 | NaN | 2018 | IND | Asia |
8006 | 1860 | Bank of Greece | Banking | Greece | 1679.0 | 1062.3 | NaN | 354.0 | 0.632698 | NaN | 2018 | GRC | Europe |
8060 | 1914 | Grupo Zuliano | Chemicals | Venezuela | NaN | 998.9 | NaN | 139.0 | NaN | NaN | 2018 | VEN | South America |
9142 | 973 | Mahindra & Mahindra | Consumer Durables | India | 15189.0 | 833.0 | NaN | 12252.0 | 0.054842 | NaN | 2019 | IND | Asia |
9263 | 1092 | SM Investments | Retailing | Philippines | 8538.0 | NaN | 18951.0 | 21639.0 | NaN | NaN | 2019 | PHL | Asia |
9628 | 1453 | Chongqing Rural Bank | Banking | China | 6936.0 | 1369.0 | NaN | 6144.0 | 0.197376 | NaN | 2019 | CHN | Asia |
9703 | 1526 | Finatis | Trading Companies | France | 44249.0 | -92.0 | NaN | 260.0 | -0.002079 | NaN | 2019 | FRA | Europe |
9994 | 1812 | Yes Bank | Banking | India | 3965.0 | 657.0 | NaN | 8523.0 | 0.165700 | NaN | 2019 | IND | Asia |
10159 | 1977 | Drilling Company of 1972 | Oil & Gas Operations | Denmark | 1429.0 | 941.0 | NaN | 3202.0 | 0.658502 | NaN | 2019 | DNK | Europe |
14182 | 1933 | Bank of Greece | Banking | Greece | 1324.0 | 942.8 | NaN | 366.0 | 0.712085 | NaN | 2021 | GRC | Europe |
import pandas as pd
# Eliminar las filas con valores nulos en la columna 'Rentabilidad de los Activos (ROA)'
df_forbes_un = df_forbes_un.dropna(subset=['Rentabilidad de los Activos (ROA)'])
# Mostrar las primeras filas del dataframe resultante
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16269 rows × 13 columns
# Mostrar las primeras filas del dataframe
print(df_forbes_un.isna().sum())
df_forbes_un
rank_nr 0
Empresa 0
Industria 0
Pais 0
Ingresos 7
Ganancias 0
Activos 0
Valor de Mercado 5
Margen de Rentabilidad 7
Rentabilidad de los Activos (ROA) 0
Año 0
Codigo 0
Continente 0
dtype: int64
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16269 rows × 13 columns
import pandas as pd
# Mostrar las filas con valores nulos en la columna 'Margen de Rentabilidad '
df_vacias = df_forbes_un[df_forbes_un['Margen de Rentabilidad'].isnull()]
df_vacias
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
706 | 695 | Porsche Automobil Holding | Consumer Durables | Germany | NaN | 4016.0 | 36864.0 | 15287.0 | NaN | 0.108941 | 2015 | DEU | Europe |
1516 | 1489 | Dexia | Banking | Belgium | NaN | -803.8 | 299028.0 | 2352.0 | NaN | -0.002688 | 2015 | BEL | Europe |
2724 | 672 | Porsche Automobil Holding | Consumer Durables | Germany | NaN | 3516.9 | 34910.0 | 16556.0 | NaN | 0.100742 | 2016 | DEU | Europe |
3132 | 1072 | Kyushu Financial Group | Banking | Japan | NaN | 812.3 | 72979.0 | 2640.0 | NaN | 0.011131 | 2016 | JPN | Asia |
3462 | 1398 | RHB Capital | Banking | Malaysia | NaN | 386.6 | 53736.0 | 4890.0 | NaN | 0.007194 | 2016 | MYS | Asia |
5906 | 1796 | Grupo Zuliano | Chemicals | Venezuela | NaN | 998.9 | 1521.0 | 72.0 | NaN | 0.656739 | 2017 | VEN | South America |
6026 | 1914 | Technipfmc | Oil & Gas Operations | United Kingdom | NaN | 0.0 | 1.0 | 15631.0 | NaN | 0.000000 | 2017 | GBR | Europe |
import pandas as pd
# Eliminar las filas con valores nulos en la columna 'Rentabilidad de los Activos (ROA)'
df_forbes_un = df_forbes_un.dropna(subset=['Margen de Rentabilidad'])
# Mostrar las primeras filas del dataframe resultante
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16262 rows × 13 columns
# Mostrar las primeras filas del dataframe
print(df_forbes_un.isna().sum())
df_forbes_un
rank_nr 0
Empresa 0
Industria 0
Pais 0
Ingresos 0
Ganancias 0
Activos 0
Valor de Mercado 5
Margen de Rentabilidad 0
Rentabilidad de los Activos (ROA) 0
Año 0
Codigo 0
Continente 0
dtype: int64
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16262 rows × 13 columns
import pandas as pd
# Eliminar las filas con valores nulos en la columna 'Valor de Mercado'
df_forbes_un = df_forbes_un.dropna(subset=['Valor de Mercado'])
# Mostrar las primeras filas del dataframe resultante
df_forbes_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16257 rows × 13 columns
# Mostrar las primeras filas del dataframe
print(df_forbes_un.isna().sum())
df_forbes_un
rank_nr 0
Empresa 0
Industria 0
Pais 0
Ingresos 0
Ganancias 0
Activos 0
Valor de Mercado 0
Margen de Rentabilidad 0
Rentabilidad de los Activos (ROA) 0
Año 0
Codigo 0
Continente 0
dtype: int64
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ICBC | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | China Construction Bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | Agricultural Bank of China | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | Bank of China | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | Berkshire Hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | Shenzhen Feima International Supply Chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | NMDC | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | Sichuan Changhong Electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | Satellite Chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | Sun Communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16257 rows × 13 columns
Parte 2
A. Vas a concatenar todos los datasets de Forbes 2000 desde el año 2015 hasta el año 2022.
# Crear una copia del dataframe original
df_forbes_un_empresa = df_forbes_un.copy()
# Normalizar los nombres de la columna "Empresa" en la copia
df_forbes_un_empresa['Empresa'] = df_forbes_un_empresa['Empresa'].str.normalize('NFKD')\
.str.encode('ascii', errors='ignore')\
.str.decode('utf-8')\
.str.lower()
# Mostrar el dataframe sin advertencias
df_forbes_un_empresa
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | icbc | Banking | China | 166796.0 | 44757.2 | 3322043.0 | 278327.0 | 0.268335 | 0.013473 | 2015 | CHN | Asia |
1 | 2 | china construction bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia |
2 | 3 | agricultural bank of china | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia |
3 | 4 | bank of china | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia |
4 | 5 | berkshire hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16281 | 1995 | shenzhen feima international supply chain | Business Services & Supplies | China | 37.0 | 1408.3 | 166.0 | 1136.0 | 38.062162 | 8.483735 | 2022 | CHN | Asia |
16282 | 1997 | nmdc | Materials | India | 3520.0 | 1406.4 | 5715.0 | 6401.0 | 0.399545 | 0.246089 | 2022 | IND | Asia |
16283 | 1997 | sichuan changhong electric | Consumer Durables | China | 15716.0 | 53.1 | 12105.0 | 1957.0 | 0.003379 | 0.004387 | 2022 | CHN | Asia |
16284 | 1999 | satellite chemical | Chemicals | China | 4413.0 | 931.3 | 7640.0 | 9521.0 | 0.211036 | 0.121898 | 2022 | CHN | Asia |
16285 | 2000 | sun communities | Diversified Financials | United States | 2273.0 | 375.7 | 13494.0 | 21714.0 | 0.165288 | 0.027842 | 2022 | USA | North America |
16257 rows × 13 columns
B. Tu nuevo dataframe debe contener 16000 filas x 13 columnas: 'Rank_nr', 'Empresa', 'Industria', 'Pais', 'Ingresos', 'Ganancias', 'Activos', 'Valor_Mercado', 'Ano', 'Margen_Rentabilidad', 'ROA', 'Continente', 'Codigo'
import pandas as pd
# Crear un diccionario con las variables que deseamos combinar
dict_anos_for = {'ano_500_2015': ano_500_2015, 'ano_500_2016': ano_500_2016, 'ano_500_2017': ano_500_2017,
'ano_500_2018': ano_500_2018, 'ano_500_2019': ano_500_2019, 'ano_500_2020': ano_500_2020,
'ano_500_2021': ano_500_2021, 'ano_500_2022': ano_500_2022}
# Concatenar los dataframes del diccionario en uno solo
df_fortune_un = pd.concat(dict_anos_for.values())
# Mostrar las primeras filas del dataframe resultante
df_fortune_un
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Empleados | Año | |
---|---|---|---|
0 | Walmart | 2200000 | 2015 |
1 | Sinopec Group | 897488 | 2015 |
2 | Royal Dutch Shell | 94000 | 2015 |
3 | China National Petroleum | 1636532 | 2015 |
4 | Exxon Mobil | 83700 | 2015 |
... | ... | ... | ... |
495 | DSV | 77958 | 2022 |
496 | ABB | 104400 | 2022 |
497 | Mondelez International | 79000 | 2022 |
498 | Danone | 98105 | 2022 |
499 | Umicore | 11050 | 2022 |
4001 rows × 3 columns
# Crear una copia del dataframe original
df_fortune_un_empresa = df_fortune_un.copy()
# Normalizar los nombres de la columna "Empresa" en la copia
df_fortune_un_empresa['Empresa'] = df_fortune_un_empresa['Empresa'].str.normalize('NFKD')\
.str.encode('ascii', errors='ignore')\
.str.decode('utf-8')\
.str.lower()
# Mostrar el dataframe sin advertencias
df_fortune_un_empresa
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Empleados | Año | |
---|---|---|---|
0 | walmart | 2200000 | 2015 |
1 | sinopec group | 897488 | 2015 |
2 | royal dutch shell | 94000 | 2015 |
3 | china national petroleum | 1636532 | 2015 |
4 | exxon mobil | 83700 | 2015 |
... | ... | ... | ... |
495 | dsv | 77958 | 2022 |
496 | abb | 104400 | 2022 |
497 | mondelez international | 79000 | 2022 |
498 | danone | 98105 | 2022 |
499 | umicore | 11050 | 2022 |
4001 rows × 3 columns
Parte 3
A. Vas a hacer la junción de todos los datasets de Forbes 2000 desde el año 2015 hasta el año 2022 con los datasets de Fortune Global 500 que contienen únicamente 4000 filas y 3 columna: 'Ano', 'Empresa', 'Empleados'
. Observación: La junción con los datos de Forbes debe ser utilizando dos columnas como clave que serían 'Ano', 'Empresa'
, respectivamente.
# Realizar la unión de los datasets de Forbes y Fortune
df_concat = pd.merge(df_forbes_un_empresa, df_fortune_un_empresa, on=['Año', 'Empresa'], how='inner')
# Mostrar las primeras filas del dataframe resultante
df_concat
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | Empleados | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2 | china construction bank | Banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia | 372321 |
1 | 3 | agricultural bank of china | Banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia | 505627 |
2 | 4 | bank of china | Banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia | 308128 |
3 | 5 | berkshire hathaway | Diversified Financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America | 316000 |
4 | 7 | exxon mobil | Oil & Gas Operations | United States | 376240.0 | 32520.0 | 349493.0 | 357094.0 | 0.086434 | 0.093049 | 2015 | USA | North America | 83700 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2307 | 1513 | performance food group | Food Markets | United States | 39732.0 | 36.9 | 12220.0 | 8130.0 | 0.000929 | 0.003020 | 2022 | USA | North America | 22885 |
2308 | 1529 | us foods | Food Markets | United States | 29487.0 | 164.0 | 12521.0 | 8523.0 | 0.005562 | 0.013098 | 2022 | USA | North America | 28000 |
2309 | 1548 | medipal holdings | Drugs & Biotechnology | Japan | 29849.0 | 331.4 | 15444.0 | 3349.0 | 0.011103 | 0.021458 | 2022 | JPN | Asia | 14454 |
2310 | 1640 | world fuel services | Trading Companies | United States | 31300.0 | 73.6 | 5942.0 | 1715.0 | 0.002351 | 0.012386 | 2022 | USA | North America | 4414 |
2311 | 1656 | rajesh exports | Consumer Durables | India | 30005.0 | 157.3 | 2696.0 | 2496.0 | 0.005242 | 0.058346 | 2022 | IND | Asia | 181 |
2312 rows × 14 columns
# Convertir a minúsculas
df_concat['Industria'] = df_concat['Industria'].str.lower()
# Cambiar "telecommunications services" por una sola cadena
df_concat['Industria'] = df_concat['Industria'].replace('telecommunications services', 'telecommunication services')
df_concat
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | Empleados | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2 | china construction bank | banking | China | 130473.0 | 37038.9 | 2698925.0 | 212945.0 | 0.283882 | 0.013724 | 2015 | CHN | Asia | 372321 |
1 | 3 | agricultural bank of china | banking | China | 129221.0 | 29124.5 | 2574815.0 | 189879.0 | 0.225385 | 0.011311 | 2015 | CHN | Asia | 505627 |
2 | 4 | bank of china | banking | China | 120297.0 | 27526.8 | 2458336.0 | 199130.0 | 0.228824 | 0.011197 | 2015 | CHN | Asia | 308128 |
3 | 5 | berkshire hathaway | diversified financials | United States | 194673.0 | 19872.0 | 534618.0 | 354813.0 | 0.102079 | 0.037170 | 2015 | USA | North America | 316000 |
4 | 7 | exxon mobil | oil & gas operations | United States | 376240.0 | 32520.0 | 349493.0 | 357094.0 | 0.086434 | 0.093049 | 2015 | USA | North America | 83700 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2307 | 1513 | performance food group | food markets | United States | 39732.0 | 36.9 | 12220.0 | 8130.0 | 0.000929 | 0.003020 | 2022 | USA | North America | 22885 |
2308 | 1529 | us foods | food markets | United States | 29487.0 | 164.0 | 12521.0 | 8523.0 | 0.005562 | 0.013098 | 2022 | USA | North America | 28000 |
2309 | 1548 | medipal holdings | drugs & biotechnology | Japan | 29849.0 | 331.4 | 15444.0 | 3349.0 | 0.011103 | 0.021458 | 2022 | JPN | Asia | 14454 |
2310 | 1640 | world fuel services | trading companies | United States | 31300.0 | 73.6 | 5942.0 | 1715.0 | 0.002351 | 0.012386 | 2022 | USA | North America | 4414 |
2311 | 1656 | rajesh exports | consumer durables | India | 30005.0 | 157.3 | 2696.0 | 2496.0 | 0.005242 | 0.058346 | 2022 | IND | Asia | 181 |
2312 rows × 14 columns
B. Como los rankings de Forbes y de Fortune son diferentes, vas a tener más del 80% de datos referentes a empleados faltantes. En este caso, únicamente vamos a trabajar con los datos que tienen correspondencia en ambas bases de datos. Se trata de alrededor 2200 registros de Forbes que tienen correspondencia con registros de Fortune que permiten tener la información sobre el número de empleados.
# Realizar la unión de los datasets de Forbes y Fortune
df_merge = pd.merge(df_forbes_un, df_fortune_un, on=['Año', 'Empresa'], how='left', indicator=True)
# Mostrar las empresas que no tienen correspondencia en Forbes
df_missing = df_merge[df_merge['_merge'] == 'left_only']
# Mostrar las empresas que no tienen correspondencia en Forbes en un dataframe
df_empresas = pd.DataFrame(df_missing['Empresa'].unique(), columns=['Empresa'])
df_empresas = df_empresas.sort_values(by=['Empresa'])
df_empresas
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | |
---|---|
2292 | 360 Security Technology |
1288 | 3i Group |
1330 | 77 Bank |
1609 | A2A |
1852 | AAC Technologies Holdings |
... | ... |
365 | eBay |
2491 | iA Financial Corporation |
1705 | iHeartMedia |
2605 | iQIYI |
2967 | tesla |
3136 rows × 1 columns
# Mostrar las empresas que no tienen correspondencia en Forbes en un dataframe
df_emp = pd.DataFrame(df_concat['Empresa'].unique(), columns=['Empresa'])
df_emp = df_emp.sort_values(by=['Empresa'])
df_emp
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | |
---|---|
136 | 3m |
134 | abb |
363 | abbott laboratories |
300 | abbvie |
186 | accenture |
... | ... |
412 | x5 retail group |
353 | xiamen c&d |
385 | xiaomi |
423 | zijin mining group |
49 | zurich insurance group |
448 rows × 1 columns
# Mostrar todas las Industrias
df_indus = pd.DataFrame(df_concat['Industria'].unique(), columns=['Industria'])
df_indus = df_indus.sort_values(by=['Industria'])
df_indus
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Industria | |
---|---|
16 | aerospace & defense |
22 | air courier |
24 | airline |
0 | banking |
25 | business services & supplies |
20 | capital goods |
15 | chemicals |
3 | conglomerates |
19 | construction |
4 | consumer durables |
1 | diversified financials |
13 | diversified metals & mining |
12 | drugs & biotechnology |
26 | food markets |
14 | food, drink & tobacco |
10 | health care equipment & services |
23 | hotels, restaurants & leisure |
7 | insurance |
8 | it software & services |
28 | materials |
11 | media |
2 | oil & gas operations |
29 | real estate |
17 | retailing |
6 | semiconductors |
5 | technology hardware & equipment |
9 | telecommunication services |
27 | trading companies |
21 | transportation |
18 | utilities |
# Filtrar DataFrame original por "Russia"
df_russia = df_concat.loc[df_concat['Pais'] == 'Russia']
# Seleccionar columnas de interés
df_russia = df_russia[['Pais', 'Continente','Año']]
# Mostrar DataFrame filtrado
df_russia
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pais | Continente | Año | |
---|---|---|---|
18 | Russia | Europe | 2015 |
19 | Russia | Asia | 2015 |
73 | Russia | Europe | 2015 |
74 | Russia | Asia | 2015 |
83 | Russia | Europe | 2015 |
84 | Russia | Asia | 2015 |
245 | Russia | Europe | 2015 |
246 | Russia | Asia | 2015 |
335 | Russia | Europe | 2016 |
336 | Russia | Asia | 2016 |
366 | Russia | Europe | 2016 |
367 | Russia | Asia | 2016 |
378 | Russia | Europe | 2016 |
379 | Russia | Asia | 2016 |
539 | Russia | Europe | 2016 |
540 | Russia | Asia | 2016 |
616 | Russia | Europe | 2017 |
617 | Russia | Asia | 2017 |
632 | Russia | Europe | 2017 |
633 | Russia | Asia | 2017 |
684 | Russia | Europe | 2017 |
685 | Russia | Asia | 2017 |
926 | Russia | Europe | 2018 |
927 | Russia | Asia | 2018 |
930 | Russia | Europe | 2018 |
931 | Russia | Asia | 2018 |
969 | Russia | Europe | 2018 |
970 | Russia | Asia | 2018 |
1227 | Russia | Europe | 2019 |
1228 | Russia | Asia | 2019 |
1231 | Russia | Europe | 2019 |
1232 | Russia | Asia | 2019 |
1267 | Russia | Europe | 2019 |
1268 | Russia | Asia | 2019 |
1507 | Russia | Europe | 2020 |
1508 | Russia | Asia | 2020 |
1552 | Russia | Europe | 2020 |
1553 | Russia | Asia | 2020 |
1680 | Russia | Europe | 2020 |
1681 | Russia | Asia | 2020 |
1797 | Russia | Europe | 2021 |
1798 | Russia | Asia | 2021 |
1939 | Russia | Europe | 2021 |
1940 | Russia | Asia | 2021 |
1967 | Russia | Europe | 2021 |
1968 | Russia | Asia | 2021 |
2026 | Russia | Europe | 2021 |
2027 | Russia | Asia | 2021 |
2071 | Russia | Europe | 2022 |
2072 | Russia | Asia | 2022 |
2118 | Russia | Europe | 2022 |
2119 | Russia | Asia | 2022 |
2146 | Russia | Europe | 2022 |
2147 | Russia | Asia | 2022 |
2304 | Russia | Europe | 2022 |
2305 | Russia | Asia | 2022 |
# Filtrar DataFrame por el continente "Europe"
df_europe = df_concat.loc[df_concat['Continente'] == 'Europe']
# Eliminar filas correspondientes a "Russia" en la columna "Pais"
df_europe_sin_rusia = df_europe.loc[df_europe['Pais'] != 'Russia']
# Concatenar DataFrame filtrado con aquellas filas que no corresponden a "Europe"
df_concat = pd.concat([df_europe_sin_rusia, df_concat.loc[df_concat['Continente'] != 'Europe']])
# Mostrar DataFrame filtrado
df_concat
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | Empleados | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9 | 13 | royal dutch shell | oil & gas operations | Netherlands | 420371.0 | 14884.1 | 353116.0 | 195380.0 | 0.035407 | 0.042151 | 2015 | NLD | Europe | 94000 |
10 | 15 | hsbc holdings | banking | United Kingdom | 81086.0 | 13536.7 | 2634139.0 | 167746.0 | 0.166943 | 0.005139 | 2015 | GBR | Europe | 264767 |
14 | 21 | allianz | insurance | Germany | 128401.0 | 8250.5 | 978980.0 | 82007.0 | 0.064256 | 0.008428 | 2015 | DEU | Europe | 147425 |
16 | 26 | daimler | consumer durables | Germany | 172268.0 | 9234.7 | 229468.0 | 103272.0 | 0.053607 | 0.040244 | 2015 | DEU | Europe | 279972 |
20 | 31 | banco santander | banking | Spain | 56361.0 | 7714.6 | 1532282.0 | 109351.0 | 0.136878 | 0.005035 | 2015 | ESP | Europe | 185405 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2307 | 1513 | performance food group | food markets | United States | 39732.0 | 36.9 | 12220.0 | 8130.0 | 0.000929 | 0.003020 | 2022 | USA | North America | 22885 |
2308 | 1529 | us foods | food markets | United States | 29487.0 | 164.0 | 12521.0 | 8523.0 | 0.005562 | 0.013098 | 2022 | USA | North America | 28000 |
2309 | 1548 | medipal holdings | drugs & biotechnology | Japan | 29849.0 | 331.4 | 15444.0 | 3349.0 | 0.011103 | 0.021458 | 2022 | JPN | Asia | 14454 |
2310 | 1640 | world fuel services | trading companies | United States | 31300.0 | 73.6 | 5942.0 | 1715.0 | 0.002351 | 0.012386 | 2022 | USA | North America | 4414 |
2311 | 1656 | rajesh exports | consumer durables | India | 30005.0 | 157.3 | 2696.0 | 2496.0 | 0.005242 | 0.058346 | 2022 | IND | Asia | 181 |
2284 rows × 14 columns
# # Filtrar las filas con valores de ROA mayores a 0.1
# df_filtrado = df_concat.loc[df_concat['Rentabilidad de los Activos (ROA)'] >= 1]
# df_filtrado
5. Consultas a los datos
CUESTIONARIO A
Con los resultados de tus consultas a los datos, llegó la hora de poner en práctica tus conocimientos en Matplotlib: Visualization with Python y seaborn: statistical data visualization
Debes generar una gráfica para cada pregunta formulada, utilizando todo el potencial que estas herramientas de visualización ofrecen. Establece un tamaño de lienzo de 15 x 8, un título, un subtítulo, los nombres a los ejes, leyenda, tamaño de fuente, una paleta de colores que facilite la visualización y que sea de tu gusto.
Dentro de los gráficos que vas a realizar, tendrás histogramas, gráficos de barras, gráficos de pizza, gráficos de dispersión, gráficos de línea, entre otros.
La idea es que explores y experimentes con todos los recursos que te brindan Matplotlib y Seaborn.
Las siguientes preguntas se refieren al ranking Forbes 2000 del año 2022:
A. ¿Cuál es el Top 10 de países con más empresas en Forbes para el periodo indicado?
import pandas as pd
# Filtrar para el año 2022
df_2022 = df_concat[df_concat['Año'] == '2022']
df_2022
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | Empleados | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2050 | 16 | shell | oil & gas operations | United Kingdom | 261761.0 | 20265.4 | 404379.0 | 211096.0 | 0.077419 | 0.050115 | 2022 | GBR | Europe | 82000 |
2062 | 35 | allianz | insurance | Germany | 138617.0 | 7812.9 | 1324620.0 | 96421.0 | 0.056363 | 0.005898 | 2022 | DEU | Europe | 155411 |
2065 | 38 | hsbc holdings | banking | United Kingdom | 59326.0 | 12577.5 | 2957939.0 | 135300.0 | 0.212007 | 0.004252 | 2022 | GBR | Europe | 219697 |
2066 | 39 | bnp paribas | banking | France | 127425.0 | 9848.3 | 2995890.0 | 68763.0 | 0.077287 | 0.003287 | 2022 | FRA | Europe | 189765 |
2068 | 41 | mercedes-benz group | consumer durables | Germany | 178935.0 | 27192.7 | 295480.0 | 74621.0 | 0.151970 | 0.092029 | 2022 | DEU | Europe | 172425 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2307 | 1513 | performance food group | food markets | United States | 39732.0 | 36.9 | 12220.0 | 8130.0 | 0.000929 | 0.003020 | 2022 | USA | North America | 22885 |
2308 | 1529 | us foods | food markets | United States | 29487.0 | 164.0 | 12521.0 | 8523.0 | 0.005562 | 0.013098 | 2022 | USA | North America | 28000 |
2309 | 1548 | medipal holdings | drugs & biotechnology | Japan | 29849.0 | 331.4 | 15444.0 | 3349.0 | 0.011103 | 0.021458 | 2022 | JPN | Asia | 14454 |
2310 | 1640 | world fuel services | trading companies | United States | 31300.0 | 73.6 | 5942.0 | 1715.0 | 0.002351 | 0.012386 | 2022 | USA | North America | 4414 |
2311 | 1656 | rajesh exports | consumer durables | India | 30005.0 | 157.3 | 2696.0 | 2496.0 | 0.005242 | 0.058346 | 2022 | IND | Asia | 181 |
270 rows × 14 columns
import pandas as pd
# Obtener el Top 10 de países con más empresas
top_10_paises = pd.DataFrame(df_2022['Pais'].value_counts().head(10)).reset_index()
# Renombrar las columnas
top_10_paises = top_10_paises.rename(columns={'index': 'Pais', 'Pais': '#de Empresas'})
top_10_paises
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pais | #de Empresas | |
---|---|---|
0 | United States | 94 |
1 | Japan | 31 |
2 | China | 27 |
3 | United Kingdom | 15 |
4 | Canada | 13 |
5 | Germany | 13 |
6 | France | 12 |
7 | South Korea | 12 |
8 | India | 8 |
9 | Switzerland | 6 |
import seaborn as sns
import matplotlib.pyplot as plt
# Crear la gráfica
sns.set(style='whitegrid')
plt.figure(figsize=(15,8))
plt.title('Top 10 Países con más Empresas', fontsize=20)
plt.xlabel('País', fontsize=16)
plt.ylabel('# de Empresas', fontsize=16)
sns.barplot(x='Pais', y='#de Empresas', data=top_10_paises, palette='Blues_d')
plt.xticks(fontsize=14, rotation=45)
plt.yticks(fontsize=14)
plt.tight_layout()
plt.show();
B.¿Cuál es el Top 4 de países con más empresas en el área de tecnología y de telecomunicaciones?
import pandas as pd
#Seleccionar las empresas del área de tecnología y de telecomunicaciones
df_tech = df_2022[df_2022['Industria'].str.contains('technology hardware & equipment|telecommunication services')]
#Obtener el Top 4 de países con más empresas en el área de tecnología y de telecomunicaciones
top_4_paises_tech = pd.DataFrame(df_tech['Pais'].value_counts().head(4))
#Renombrar las columnas
top_4_paises_tech = top_4_paises_tech.rename(columns={'Pais': '+ Empresas'})
#Cambiar el nombre del índice
top_4_paises_tech.index.name = 'Pais'
top_4_paises_tech
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
+ Empresas | |
---|---|
Pais | |
United States | 6 |
Taiwan | 4 |
Japan | 2 |
Germany | 1 |
import seaborn as sns
import matplotlib.pyplot as plt
# Crear la gráfica
plt.figure(figsize=(15,8))
plt.title('Top 4 Países con más Empresas en Tecnología y Telecomunicaciones', fontsize=20)
plt.pie(top_4_paises_tech['+ Empresas'], labels=top_4_paises_tech.index, autopct='%1.1f%%', startangle=90, colors=sns.color_palette('Blues_d'))
plt.axis('equal')
plt.legend(loc='best', fontsize=14)
plt.tight_layout()
plt.show();
C.¿Cuál fue el margen de pérdida de las 5 empresas que presentaron mayores perjuicios considerando el total de pérdidas registradas en la Industria de los Hoteles, Restaurantes y entretenimiento?
# Filtrar el DataFrame original por Empresa, Industria, Ingresos y Ganancias
df_filtered = df_2022[['Empresa', 'Industria', 'Ingresos', 'Ganancias', 'Activos']]
# Filtrar el DataFrame por Industria = hotels, restaurants & leisure
df_hotels = df_filtered[df_filtered['Industria'] == 'hotels, restaurants & leisure']
# Agrupar el DataFrame por Empresa y sumar los Ingresos y las Ganancias por empresa
df_hotels_grouped = df_hotels.groupby('Empresa').agg({'Ingresos': 'sum', 'Ganancias': 'sum', 'Activos': 'sum'})
# Agrupar por industria y empresa, y calcular las pérdidas
df_hotels_grouped['Costos'] = df_hotels_grouped['Activos'] - df_hotels_grouped['Ganancias']
df_hotels_grouped['Perdida = Costos - Ingresos'] = df_hotels_grouped['Costos'] - df_hotels_grouped['Ingresos']
# Calcular el margen de pérdida por empresa y ordenar de mayor a menor
df_hotels_grouped['Margen de Perdida = Costos / Ingresos'] = ((df_hotels_grouped['Costos']) / df_hotels_grouped['Ingresos']) * 100
df_hotels_grouped['Margen de Perdida = Costos / Ingresos'] = df_hotels_grouped['Margen de Perdida = Costos / Ingresos'].round(1)
df_mayores_perdidas_a = df_hotels_grouped.sort_values(by=['Perdida = Costos - Ingresos', 'Margen de Perdida = Costos / Ingresos'], ascending=[True, False])
# Filtrar el DataFrame por pérdidas negativas y mostrar solo las 10 primeras empresas
df_hotels_top5 = df_mayores_perdidas_a.loc[df_mayores_perdidas_a['Perdida = Costos - Ingresos'] < 0].head(5)
# Mostrar el DataFrame con Empresa, Ingresos, Ganancias, Costos, Perdida y Margen de Pérdida
df_hotels_top5 = df_hotels_top5[['Ingresos', 'Ganancias', 'Activos', 'Costos', 'Perdida = Costos - Ingresos', 'Margen de Perdida = Costos / Ingresos']]
df_hotels_top5
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Ingresos | Ganancias | Activos | Costos | Perdida = Costos - Ingresos | Margen de Perdida = Costos / Ingresos | |
---|---|---|---|---|---|---|
Empresa | ||||||
starbucks | 30358.0 | 4393.1 | 28834.0 | 24440.9 | -5917.1 | 80.5 |
# Crear el gráfico de barras horizontal
plt.figure(figsize=(15, 8))
sns.set_style('whitegrid')
sns.barplot(x='Ingresos', y='Empresa', data=df_hotels_top5.reset_index(), color='orange', label='Ingresos')
sns.barplot(x='Costos', y='Empresa', data=df_hotels_top5.reset_index(), color='blue', label='Costos')
sns.barplot(x='Perdida = Costos - Ingresos', y='Empresa', data=df_hotels_top5.reset_index(), color='red', label='Pérdidas')
sns.barplot(x='Margen de Perdida = Costos / Ingresos', y='Empresa', data=df_hotels_top5.reset_index(), color='purple', label='Margen de Pérdida')
plt.title('Top 5 empresas con mayores pérdidas en la industria de hoteles, restaurantes y entretenimiento')
plt.xlabel('Monto')
plt.ylabel('Empresa')
# Mover leyenda a la parte superior del gráfico
plt.legend(fontsize=12, bbox_to_anchor=(0.5, 1.15), ncol=4)
# Agregar valores de margen de pérdida encima de cada barra
for i in range(len(df_hotels_top5)):
margen = df_hotels_top5['Margen de Perdida = Costos / Ingresos'][i]
plt.text(df_hotels_top5['Costos'][i] + 1, i,
str(margen) + '%', fontsize=12, color='white', backgroundcolor='purple')
plt.axhspan(i - 0.4, i + 0.4, facecolor='purple', alpha=0.2)
plt.show()
D.Considerando a la Industria Petrolera en Asia, ¿Cuál o cuáles empresas superaron en más del 20% su margen de rentabilidad?
import pandas as pd
# Filtrar DataFrame por la industria "oil & gas operations" y el continente "Asia" sin incluir los países de Europa
df_petroleo_asia = df_2022[(df_2022['Industria'] == 'oil & gas operations') & (df_2022['Continente'].isin(['Asia'])) & (~df_2022['Continente'].isin(['Europe']))]
# Agrupar el DataFrame por Empresa y sumar los Ingresos y las Ganancias por empresa
df_petroleo_asia_grouped = df_petroleo_asia.groupby('Empresa').agg({'Margen de Rentabilidad': 'sum', 'Activos': 'sum'})
petrolera_asia_a = df_petroleo_asia_grouped.sort_values(by=['Margen de Rentabilidad', 'Activos'], ascending=[False, False])
empresas_mayor_20 = petrolera_asia_a[petrolera_asia_a['Margen de Rentabilidad'] >= 0.2]
# Agregar columnas de País y Continente
empresas_mayor_20 = pd.merge(empresas_mayor_20, df_2022[['Empresa', 'Pais', 'Continente']], on='Empresa').drop_duplicates()
# Seleccionar columnas de interés
empresas_mayor_20 = empresas_mayor_20[['Empresa', 'Pais', 'Continente', 'Activos', 'Margen de Rentabilidad']]
empresas_mayor_20
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Pais | Continente | Activos | Margen de Rentabilidad | |
---|---|---|---|---|---|
0 | gazprom | Russia | Asia | 360474.0 | 0.216852 |
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import seaborn as sns
# Filtrar DataFrame por la industria "oil & gas operations" y el continente "Asia" sin incluir los países de Europa
df_petroleo_asia = df_2022[(df_2022['Industria'] == 'oil & gas operations') & (df_2022['Continente'].isin(['Asia'])) & (~df_2022['Continente'].isin(['Europe']))]
# Agrupar el DataFrame por Empresa y sumar los Ingresos y las Ganancias por empresa
df_petroleo_asia_grouped = df_petroleo_asia.groupby('Empresa').agg({'Margen de Rentabilidad': 'sum', 'Activos': 'sum'})
petrolera_asia_a = df_petroleo_asia_grouped.sort_values(by=['Margen de Rentabilidad', 'Activos'], ascending=[False, False])
# Filtrar empresas con margen de rentabilidad mayor al 20%
empresas_mayor_20 = petrolera_asia_a[petrolera_asia_a['Margen de Rentabilidad'] > 0.2]
# Filtrar empresas con margen de rentabilidad menor o igual al 20%
empresas_no_mayor_20 = petrolera_asia_a[petrolera_asia_a['Margen de Rentabilidad'] <= 0.2]
# Agregar columna de País utilizando la función merge y la columna 'Codigo_Pais'
empresas_mayor_20 = pd.merge(empresas_mayor_20, df_2022[['Empresa', 'Pais']], on='Empresa').drop_duplicates()
empresas_no_mayor_20 = pd.merge(empresas_no_mayor_20, df_2022[['Empresa', 'Pais']], on='Empresa').drop_duplicates()
# Seleccionar columnas de interés
empresas_mayor_20 = empresas_mayor_20[['Empresa', 'Activos', 'Margen de Rentabilidad', 'Pais']]
empresas_no_mayor_20 = empresas_no_mayor_20[['Empresa', 'Activos', 'Margen de Rentabilidad', 'Pais']]
# Crear el gráfico personalizado
plt.figure(figsize=(15, 8))
sns.set_style('darkgrid')
# Crear scatterplot con empresas con margen de rentabilidad en el eje x y activos en el eje y
sns.scatterplot(data=empresas_mayor_20, x='Margen de Rentabilidad', y='Activos', hue='Empresa', alpha=0.7, palette='bright', marker='^', s=200)
sns.scatterplot(data=empresas_no_mayor_20, x='Margen de Rentabilidad', y='Activos', hue='Empresa', alpha=0.7, palette='bright', marker='o', s=200)
# Convertir margen de rentabilidad a porcentaje
plt.gca().xaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=0))
# Establecer título, subtítulo, nombres de los ejes y leyenda
plt.title('Empresas petroleras en Asia con margen de rentabilidad superior al 20%')
plt.suptitle('Relación entre margen de rentabilidad, empresa y activos', fontsize=14, y=0.95)
plt.xlabel('Margen de rentabilidad')
plt.ylabel('Activos (en millones)')
# Crear nueva lista de etiquetas para la leyenda
etiquetas_mayor_20 = [f"{row['Empresa']} ({row['Pais']})" for _, row in empresas_mayor_20.iterrows()]
etiquetas_no_mayor_20 = [f"{row['Empresa']} ({row['Pais']})" for _, row in empresas_no_mayor_20.iterrows()]
# Combinar lista de etiquetas para la leyenda
etiquetas = etiquetas_mayor_20 + etiquetas_no_mayor_20
# Establecer leyenda con las nuevas etiquetas
plt.legend(title='Empresa (País)', fontsize=10, labels=etiquetas, markerscale=0, scatterpoints=1)
# Establecer tamaño de fuente para los ejes
plt.xticks(fontsize=10, rotation=0)
plt.yticks(fontsize=10)
# Cambiar unidades de los activos a millones y mostrar dos decimales
ax = plt.gca()
ax.set_xticklabels([f"{int(x*100)}%" for x in ax.get_xticks()])
ax.set_yticklabels([f"{round(x/1e6, 1)}M" for x in ax.get_yticks()])
# Agregar el nombre de cada empresa y su país en su respectiva posición para empresas_mayor_20
for _, row in empresas_mayor_20.iterrows():
plt.annotate(f"{row['Empresa']} ({row['Pais']})", xy=(row['Margen de Rentabilidad'], row['Activos']), size=9, ha='center', va='center')
# Agregar el nombre de cada empresa y su país en su respectiva posición para empresas_no_mayor_20
for _, row in empresas_no_mayor_20.iterrows():
plt.annotate(f"{row['Empresa']} ({row['Pais']})", xy=(row['Margen de Rentabilidad'], row['Activos']), size=9, ha='center', va='center')
# Mostrar gráfico
plt.show()
<ipython-input-45-af2ebefaadef>:62: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_xticklabels([f"{int(x*100)}%" for x in ax.get_xticks()])
<ipython-input-45-af2ebefaadef>:63: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_yticklabels([f"{round(x/1e6, 1)}M" for x in ax.get_yticks()])
E.¿Cuáles fueron las empresas norteamericanas con el mayor porcentaje de rentabilidad por industria?
import pandas as pd
# Seleccionar las empresas norteamericanas
df_norteamerica = df_2022[df_2022['Continente'] == 'North America']
# Obtener el porcentaje de rentabilidad por industria
porcentaje_rentabilidad = df_norteamerica.groupby('Industria')['Margen de Rentabilidad'].mean()
# Obtener las empresas con mayor porcentaje de rentabilidad por industria
empresas_max_rentabilidad = df_norteamerica.groupby('Industria')[['Empresa', 'Margen de Rentabilidad']].apply(lambda x: x[x['Margen de Rentabilidad'] == x['Margen de Rentabilidad'].max()])
# Eliminar el nivel 1 del índice jerárquico
empresas_max_rentabilidad = empresas_max_rentabilidad.droplevel(1)
# Combinar DataFrames para agregar la columna Industria
empresas_max_rentabilidad = pd.merge(empresas_max_rentabilidad, df_norteamerica[['Empresa', 'Industria','Ganancias','Ingresos']], on='Empresa', how='left')
# Ordenar las empresas de forma ascendente
empresas_max_rentabilidad = empresas_max_rentabilidad.sort_values(by='Margen de Rentabilidad', ascending=False)
# Seleccionar las columnas que se desean mostrar
empresas_max_rentabilidad = empresas_max_rentabilidad.loc[:, ['Industria', 'Empresa','Ganancias','Ingresos', 'Margen de Rentabilidad']]
# Mostrar el DataFrame sin la columna level_1
print(empresas_max_rentabilidad.to_string(index=False))
Industria Empresa Ganancias Ingresos Margen de Rentabilidad
it software & services microsoft 71185.0 184903.0 0.384986
diversified financials jpmorgan chase 42115.0 124542.0 0.338159
banking bank of america 30995.0 96826.0 0.320110
food, drink & tobacco philip morris international 8997.0 31507.0 0.285556
semiconductors qualcomm 9986.0 36036.0 0.277112
drugs & biotechnology pfizer 21979.0 81491.0 0.269711
technology hardware & equipment apple 100555.0 378697.0 0.265529
business services & supplies fannie mae 22176.0 100328.0 0.221035
conglomerates danaher 6456.0 30283.0 0.213189
materials nucor 7954.5 39960.0 0.199062
health care equipment & services thermo fisher scientific 7725.0 39211.0 0.197011
aerospace & defense northrop grumman 7005.0 35667.0 0.196400
consumer durables procter & gamble 14596.0 79618.0 0.183325
insurance american international group 9388.0 52057.0 0.180341
oil & gas operations conocophillips 8079.0 46056.0 0.175417
media netflix 5007.0 30402.0 0.164693
telecommunication services verizon communications 21520.0 134346.0 0.160183
hotels, restaurants & leisure starbucks 4393.1 30358.0 0.144710
capital goods caterpillar 6489.0 50984.0 0.127275
chemicals dow 6854.0 58350.0 0.117464
retailing lowe's 8410.0 96249.0 0.087378
transportation fedex 5126.0 91548.0 0.055992
food markets metro 677.9 14612.0 0.046393
utilities exelon 1706.0 39268.0 0.043445
trading companies arrow electronics 1108.2 34477.0 0.032143
# import pandas as pd
# # Filtrar por la empresa ExxonMobil y sumar sus ganancias
# ganancias_exxonmobil = df_2022[df_2022['Empresa'] == 'microsoft']['Margen de Rentabilidad'].mean()
# ganancias_exxonmobil
# Crear el gráfico de puntos con Seaborn
sns.set(rc={"figure.figsize":(15, 8)})
sns.set_palette("Paired")
fig, ax = plt.subplots(2, figsize=(15, 10), gridspec_kw={'height_ratios': [8, 2]})
sns.stripplot(x='Margen de Rentabilidad', y='Industria', data=empresas_max_rentabilidad, size=12, jitter=True, hue='Industria', palette='Set2', ax=ax[0])
# Agregar grid para guía de x y y
ax[0].grid(True)
# Configurar el título, el subtítulo, los nombres de los ejes
ax[0].set_title('Empresas con Mayor Margen de Rentabilidad por Industria en Norteamérica', fontsize=24, y=1.05)
ax[0].set_xlabel('MR = Ganancias / Ingresos', fontsize=18)
ax[0].set_ylabel('Industria', fontsize=18)
# Eliminar la leyenda que se superpone al gráfico
ax[0].get_legend().remove()
# Crear una leyenda separada para el gráfico
legend = ax[1].legend(*ax[0].get_legend_handles_labels(), loc='center', ncol=5, fontsize=14)
ax[1].axis('off')
# Mostrar el gráfico
plt.show()
F. Excluyendo a la industria Bancaria, ¿Cuáles fueron las empresas europeas con mayores pérdidas registradas por industria a nivel global?
# Filtrar por ['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', Continente]
df_filt = df_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Continente']]
# Filtrar por ['Continente'] == 'Europe' y ['Industria'] != 'banking'
df_eur_sin_bancos = df_filt[(df_filt['Continente'] == 'Europe') & (df_filt['Industria'] != 'banking')]
# Agrupar por industria y empresa, y calcular las pérdidas
df_eur_perdidas = df_eur_sin_bancos.groupby(['Industria', 'Empresa'], as_index=False).agg({'Ingresos': 'sum', 'Activos': 'sum', 'Ganancias': 'sum'})
df_eur_perdidas['Costos'] = df_eur_perdidas['Activos'] - df_eur_perdidas['Ganancias']
df_eur_perdidas['Perdidas'] = df_eur_perdidas['Costos'] - df_eur_perdidas['Ingresos']
# Encontrar la empresa con la mayor pérdida por industria
df_max_perdida = df_eur_perdidas[df_eur_perdidas['Perdidas'] < 0].groupby('Industria', as_index=False).apply(lambda x: x.loc[x['Perdidas'].idxmax()])
# Cambiar el nombre de las columnas 'Costos' y 'Perdidas'
df_max_perdida = df_max_perdida.rename(columns={'Costos': 'Costos = Activos - Ganancias', 'Perdidas': 'Perdidas = Costos - Ingresos'})
# Mostrar el DataFrame con la empresa con la mayor pérdida por industria
df_max_perdida = df_max_perdida[['Industria', 'Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Costos = Activos - Ganancias', 'Perdidas = Costos - Ingresos']]
df_max_perdida = df_max_perdida.sort_values('Perdidas = Costos - Ingresos', ascending=True)
df_max_perdida
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Industria | Empresa | Ingresos | Activos | Ganancias | Costos = Activos - Ganancias | Perdidas = Costos - Ingresos | |
---|---|---|---|---|---|---|---|
1 | food markets | tesco | 84168.0 | 66217.0 | 2063.6 | 64153.4 | -20014.6 |
2 | it software & services | accenture | 56695.0 | 44318.0 | 6391.6 | 37926.4 | -18768.6 |
0 | chemicals | lyondellbasell industries | 46153.0 | 36742.0 | 5603.0 | 31139.0 | -15014.0 |
4 | retailing | inditex | 32572.0 | 32447.0 | 3811.2 | 28635.8 | -3936.2 |
3 | materials | arcelormittal | 76654.0 | 90512.0 | 14985.4 | 75526.6 | -1127.4 |
import seaborn as sns
import matplotlib.pyplot as plt
# Filtrar por ['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', Continente]
df_filt = df_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Continente']]
# Filtrar por ['Continente'] == 'Europe' y ['Industria'] != 'banking'
df_eur_sin_bancos = df_filt[(df_filt['Continente'] == 'Europe') & (df_filt['Industria'] != 'banking')]
# Agrupar por industria y empresa, y calcular las pérdidas
df_eur_perdidas = df_eur_sin_bancos.groupby(['Industria', 'Empresa'], as_index=False).agg({'Ingresos': 'sum', 'Activos': 'sum', 'Ganancias': 'sum'})
df_eur_perdidas['Costos'] = df_eur_perdidas['Activos'] - df_eur_perdidas['Ganancias']
df_eur_perdidas['Perdidas'] = df_eur_perdidas['Costos'] - df_eur_perdidas['Ingresos']
# Encontrar la empresa con la mayor pérdida por industria
df_max_perdida = df_eur_perdidas[df_eur_perdidas['Perdidas'] < 0].groupby('Industria', as_index=False).apply(lambda x: x.loc[x['Perdidas'].idxmax()])
# Cambiar el nombre de las columnas 'Costos' y 'Perdidas'
df_max_perdida = df_max_perdida.rename(columns={'Costos': 'Costos = Activos - Ganancias', 'Perdidas': 'Perdidas = Costos - Ingresos'})
# Mostrar el DataFrame con la empresa con la mayor pérdida por industria
df_max_perdida = df_max_perdida[['Industria', 'Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Costos = Activos - Ganancias', 'Perdidas = Costos - Ingresos']]
df_max_perdida = df_max_perdida.sort_values('Perdidas = Costos - Ingresos', ascending=True)
# Crear el gráfico de barras horizontales apiladas con Seaborn
sns.set(rc={"figure.figsize":(15, 8)})
sns.set_palette("husl")
fig, ax = plt.subplots()
sns.barplot(x='Perdidas = Costos - Ingresos', y='Industria', hue='Empresa', data=df_max_perdida, dodge=False, orient='h')
# Configurar el título, el subtítulo, los nombres de los ejes, la leyenda y el tamaño de fuente
ax.set_title('Empresas con Mayores Pérdidas por Industria en Europa (sin bancos)', fontsize=24, y=1.05)
ax.set_xlabel('Perdidas = Costos - Ingresos', fontsize=18)
ax.set_ylabel('Industria', fontsize=18)
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# Mostrar el gráfico
plt.show()
G. ¿Cuál fue la distribución de Ingresos y Activos con respecto a las ganancias de los bancos cuyos activos no superan los 30000 millones de dólares?
# Filtrar solo las columnas necesarias
df_bancos_activos = df_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Filtrar solo la industria Banking
df_bancos_activos = df_bancos_activos[df_bancos_activos['Industria'] == 'banking']
# Agrupar por empresa e industria y sumar los 'Ingresos', 'Activos', 'Ganancias'
#df_bancos_activos = df_bancos_activos.groupby(['Empresa', 'Industria'])[['Ingresos', 'Activos', 'Ganancias']].sum().reset_index()
# Agrupar por empresa y calcular el promedio de los 'Margen de Rentabilidad' y 'Rentabilidad de los Activos (ROA)'
df_bancos_activos = df_bancos_activos.groupby('Empresa').agg({
'Ingresos': 'sum',
'Activos': 'sum',
'Ganancias': 'sum',
'Margen de Rentabilidad': 'mean',
'Rentabilidad de los Activos (ROA)': 'mean'
}).reset_index()
# Filtrar por empresas cuyos activos no superan los 30000 millones de dólares
df_bancos_activos = df_bancos_activos[df_bancos_activos['Activos'] <= 30000]
# Ordenar el DataFrame por margen de rentabilidad y rentabilidad de los activos (ROA)
df_bancos_activos = df_bancos_activos.sort_values(by=['Rentabilidad de los Activos (ROA)','Margen de Rentabilidad'], ascending=[False, False])
# Seleccionar las columnas de interés
df_bancos_activos = df_bancos_activos[['Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Mostrar el DataFrame resultante
df_bancos_activos
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Ingresos | Activos | Ganancias | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) |
---|
import seaborn as sns
import matplotlib.pyplot as plt
# Filtrar solo las columnas necesarias
df_bancos_activos = df_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Filtrar solo la industria Banking
df_bancos_activos = df_bancos_activos[df_bancos_activos['Industria'] == 'banking']
# Agrupar por empresa y calcular el promedio de los 'Margen de Rentabilidad' y 'Rentabilidad de los Activos (ROA)'
df_bancos_activos = df_bancos_activos.groupby('Empresa').agg({
'Ingresos': 'sum',
'Activos': 'sum',
'Ganancias': 'sum',
'Margen de Rentabilidad': 'mean',
'Rentabilidad de los Activos (ROA)': 'mean'
}).reset_index()
# Ordenar el DataFrame por margen de rentabilidad y rentabilidad de los activos (ROA)
df_bancos_activos = df_bancos_activos.sort_values(by=['Rentabilidad de los Activos (ROA)','Margen de Rentabilidad'], ascending=[False, False])
# Seleccionar las columnas de interés
df_bancos_activos = df_bancos_activos[['Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Convertir los activos a millones de dólares
df_bancos_activos['Activos (Millones de dólares)'] = df_bancos_activos['Activos'] / 1000
# Convertir el margen de rentabilidad a porcentaje
df_bancos_activos['Margen de Rentabilidad %'] = df_bancos_activos['Margen de Rentabilidad'] * 100
# Crear un heatmap utilizando Seaborn
plt.figure(figsize=(15, 8))
ax = sns.heatmap(data=df_bancos_activos.pivot(index='Empresa', columns='Rentabilidad de los Activos (ROA)', values='Activos (Millones de dólares)'), cmap='coolwarm', annot=df_bancos_activos.pivot(index='Empresa', columns='Rentabilidad de los Activos (ROA)', values='Margen de Rentabilidad').applymap(lambda x: '{:.1f}%'.format(x*100)), fmt='', annot_kws={'fontsize': 10})
# Establecer los títulos y nombres de los ejes
plt.title('Relación entre margen de rentabilidad, rentabilidad de los activos y activos (Millones de dólares) para empresas de la industria bancaria')
plt.xlabel('Rentabilidad de los Activos (ROA) (%)')
plt.ylabel('Empresa')
# Modificar los ticks de los ejes para que muestren los valores en porcentaje y millones de dólares
xticklabels = ax.get_xticklabels()
new_xticklabels = ['{:.1f}%'.format(float(label.get_text())*100) for label in xticklabels]
ax.set_xticklabels(new_xticklabels, fontsize=10)
# Mostrar el gráfico
plt.show()
H. Considerando el histórico de valores de las acciones en el año 2022 de las 5 empresas de tu elección (Paso 2), Indica ¿Cuál fue la mejor semana para comprar y cuál para vender respectivamente? (Se compra cuando el precio es bajo, y se vende cuando el precio es alto)
import pandas as pd
AAPL = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/AAPL.csv')
GOOG = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/GOOG.csv')
MSFT = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/MSFT.csv')
TSLA = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/TSLA.csv')
AMZN = pd.read_csv('/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_2/EmpresasValores/AMZN.csv')
AAPL.dtypes
v float64
vw float64
o float64
c float64
h float64
l float64
t int64
n int64
dtype: object
AAPL['date'] = pd.to_datetime(AAPL['t'], unit='ms')
AAPL.set_index('date', inplace=True)
GOOG['date'] = pd.to_datetime(GOOG['t'], unit='ms')
GOOG.set_index('date', inplace=True)
MSFT['date'] = pd.to_datetime(MSFT['t'], unit='ms')
MSFT.set_index('date', inplace=True)
TSLA['date'] = pd.to_datetime(TSLA['t'], unit='ms')
TSLA.set_index('date', inplace=True)
AMZN['date'] = pd.to_datetime(AMZN['t'], unit='ms')
AMZN.set_index('date', inplace=True)
AAPL_weekly = AAPL.resample('W')['c'].mean()
GOOG_weekly = GOOG.resample('W')['c'].mean()
MSFT_weekly = MSFT.resample('W')['c'].mean()
TSLA_weekly = TSLA.resample('W')['c'].mean()
AMZN_weekly = AMZN.resample('W')['c'].mean()
AAPL_mejor_semana_compra = AAPL_weekly.idxmin().strftime('%Y-%m-%d')
AAPL_mejor_semana_venta = AAPL_weekly.idxmax().strftime('%Y-%m-%d')
GOOG_mejor_semana_compra = GOOG_weekly.idxmin().strftime('%Y-%m-%d')
GOOG_mejor_semana_venta = GOOG_weekly.idxmax().strftime('%Y-%m-%d')
MSFT_mejor_semana_compra = MSFT_weekly.idxmin().strftime('%Y-%m-%d')
MSFT_mejor_semana_venta = MSFT_weekly.idxmax().strftime('%Y-%m-%d')
TSLA_mejor_semana_compra = TSLA_weekly.idxmin().strftime('%Y-%m-%d')
TSLA_mejor_semana_venta = TSLA_weekly.idxmax().strftime('%Y-%m-%d')
AMZN_mejor_semana_compra = AMZN_weekly.idxmin().strftime('%Y-%m-%d')
AMZN_mejor_semana_venta = AMZN_weekly.idxmax().strftime('%Y-%m-%d')
print('La mejor semana para comprar acciones de Apple en el año 2022 es: ', AAPL_mejor_semana_compra)
print('La mejor semana para vender acciones de Apple en el año 2022 es: ', AAPL_mejor_semana_venta)
print('')
print('La mejor semana para comprar acciones de Google en el año 2022 es: ', GOOG_mejor_semana_compra)
print('La mejor semana para vender acciones de Google en el año 2022 es: ', GOOG_mejor_semana_venta)
print('')
print('La mejor semana para comprar acciones de Microsoft en el año 2022 es: ', MSFT_mejor_semana_compra)
print('La mejor semana para vender acciones de Microsoft en el año 2022 es: ', MSFT_mejor_semana_venta)
print('')
print('La mejor semana para comprar acciones de Tesla en el año 2022 es: ', TSLA_mejor_semana_compra)
print('La mejor semana para vender acciones de Tesla en el año 2022 es: ', TSLA_mejor_semana_venta)
print('')
print('La mejor semana para comprar acciones de Amazon en el año 2022 es: ', AMZN_mejor_semana_compra)
print('La mejor semana para vender acciones de Amazon en el año 2022 es: ', AMZN_mejor_semana_venta)
La mejor semana para comprar acciones de Apple en el año 2022 es: 2023-01-01
La mejor semana para vender acciones de Apple en el año 2022 es: 2022-04-03
La mejor semana para comprar acciones de Google en el año 2022 es: 2023-01-01
La mejor semana para vender acciones de Google en el año 2022 es: 2022-04-03
La mejor semana para comprar acciones de Microsoft en el año 2022 es: 2022-11-06
La mejor semana para vender acciones de Microsoft en el año 2022 es: 2022-01-09
La mejor semana para comprar acciones de Tesla en el año 2022 es: 2023-01-01
La mejor semana para vender acciones de Tesla en el año 2022 es: 2022-01-09
La mejor semana para comprar acciones de Amazon en el año 2022 es: 2023-01-01
La mejor semana para vender acciones de Amazon en el año 2022 es: 2022-04-03
import matplotlib.pyplot as plt
import seaborn as sns
# Obtener las fechas de la mejor semana de compra y venta para cada acción
AAPL_mejor_semana_compra = AAPL_weekly.idxmin()
AAPL_mejor_semana_venta = AAPL_weekly.idxmax()
GOOG_mejor_semana_compra = GOOG_weekly.idxmin()
GOOG_mejor_semana_venta = GOOG_weekly.idxmax()
MSFT_mejor_semana_compra = MSFT_weekly.idxmin()
MSFT_mejor_semana_venta = MSFT_weekly.idxmax()
TSLA_mejor_semana_compra = TSLA_weekly.idxmin()
TSLA_mejor_semana_venta = TSLA_weekly.idxmax()
AMZN_mejor_semana_compra = AMZN_weekly.idxmin()
AMZN_mejor_semana_venta = AMZN_weekly.idxmax()
# Crear una figura y un eje con un subplot
fig, ax = plt.subplots(figsize=(18, 10))
# Graficar la serie de tiempo de precios de cierre semanales para cada acción
ax.plot(AAPL_weekly.index, AAPL_weekly, label='AAPL')
ax.plot(GOOG_weekly.index, GOOG_weekly, label='GOOG')
ax.plot(MSFT_weekly.index, MSFT_weekly, label='MSFT')
ax.plot(TSLA_weekly.index, TSLA_weekly, label='TSLA')
ax.plot(AMZN_weekly.index, AMZN_weekly, label='AMZN')
# Graficar los triángulos de compra y de venta para cada acción
ax.scatter(AAPL_mejor_semana_compra, AAPL_weekly.loc[AAPL_mejor_semana_compra], marker='^', color='green', s=150, label='Semana de compra')
ax.scatter(AAPL_mejor_semana_venta, AAPL_weekly.loc[AAPL_mejor_semana_venta], marker='^', color='red', s=150, label='Semana de venta')
ax.scatter(GOOG_mejor_semana_compra, GOOG_weekly.loc[GOOG_mejor_semana_compra], marker='^', color='green', s=150)
ax.scatter(GOOG_mejor_semana_venta, GOOG_weekly.loc[GOOG_mejor_semana_venta], marker='^', color='red', s=150)
ax.scatter(MSFT_mejor_semana_compra, MSFT_weekly.loc[MSFT_mejor_semana_compra], marker='^', color='green', s=150)
ax.scatter(MSFT_mejor_semana_venta, MSFT_weekly.loc[MSFT_mejor_semana_venta], marker='^', color='red', s=150)
ax.scatter(TSLA_mejor_semana_compra, TSLA_weekly.loc[TSLA_mejor_semana_compra], marker='^', color='green', s=150)
ax.scatter(TSLA_mejor_semana_venta, TSLA_weekly.loc[TSLA_mejor_semana_venta], marker='^', color='red', s=150)
ax.scatter(AMZN_mejor_semana_compra, AMZN_weekly.loc[AMZN_mejor_semana_compra], marker='^', color='green', s=150)
ax.scatter(AMZN_mejor_semana_venta, AMZN_weekly.loc[AMZN_mejor_semana_venta], marker='^', color='red', s=150)
# Configurar el eje Y para no mostrar los valores
ax.set_yticks([])
# Agregar títulos y etiquetas al subplot
ax.set_title('Mejor semana para comprar y vender acciones (2022) AAPL, GOOG, MSFT, TSLA y AMZN')
#ax.set_ylabel('Precio de cierre semanal')
ax.set_xlabel('Fecha')
ax.legend()
# Mostrar el gráfico
plt.show()
Cuestionario B
Con los resultados de tus consultas a los datos, llegó la hora de poner en práctica tus conocimientos en Matplotlib: Visualization with Python y seaborn: statistical data visualization
Debes generar una gráfica para cada pregunta formulada, utilizando todo el potencial que estas herramientas de visualización ofrecen. Establece un tamaño de lienzo de 15 x 8, un título, un subtítulo, los nombres a los ejes, leyenda, tamaño de fuente, una paleta de colores que facilite la visualización y que sea de tu gusto.
Dentro de los gráficos que vas a realizar, tendrás histogramas, gráficos de barras, gráficos de pizza, gráficos de dispersión, gráficos de línea, entre otros.
La idea es que explores y experimentes con todos los recursos que te brindan Matplotlib y Seaborn.
Las siguientes preguntas se refieren al ranking Forbes 2000 considerando el periodo 2015 - 2022:
A. ¿Cuál es el Top 10 de países con *más empresas en Forbes para el periodo indicado?
import pandas as pd
df_2015_2022 = df_concat
df_2015_2022
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
rank_nr | Empresa | Industria | Pais | Ingresos | Ganancias | Activos | Valor de Mercado | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | Año | Codigo | Continente | Empleados | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
9 | 13 | royal dutch shell | oil & gas operations | Netherlands | 420371.0 | 14884.1 | 353116.0 | 195380.0 | 0.035407 | 0.042151 | 2015 | NLD | Europe | 94000 |
10 | 15 | hsbc holdings | banking | United Kingdom | 81086.0 | 13536.7 | 2634139.0 | 167746.0 | 0.166943 | 0.005139 | 2015 | GBR | Europe | 264767 |
14 | 21 | allianz | insurance | Germany | 128401.0 | 8250.5 | 978980.0 | 82007.0 | 0.064256 | 0.008428 | 2015 | DEU | Europe | 147425 |
16 | 26 | daimler | consumer durables | Germany | 172268.0 | 9234.7 | 229468.0 | 103272.0 | 0.053607 | 0.040244 | 2015 | DEU | Europe | 279972 |
20 | 31 | banco santander | banking | Spain | 56361.0 | 7714.6 | 1532282.0 | 109351.0 | 0.136878 | 0.005035 | 2015 | ESP | Europe | 185405 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2307 | 1513 | performance food group | food markets | United States | 39732.0 | 36.9 | 12220.0 | 8130.0 | 0.000929 | 0.003020 | 2022 | USA | North America | 22885 |
2308 | 1529 | us foods | food markets | United States | 29487.0 | 164.0 | 12521.0 | 8523.0 | 0.005562 | 0.013098 | 2022 | USA | North America | 28000 |
2309 | 1548 | medipal holdings | drugs & biotechnology | Japan | 29849.0 | 331.4 | 15444.0 | 3349.0 | 0.011103 | 0.021458 | 2022 | JPN | Asia | 14454 |
2310 | 1640 | world fuel services | trading companies | United States | 31300.0 | 73.6 | 5942.0 | 1715.0 | 0.002351 | 0.012386 | 2022 | USA | North America | 4414 |
2311 | 1656 | rajesh exports | consumer durables | India | 30005.0 | 157.3 | 2696.0 | 2496.0 | 0.005242 | 0.058346 | 2022 | IND | Asia | 181 |
2284 rows × 14 columns
import pandas as pd
# Obtener el Top 10 de países con más empresas
top_10_paises_b = pd.DataFrame(df_2015_2022['Pais'].value_counts().head(10)).reset_index()
# Renombrar las columnas
top_10_paises_b= top_10_paises_b.rename(columns={'index': 'Pais', 'Pais': '#de Empresas'})
top_10_paises_b
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pais | #de Empresas | |
---|---|---|
0 | United States | 773 |
1 | Japan | 297 |
2 | China | 185 |
3 | France | 136 |
4 | United Kingdom | 133 |
5 | Germany | 116 |
6 | South Korea | 102 |
7 | Canada | 72 |
8 | India | 56 |
9 | Switzerland | 51 |
import seaborn as sns
import matplotlib.pyplot as plt
# Definir el tamaño del gráfico
plt.figure(figsize=(15, 8))
# Crear el gráfico de barras
sns.barplot(data=top_10_paises_b, y='Pais', x='#de Empresas', palette='rocket', label='Empresas por país')
# Agregar título y subtítulo
plt.title('Top 10 países con más empresas', fontsize=20)
plt.suptitle('Datos de 2015 a 2022', fontsize=16)
# Agregar etiquetas a los ejes
plt.xlabel('Número de empresas', fontsize=14)
plt.ylabel('País', fontsize=14)
# Ajustar el tamaño de la fuente de la leyenda
plt.legend(fontsize=12)
# Mostrar el gráfico
plt.show()
B. ¿Cuál es el Top 5 de países con más empresas en el área de tecnología y de telecomunicaciones?
# Seleccionar las empresas del área de tecnología y de telecomunicaciones
tecnologia_telecomunicaciones = df_2015_2022[df_2015_2022['Industria'].str.contains('technology hardware & equipment|telecommunication services')]
# Obtener el Top 4 de países con más empresas en el área de tecnología y de telecomunicaciones
top_5_paises_tec_telecom = pd.DataFrame(tecnologia_telecomunicaciones['Pais'].value_counts().head(5))
# Renombrar las columnas
top_5_paises_tec_telecom = top_5_paises_tec_telecom.rename(columns={'Pais': '+ Empresas'})
# Cambiar el nombre del índice
top_5_paises_tec_telecom.index.name = 'Pais'
top_5_paises_tec_telecom
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
+ Empresas | |
---|---|
Pais | |
United States | 48 |
Taiwan | 25 |
Japan | 20 |
France | 9 |
Germany | 8 |
import seaborn as sns
import matplotlib.pyplot as plt
# Definir el tamaño del gráfico
plt.figure(figsize=(15, 8))
# Crear el gráfico de dispersión
sns.scatterplot(data=top_5_paises_tec_telecom.reset_index(), x='Pais', y='+ Empresas', s=200, color='red', label='Empresas por país')
# Agregar título y subtítulo
plt.title('Top 5 países con más empresas en tecnología y telecomunicaciones', fontsize=20)
plt.suptitle('Datos de 2015 a 2022', fontsize=16)
# Agregar etiquetas a los ejes
plt.xlabel('País', fontsize=14)
plt.ylabel('Número de empresas', fontsize=14)
# Ajustar el tamaño de la fuente de la leyenda
plt.legend(fontsize=12)
# Mostrar el gráfico
plt.show()
C. ¿Cuál fue el margen de pérdida de las 10 empresas que presentaron mayores perjuicios considerando el total de pérdidas registradas en la Industria de los Hoteles, Restaurantes y entretenimiento?
import pandas as pd
# Filtrar el DataFrame original por Empresa, Industria, Ingresos y Ganancias
hoteles_restaurantes_entretenimiento = df_2015_2022[['Empresa', 'Industria', 'Ingresos', 'Ganancias','Activos']]
# Filtrar el DataFrame por Industria = hotels, restaurants & leisure
df_hotels_b = hoteles_restaurantes_entretenimiento[hoteles_restaurantes_entretenimiento['Industria'] == 'hotels, restaurants & leisure']
# Agrupar el DataFrame por Empresa y sumar los Ingresos y las Ganancias por empresa
df_hotels_grouped_b = df_hotels_b.groupby('Empresa').agg({'Ingresos': 'sum', 'Ganancias': 'sum', 'Activos': 'sum'})
# Agrupar por industria y empresa, y calcular las pérdidas
df_hotels_grouped_b['Costos'] = df_hotels_grouped_b['Activos'] - df_hotels_grouped_b['Ganancias']
df_hotels_grouped_b['Perdida = Costos - Ingresos'] = df_hotels_grouped_b['Costos'] - df_hotels_grouped_b['Ingresos']
# Calcular el margen de pérdida por empresa y ordenar de mayor a menor
df_hotels_grouped_b['Margen de Perdida = Costos / Ingresos'] = ((df_hotels_grouped_b['Costos']) / df_hotels_grouped_b['Ingresos']) * 100
df_hotels_grouped_b['Margen de Perdida = Costos / Ingresos'] = df_hotels_grouped_b['Margen de Perdida = Costos / Ingresos'].round(1)
df_mayores_perdidas = df_hotels_grouped_b.sort_values(by=['Perdida = Costos - Ingresos', 'Margen de Perdida = Costos / Ingresos'], ascending=[True, False])
# Filtrar el DataFrame por pérdidas negativas y mostrar solo las 10 primeras empresas
df_mayores_perdidas_negativas = df_mayores_perdidas.loc[df_mayores_perdidas['Perdida = Costos - Ingresos'] < 0].head(10)
# Mostrar el DataFrame con Empresa, Ingresos, Ganancias, Costos, Perdida y Margen de Pérdida
df_mayores_perdidas_negativas = df_mayores_perdidas_negativas[['Ingresos', 'Ganancias', 'Activos', 'Costos', 'Perdida = Costos - Ingresos', 'Margen de Perdida = Costos / Ingresos']]
df_mayores_perdidas_negativas
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Ingresos | Ganancias | Activos | Costos | Perdida = Costos - Ingresos | Margen de Perdida = Costos / Ingresos | |
---|---|---|---|---|---|---|
Empresa | ||||||
compass group | 201028.0 | 8793.1 | 108931.0 | 100137.9 | -100890.1 | 49.8 |
starbucks | 57014.0 | 7782.9 | 56313.0 | 48530.1 | -8483.9 | 85.1 |
# Crear el gráfico de barras verticales
plt.figure(figsize=(8, 10))
sns.set_style('whitegrid')
sns.barplot(x='Empresa', y='Ingresos', data=df_mayores_perdidas_negativas.reset_index(), color='gold', label='Ingresos')
sns.barplot(x='Empresa', y='Costos', data=df_mayores_perdidas_negativas.reset_index(), color='coral', label='Costos')
sns.barplot(x='Empresa', y='Perdida = Costos - Ingresos', data=df_mayores_perdidas_negativas.reset_index(), color='brown', label='Pérdidas')
sns.barplot(x='Empresa', y='Ganancias', data=df_mayores_perdidas_negativas.reset_index(), color='limegreen', label='Ganancias')
sns.barplot(x='Empresa', y='Margen de Perdida = Costos / Ingresos', data=df_mayores_perdidas_negativas.reset_index(), color='indigo', label='Margen de Pérdida')
plt.xticks(rotation=90)
plt.title('Top 10 empresas con mayores pérdidas en la industria de hoteles, restaurantes y entretenimiento')
plt.xlabel('Empresa')
plt.ylabel('Monto')
# Agregar valores de margen de pérdida encima de cada barra
for i in range(len(df_mayores_perdidas_negativas)):
margen = df_mayores_perdidas_negativas['Margen de Perdida = Costos / Ingresos'][i]
plt.text(i, df_mayores_perdidas_negativas['Ganancias'][i] + 1,
str(margen) + '%', fontsize=12, color='white', backgroundcolor='indigo')
plt.axvspan(i - 0.4, i + 0.4, facecolor='indigo', alpha=0.2)
# Mover leyenda a la parte superior derecha del gráfico
plt.legend(loc='upper right', fontsize=12)
plt.show()
D. Considerando a la Industria Petrolera en las Américas, ¿Cuál o cuáles empresas superaron en más del 20% la rentabilidad de sus activos?
import pandas as pd
petrolera_americas = df_2015_2022[(df_2015_2022['Industria'] == 'oil & gas operations') & (df_2015_2022['Continente'].isin(['North America', 'South America']))].copy()
# Agrupar el DataFrame por Empresa y sumar los Ingresos y las Ganancias por empresa
petrolera_americas_por_empresa = petrolera_americas.groupby('Empresa').agg({'Margen de Rentabilidad': 'sum', 'Activos': 'sum'})
petrolera_americas_b = petrolera_americas_por_empresa.sort_values(by=['Margen de Rentabilidad', 'Activos'], ascending=[False, False])
empresas_superiores_20 = petrolera_americas_b[petrolera_americas_b['Margen de Rentabilidad'] >= 0.2]
# Agregar columnas de País y Continente
empresas_superiores_20 = pd.merge(empresas_superiores_20, df_2015_2022[['Empresa', 'Pais', 'Continente']], on='Empresa').drop_duplicates()
# Seleccionar columnas de interés
empresas_superiores_20 = empresas_superiores_20[['Empresa', 'Pais', 'Continente', 'Activos', 'Margen de Rentabilidad']]
empresas_superiores_20
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Pais | Continente | Activos | Margen de Rentabilidad | |
---|---|---|---|---|---|
0 | enbridge | Canada | North America | 824824.0 | 0.566855 |
8 | suncor energy | Canada | North America | 396246.0 | 0.383611 |
14 | chevron | United States | North America | 2019265.0 | 0.359491 |
22 | conocophillips | United States | North America | 600196.0 | 0.282121 |
29 | petrobras | Brazil | South America | 1838485.0 | 0.258494 |
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import seaborn as sns
# Crear el gráfico personalizado
plt.figure(figsize=(15, 8))
sns.set_style('darkgrid')
# Crear scatterplot con empresas con margen de rentabilidad en el eje x, activos en el eje y y margen de rentabilidad como el tamaño de los puntos
sns.scatterplot(data=empresas_superiores_20, x='Margen de Rentabilidad', y='Activos', hue='Empresa', size='Margen de Rentabilidad', sizes=(300, 3000), alpha=0.7, palette='bright')
# Convertir margen de rentabilidad a porcentaje
plt.gca().xaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, decimals=0))
# Establecer título, subtítulo, nombres de los ejes y leyenda
plt.title('Empresas petroleras en América con margen de rentabilidad superior al 20%')
plt.suptitle('Relación entre margen de rentabilidad, empresa y activos', fontsize=14, y=0.95)
plt.xlabel('Margen de rentabilidad')
plt.ylabel('Activos (en millones)')
# Crear nueva lista de etiquetas para la leyenda
etiquetas = [f"{row['Empresa']} ({row['Pais']})" for _, row in empresas_superiores_20.iterrows()]
# Establecer leyenda con las nuevas etiquetas
plt.legend(title='Empresa (País)', fontsize=10, labels=etiquetas, markerscale=0, scatterpoints=1)
# Establecer tamaño de fuente para los ejes
plt.xticks(fontsize=10, rotation=0)
plt.yticks(fontsize=10)
# Especificar ubicación de las etiquetas en los ejes
# plt.xticks(np.arange(0, 0.4, 0.05))
# plt.yticks(np.arange(0, 60000000000, 10000000000))
# Cambiar unidades de los activos a millones y mostrar dos decimales
ax = plt.gca()
ax.set_xticklabels([f"{int(x*100)}%" for x in ax.get_xticks()])
ax.set_yticklabels([f"{round(x/1e6, 1)}M" for x in ax.get_yticks()])
# Agregar el nombre de cada empresa en su respectiva burbuja
for _, row in empresas_superiores_20.iterrows():
plt.annotate(row['Empresa'], xy=(row['Margen de Rentabilidad'], row['Activos']), size=9, ha='center', va='center')
# Mostrar gráfico
plt.show()
<ipython-input-68-207e3c864575>:39: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_xticklabels([f"{int(x*100)}%" for x in ax.get_xticks()])
<ipython-input-68-207e3c864575>:40: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_yticklabels([f"{round(x/1e6, 1)}M" for x in ax.get_yticks()])
E. ¿Cuáles fueron las empresas europeas con el mayor porcentaje de rentabilidad por industria?
import pandas as pd
# Filtrar el DataFrame por continente Europe y agrupar por empresa e industria
df_europe = df_2015_2022[df_2015_2022['Continente'] == 'Europe'].groupby(['Empresa', 'Industria']).agg({'Ingresos': 'sum', 'Activos': 'sum', 'Margen de Rentabilidad': 'mean'})
# Seleccionar la empresa con mayor margen de rentabilidad para cada industria
empresas_max_rentabilidad_europe = df_europe.loc[df_europe.groupby('Industria')['Margen de Rentabilidad'].idxmax()].reset_index()
# Ordenar las empresas por margen de rentabilidad de forma descendente
empresas_max_rentabilidad_europe = empresas_max_rentabilidad_europe.sort_values('Margen de Rentabilidad', ascending=False)
# Seleccionar las columnas que se desean mostrar
empresas_max_rentabilidad_europe = empresas_max_rentabilidad_europe[['Industria', 'Empresa', 'Ingresos', 'Activos', 'Margen de Rentabilidad']]
# Mostrar el DataFrame resultante
print(empresas_max_rentabilidad_europe.to_string(index=False))
Industria Empresa Ingresos Activos Margen de Rentabilidad
food, drink & tobacco british american tobacco 127125.0 750020.0 0.645179
telecommunication services vivendi 14497.0 43395.0 0.434731
drugs & biotechnology novartis 402547.0 1060400.0 0.246620
diversified financials ing group 101445.0 4243601.0 0.201417
it software & services sap 200080.0 427006.0 0.169136
consumer durables mercedes-benz group 178935.0 295480.0 0.151970
banking hsbc holdings 528076.0 21488941.0 0.139453
utilities national grid 70112.0 249642.0 0.139393
health care equipment & services medtronic 180415.0 564004.0 0.136644
insurance chubb 208189.0 1023425.0 0.130542
materials anglo american 129800.0 236867.0 0.130277
retailing inditex 94824.0 88791.0 0.125795
chemicals bayer 152211.0 267795.0 0.122570
conglomerates abb 261715.0 343955.0 0.088264
construction holcim 29350.0 65725.0 0.084968
capital goods schneider electric 241431.0 409446.0 0.082921
aerospace & defense safran 52895.0 94487.0 0.079268
oil & gas operations shell 261761.0 404379.0 0.077419
hotels, restaurants & leisure compass group 201028.0 108931.0 0.043114
business services & supplies johnson controls international 82222.0 146756.0 0.041758
air courier deutsche post 140798.0 86602.0 0.031285
food markets royal ahold 85837.0 34358.0 0.023146
diversified metals & mining anglo american 53249.0 120571.0 0.012499
technology hardware & equipment ericsson 82230.0 101690.0 -0.000269
trading companies finatis 115225.0 117489.0 -0.011720
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
# Seleccionar las 5 empresas con mayor margen de rentabilidad
top_empresas = empresas_max_rentabilidad_europe.sort_values('Margen de Rentabilidad', ascending=False).head(5)
# Crear la gráfica
fig, ax = plt.subplots(figsize=(15, 8))
sns.scatterplot(x='Margen de Rentabilidad', y='Ingresos', hue='Margen de Rentabilidad', size='Margen de Rentabilidad', sizes=(50, 500), data=empresas_max_rentabilidad_europe, palette='viridis')
# Agregar título y subtítulo
plt.title('Relación entre Margen de Rentabilidad, Ingresos y Activos', fontsize=20)
plt.suptitle('Empresas en Europa', fontsize=16, y=0.95)
# Agregar etiquetas de los ejes
plt.xlabel('Margen de Rentabilidad (%)', fontsize=14)
plt.ylabel('Ingresos (en dolares)', fontsize=14)
# Cambiar tamaño de fuente de los ejes
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# Cambiar los ticks del eje Y a millones
formatter = mtick.StrMethodFormatter('U${x:,.0f}')
ax.yaxis.set_major_formatter(formatter)
# Agregar el nombre de la empresa y los valores en porcentaje por encima de los 5 primeros puntos
for i, row in top_empresas.iterrows():
margen_rentabilidad = f"{row['Margen de Rentabilidad']*100:.2f}%"
ingresos = f"U${row['Ingresos']/1000000:.2f}M"
plt.text(row['Margen de Rentabilidad'], row['Ingresos'] + 0.7 * (row['Margen de Rentabilidad'] / 100), f"{row['Empresa']} ({margen_rentabilidad})", fontsize=12, ha='center', va='bottom')
# Agregar leyenda de margen de rentabilidad
plt.legend(title='Margen de Rentabilidad (%)', fontsize=12, title_fontsize=14, loc='upper right')
# Agregar leyenda de activos
activos = [f"{row['Empresa']}: {row['Activos']/1000000:.2f} M" for i, row in top_empresas.iterrows()]
plt.figtext(.02, .92, 'Activos de las 5 primeras empresas: \n\n' + '\n'.join(activos), fontsize=12)
# Mostrar la gráfica
plt.show()
import pandas as pd
# Filtrar por la empresa ExxonMobil y sumar sus ganancias
ganancias_exxonmobil = df_2015_2022[df_2015_2022['Empresa'] == 'novartis']['Margen de Rentabilidad']
ganancias_exxonmobil
34 0.189308
329 0.356992
636 0.138079
944 0.160363
1241 0.243401
1531 0.251238
1807 0.166032
2085 0.467546
Name: Margen de Rentabilidad, dtype: float64
F. ¿Cuáles fueron las 10 empresas norteamericanas con mayores pérdidas registradas por industria a nivel global?
import pandas as pd
# Filtrar por ['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', Continente]
df_filt_b = df_2015_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Continente']]
# Filtrar por ['Continente'] == 'North America'
empresas_industria_ganancias = df_filt_b[(df_filt_b['Continente'] == 'North America')]
# Agrupar por industria y empresa, y calcular las pérdidas
empresas_por_industria = empresas_industria_ganancias.groupby(['Industria', 'Empresa'], as_index=False).agg({'Ingresos': 'sum', 'Activos': 'sum', 'Ganancias': 'sum'})
empresas_por_industria['Costos'] = empresas_por_industria['Activos'] - empresas_por_industria['Ganancias']
empresas_por_industria['Perdidas'] = empresas_por_industria['Costos'] - empresas_por_industria['Ingresos']
# Encontrar la empresa con la mayor pérdida por industria
peores_empresas_por_industria = empresas_por_industria[empresas_por_industria['Perdidas'] < 0].groupby('Industria', as_index=False).apply(lambda x: x.loc[x['Perdidas'].idxmax()])
# Cambiar el nombre de las columnas 'Costos' y 'Perdidas'
peores_empresas_por_industria = peores_empresas_por_industria.rename(columns={'Costos': 'Costos = Activos - Ganancias', 'Perdidas': 'Perdidas = Costos - Ingresos'})
# Mostrar el DataFrame con la empresa con la mayor pérdida por industria
peores_empresas_por_industria = peores_empresas_por_industria[['Industria', 'Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Costos = Activos - Ganancias', 'Perdidas = Costos - Ingresos']]
peores_empresas_por_industria = peores_empresas_por_industria.sort_values('Perdidas = Costos - Ingresos', ascending=True)
peores_empresas_por_industria
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Industria | Empresa | Ingresos | Activos | Ganancias | Costos = Activos - Ganancias | Perdidas = Costos - Ingresos | |
---|---|---|---|---|---|---|---|
16 | technology hardware & equipment | hp | 430475.0 | 226749.0 | 27122.0 | 199627.0 | -230848.0 |
8 | food, drink & tobacco | tyson foods | 331578.0 | 235824.0 | 16622.0 | 219202.0 | -112376.0 |
0 | aerospace & defense | lockheed martin | 439314.0 | 376985.0 | 37701.0 | 339284.0 | -100030.0 |
1 | air courier | fedex | 218112.0 | 172559.0 | 10029.0 | 162530.0 | -55582.0 |
11 | insurance | cigna | 334824.0 | 302567.0 | 13823.0 | 288744.0 | -46080.0 |
2 | banking | intl fcstone | 56783.0 | 12421.0 | 58.7 | 12362.3 | -44420.7 |
12 | materials | nucor | 65027.0 | 46554.0 | 10305.5 | 36248.5 | -28778.5 |
18 | transportation | united parcel service | 71911.0 | 50016.0 | 4791.0 | 45225.0 | -26686.0 |
6 | drugs & biotechnology | anthem | 92095.0 | 71571.0 | 3750.0 | 67821.0 | -24274.0 |
7 | food markets | united natural foods | 26983.0 | 7490.0 | 198.4 | 7291.6 | -19691.4 |
4 | consumer durables | johnson controls | 79237.0 | 62929.0 | 1700.0 | 61229.0 | -18008.0 |
5 | diversified financials | intl fcstone | 26256.0 | 8711.0 | 79.0 | 8632.0 | -17624.0 |
9 | health care equipment & services | aetna | 242152.0 | 235169.0 | 10185.3 | 224983.7 | -17168.3 |
17 | trading companies | td synnex | 42145.0 | 28723.0 | 436.4 | 28286.6 | -13858.4 |
14 | oil & gas operations | andeavor | 38636.0 | 28841.0 | 1650.0 | 27191.0 | -11445.0 |
13 | media | directv | 33260.0 | 25459.0 | 2756.0 | 22703.0 | -10557.0 |
10 | hotels, restaurants & leisure | starbucks | 57014.0 | 56313.0 | 7782.9 | 48530.1 | -8483.9 |
15 | retailing | dollar tree | 25509.0 | 20696.0 | 1341.9 | 19354.1 | -6154.9 |
3 | capital goods | emerson electric | 45940.0 | 45276.0 | 4744.0 | 40532.0 | -5408.0 |
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
# Filtrar por ['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', Continente]
df_filt_b = df_2015_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Continente']]
# Filtrar por ['Continente'] == 'North America'
empresas_industria_ganancias = df_filt_b[(df_filt_b['Continente'] == 'North America')]
# Agrupar por industria y empresa, y calcular las pérdidas y costos
empresas_por_industria = empresas_industria_ganancias.groupby(['Industria', 'Empresa'], as_index=False).agg({'Ingresos': 'sum', 'Activos': 'sum', 'Ganancias': 'sum'})
empresas_por_industria['Costos'] = empresas_por_industria['Activos'] - empresas_por_industria['Ganancias']
empresas_por_industria['Perdidas'] = empresas_por_industria['Costos'] - empresas_por_industria['Ingresos']
# Encontrar la empresa con la mayor pérdida por industria
peores_empresas_por_industria = empresas_por_industria[empresas_por_industria['Perdidas'] < 0].groupby('Industria', as_index=False).apply(lambda x: x.loc[x['Perdidas'].idxmax()])
# Cambiar el nombre de las columnas 'Costos' y 'Perdidas'
peores_empresas_por_industria = peores_empresas_por_industria.rename(columns={'Costos': 'Costos = Activos - Ganancias', 'Perdidas': 'Perdidas = Costos - Ingresos'})
# Ordenar las empresas por pérdidas de forma ascendente
peores_empresas_por_industria = peores_empresas_por_industria[['Industria', 'Empresa', 'Ingresos', 'Costos = Activos - Ganancias', 'Perdidas = Costos - Ingresos']]
peores_empresas_por_industria = peores_empresas_por_industria.sort_values('Perdidas = Costos - Ingresos', ascending=True)
# Crear la gráfica
plt.figure(figsize=(15, 8))
sns.set_style("whitegrid")
sns.set_palette("rocket")
ax = sns.barplot(x='Empresa', y='Perdidas = Costos - Ingresos', hue='Industria', data=peores_empresas_por_industria, edgecolor='black')
sns.barplot(x='Empresa', y='Costos = Activos - Ganancias', hue='Industria', data=peores_empresas_por_industria, alpha=0.5, color='lightgray', edgecolor='black')
plt.xticks(rotation=45, ha='right')
# Agregar título y subtítulo
plt.title('Empresas con mayores pérdidas y costos en Norteamérica', fontsize=20)
plt.suptitle('Agrupadas por Industria', fontsize=16, y=0.95)
# Agregar etiquetas de los ejes
plt.xlabel('Empresas', fontsize=14)
plt.ylabel('Miles de dólares', fontsize=14)
# Cambiar tamaño de fuente de los ejes
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# Agregar leyenda personalizada
plt.text(0.02, 0.95, 'Costos', transform=ax.transAxes, fontsize=12, color='red')
plt.text(0.02, 0.04, 'Perdidas', transform=ax.transAxes, fontsize=12, color='red')
# Quitar leyenda por defecto
ax.get_legend().remove()
# Agregar separación de miles en el eje y
fmt = 'U${x:,.0f}'
tick = mtick.StrMethodFormatter(fmt)
ax.yaxis.set_major_formatter(tick)
# Mostrar la gráfica
plt.show()
import pandas as pd
# Filtrar por la empresa ExxonMobil y sumar sus ganancias
ganancias_exxonmobil = df_2015_2022[df_2015_2022['Empresa'] == 'schlumberger']['Ganancias'].sum()
ganancias_exxonmobil
-11707.0
G. ¿Cuál fue la distribución de Ingresos y Activos con respecto a las ganancias de los bancos cuyos activos no superan los 15000 millones de dólares?
import pandas as pd
# Filtrar solo las columnas necesarias
df_bancos = df_2015_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Filtrar solo la industria Banking
df_bancos = df_bancos[df_bancos['Industria'] == 'banking']
# Agrupar por empresa y calcular el promedio de los 'Margen de Rentabilidad' y 'Rentabilidad de los Activos (ROA)'
df_bancos = df_bancos.groupby('Empresa').agg({
'Ingresos': 'sum',
'Activos': 'sum',
'Ganancias': 'sum',
'Margen de Rentabilidad': 'mean',
'Rentabilidad de los Activos (ROA)': 'mean'
}).reset_index()
# Filtrar por empresas cuyos activos no superan los 30000 millones de dólares
df_bancos = df_bancos[df_bancos['Activos'] <= 15000]
# Ordenar el DataFrame por margen de rentabilidad y rentabilidad de los activos (ROA)
df_bancos = df_bancos.sort_values(by=['Rentabilidad de los Activos (ROA)','Margen de Rentabilidad'], ascending=[False, False])
# Seleccionar las columnas de interés
df_bancos = df_bancos[['Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Mostrar el DataFrame resultante
df_bancos
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Ingresos | Activos | Ganancias | Margen de Rentabilidad | Rentabilidad de los Activos (ROA) | |
---|---|---|---|---|---|---|
23 | intl fcstone | 56783.0 | 12421.0 | 58.7 | 0.001176 | 0.005499 |
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
# Filtrar solo las columnas necesarias
df_bancos = df_2015_2022[['Empresa', 'Industria', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Filtrar solo la industria Banking
df_bancos = df_bancos[df_bancos['Industria'] == 'banking']
# Agrupar por empresa y calcular el promedio de los 'Margen de Rentabilidad' y 'Rentabilidad de los Activos (ROA)'
df_bancos = df_bancos.groupby('Empresa').agg({
'Ingresos': 'sum',
'Activos': 'sum',
'Ganancias': 'sum',
'Margen de Rentabilidad': 'mean',
'Rentabilidad de los Activos (ROA)': 'mean'
}).reset_index()
# Ordenar el DataFrame por margen de rentabilidad y rentabilidad de los activos (ROA)
df_bancos = df_bancos.sort_values(by=['Rentabilidad de los Activos (ROA)','Margen de Rentabilidad'], ascending=[False, False])
# Seleccionar las columnas de interés
df_bancos = df_bancos[['Empresa', 'Ingresos', 'Activos', 'Ganancias', 'Margen de Rentabilidad', 'Rentabilidad de los Activos (ROA)']]
# Filtrar las empresas con activos menores o iguales a $15,000 millones
df_bancos_small = df_bancos[df_bancos['Activos'] <= 15000]
# Crear la gráfica original
plt.figure(figsize=(15,8))
sns.set_style("whitegrid")
sns.set_palette("husl")
ax = sns.scatterplot(x='Ingresos', y='Ganancias', size='Activos', hue='Rentabilidad de los Activos (ROA)', sizes=(50, 500), data=df_bancos)
# Resaltar las empresas con activos menores o iguales a $15,000 millones
sns.scatterplot(x='Ingresos', y='Ganancias', size='Activos', hue='Rentabilidad de los Activos (ROA)', sizes=(50, 500), data=df_bancos_small, marker='s', edgecolor='black', linewidth=1, ax=ax)
# Añadir los nombres de las empresas debajo de los puntos
for i in range(len(df_bancos_small)):
plt.annotate(df_bancos_small.iloc[i]['Empresa'] + '\nU${:,.0f}'.format(df_bancos_small.iloc[i]['Activos']),
xy=(df_bancos_small.iloc[i]['Ingresos'], df_bancos_small.iloc[i]['Ganancias']),
xytext=(df_bancos_small.iloc[i]['Ingresos']+50000, df_bancos_small.iloc[i]['Ganancias']+50000),
fontsize=10, ha='center', va='center', weight='bold', color='black',
arrowprops=dict(facecolor='black', arrowstyle='wedge,tail_width=0.5', connectionstyle='arc3,rad=0.5', mutation_scale=20))
# Crear la leyenda personalizada
roa_labels = ['0.0%', '1%', '5%']
roa_colors = ['#d5bfba', '#976588', '#3f334c']
handles = [plt.scatter([], [], s=100, marker='o', color=roa_colors[i]) for i in range(3)]
plt.legend(handles, roa_labels, title='Rentabilidad de los Activos (ROA)', fontsize=12, title_fontsize=14)
# Agregar título y subtítulo
plt.title('Ganancias, ingresos y activos para los años entre 2015-2022', fontsize=20)
plt.suptitle('Agrupados por Rentabilidad de los Activos (ROA)', fontsize=16, y=0.95)
# Agregar etiquetas de los ejes con separador de miles
ax.xaxis.set_major_formatter(mtick.StrMethodFormatter('{x:,.0f}'))
ax.yaxis.set_major_formatter(mtick.StrMethodFormatter('{x:,.0f}'))
plt.xlabel('Ingresos (millones de dólares)', fontsize=14)
plt.ylabel('Ganancias (millones de dólares)', fontsize=14)
# Cambiar tamaño de fuente y los ejes
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.tick_params(axis='both', which='both', length=0)
plt.show()
H. ¿Cuáles fueron las ganancias anuales de las principales empresas en la Industria automotriz?
import pandas as pd
# Filtrar las empresas de la industria Transportation
df_automotriz = df_2015_2022[df_2015_2022['Industria'] == 'transportation']
# Agrupar por empresa, año y sumar las ganancias
ganancias_anuales = df_automotriz.groupby(['Empresa', 'Año'])['Ganancias'].sum().reset_index()
# Agrupar por empresa y sumar las ganancias totales
ganancias_totales = ganancias_anuales.groupby('Empresa')['Ganancias'].sum().reset_index()
# Renombrar la columna de ganancias totales
ganancias_totales = ganancias_totales.rename(columns={'Ganancias': 'Ganancias Totales'})
# Unir los DataFrames de ganancias anuales y ganancias totales
df_ganancias = pd.merge(ganancias_anuales, ganancias_totales, on='Empresa')
# Mostrar el DataFrame resultante
df_ganancias
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Empresa | Año | Ganancias | Ganancias Totales | |
---|---|---|---|---|
0 | american airlines group | 2019 | 1412.0 | -1706.0 |
1 | american airlines group | 2020 | -740.0 | -1706.0 |
2 | american airlines group | 2022 | -2378.0 | -1706.0 |
3 | cosco shipping | 2020 | -13.5 | 15300.0 |
4 | cosco shipping | 2021 | 1458.6 | 15300.0 |
5 | cosco shipping | 2022 | 13854.9 | 15300.0 |
6 | delta air lines | 2019 | 4086.0 | 8105.0 |
7 | delta air lines | 2020 | 3503.0 | 8105.0 |
8 | delta air lines | 2022 | 516.0 | 8105.0 |
9 | east japan railway | 2015 | 1901.7 | 13211.1 |
10 | east japan railway | 2016 | 1922.2 | 13211.1 |
11 | east japan railway | 2017 | 2303.0 | 13211.1 |
12 | east japan railway | 2018 | 2607.2 | 13211.1 |
13 | east japan railway | 2019 | 2652.0 | 13211.1 |
14 | east japan railway | 2020 | 1825.0 | 13211.1 |
15 | fedex | 2019 | 3630.0 | 11429.0 |
16 | fedex | 2020 | -350.0 | 11429.0 |
17 | fedex | 2021 | 3023.0 | 11429.0 |
18 | fedex | 2022 | 5126.0 | 11429.0 |
19 | union pacific | 2015 | 5180.0 | 9780.0 |
20 | union pacific | 2016 | 4600.0 | 9780.0 |
21 | united airlines holdings | 2019 | 2274.0 | 3287.0 |
22 | united airlines holdings | 2020 | 1013.0 | 3287.0 |
23 | united parcel service | 2019 | 4791.0 | 4791.0 |
import seaborn as sns
import matplotlib.pyplot as plt
# Filtrar las empresas de la industria Transportation
df_automotriz = df_2015_2022[df_2015_2022['Industria'] == 'transportation']
# Agrupar por empresa, año y sumar las ganancias
ganancias_anuales = df_automotriz.groupby(['Empresa', 'Año'])['Ganancias'].sum().reset_index()
# Agrupar por empresa y sumar las ganancias totales
ganancias_totales = ganancias_anuales.groupby('Empresa')['Ganancias'].sum().reset_index()
# Renombrar la columna de ganancias totales
ganancias_totales = ganancias_totales.rename(columns={'Ganancias': 'Ganancias Totales'})
# Unir los DataFrames de ganancias anuales y ganancias totales
df_ganancias = pd.merge(ganancias_anuales, ganancias_totales, on='Empresa')
# Crear una gráfica para cada empresa
num_empresas = len(ganancias_totales)
num_filas = num_empresas // 4 + (num_empresas % 4 > 0)
fig, axs = plt.subplots(nrows=num_filas, ncols=4, figsize=(20, 5*num_filas))
sns.set_palette('pastel')
for i, empresa in enumerate(ganancias_totales['Empresa']):
# Filtrar el DataFrame para la empresa actual
df_empresa = df_ganancias[df_ganancias['Empresa'] == empresa]
# Obtener la ganancia total de la empresa
ganancia_total = df_empresa.iloc[0]['Ganancias Totales']
# Obtener los índices de la fila y columna actual
row = i // 4
col = i % 4
# Crear la gráfica de barras
ax = sns.barplot(x='Año', y='Ganancias', data=df_empresa, ax=axs[row][col])
# Agregar línea horizontal para la ganancia total
ax.axhline(y=ganancia_total, color='r', linestyle='--')
# Agregar título y subtítulo
ax.set_title(f'{empresa} / año')
ax.set_xlabel('Año')
ax.set_ylabel('Ganancias')
# Ajustar los límites del eje y para que se ajusten a los datos
ymin, ymax = ax.get_ylim()
if ymin < 0:
ax.set_ylim(ymin * 1.1, ymax * 1.1)
# Agregar leyenda solo a la última gráfica de cada fila
if col == 3:
ax.axhline(y=ganancia_total, color='r', linestyle='--', label='Ganancias Totales')
ax.legend()
# Añadir título universal
fig.suptitle('Ganancias anuales de las principales empresas en la Industria automotriz', fontsize=16)
# Ajustar el espaciado entre las gráficas y mostrar la figura
plt.tight_layout()
plt.show()
6. Visualización de datos
¡Extra!
A.Crea un gráfico de carrera de barras (racing bar chart) que indique la variación del valor de mercado por industria durante el periodo 2015 - 2022. Utiliza el repositorio Bar Chart Race para que utilices esta sencilla herramienta.
# !apt-get install -y ffmpeg
# !pip install bar_chart_race
# import pandas as pd
# import bar_chart_race as bcr
# # Seleccionar solo las columnas relevantes
# df_ganancias = df_2015_2022[['Industria', 'Año', 'Valor de Mercado']]
# # Ordenar los datos por año y valor de mercado
# df_ganancias = df_ganancias.sort_values(['Año', 'Valor de Mercado'], ascending=[True, False])
# # Crear el gráfico de carrera de barras
# bcr.bar_chart_race(df=df_ganancias,
# title='Variación del valor de mercado por industria (2015-2022)',
# orientation='h',
# sort='desc',
# n_bars=6,
# fixed_order=False,
# steps_per_period=10,
# period_length=500)
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
# Leer los datos y filtrar los de 2015 a 2022
df_ganancias = df_2015_2022.loc[(df_2015_2022['Año'] >= '2015') & (df_2015_2022['Año'] <= '2022')]
# Agrupar los datos por industria y seleccionar la empresa con mayor valor de mercado en cada grupo
df_top1 = df_ganancias.groupby('Industria').apply(lambda x: x.loc[x['Valor de Mercado'].idxmax()])
# Ordenar los datos por valor de mercado y seleccionar las 6 mejores industrias
df_top6 = df_top1.sort_values('Valor de Mercado', ascending=False).head(6)
# Crear la figura y el eje
fig, ax = plt.subplots(figsize=(8, 6))
fig.set_size_inches(30, 6, forward=True)
fig.subplots_adjust(right=0.85) # Agregar un padding al lado derecho del gráfico
# Definir la función update
def update(year):
# Filtrar los datos para el año actual y las 6 mejores industrias
df_filtered = df_ganancias.loc[(df_ganancias['Año'] == str(year)) & (df_ganancias['Industria'].isin(df_top6['Industria']))]
# Seleccionar la empresa con mayor valor de mercado por industria para cada año
df_year = df_filtered.loc[df_filtered.groupby('Industria')['Valor de Mercado'].idxmax()]
# Crear el gráfico de barras
ax.clear()
bars = ax.barh(df_year['Industria'], df_year['Valor de Mercado'], color=['#2CA02C', '#FF7F0E', '#1F77B4', '#D62728', '#9467BD', '#8c564b'], label='Valor de mercado')
# Agregar etiquetas a las barras
for bar, label in zip(bars, df_year['Empresa']):
ax.annotate(label, xy=(bar.get_x() + bar.get_width() / 2, bar.get_y() + bar.get_height() / 2), ha='center', va='center', fontsize=12, color='white')
bar.set_label(label)
# Agregar el título y los ejes
ax.set_title(f'Las 6 mejores Industrias por Empresa con mayor Valor de Mercado ({year})', fontsize=20)
ax.set_xlabel('Valor de mercado (en millones de dólares)', fontsize=14)
ax.set_ylabel('Industria', fontsize=14)
ax.tick_params(labelsize=12)
ax.invert_yaxis()
# Formatear los valores del mercado
ax.get_xaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: f'U${x/1000000:.1f}M'))
# Crear la leyenda
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', ncol=1, fontsize=12)
# Crear la animación
anim = FuncAnimation(fig, update, frames=range(2015, 2023), interval=5000, repeat=True)
# Exportar la animación a un archivo de video
# anim.save('grafico.mp4', dpi=150)
# Convertir la animación a HTML5 y mostrarla en Colab
html5_video = anim.to_html5_video()
HTML(html5_video)
Valor de mercado por Industria "CLICK AQUI PARA VER EN FORMA INTERACTIVA"
B.Crea otro gráfico de carrera de barras que muestre la variación del número de empleados por industria durante el periodo 2015 - 2022.
import pandas as pd
# Leer los datos y filtrar por la industria deseada
df_industria = df_2015_2022[df_2015_2022['Industria'] == 'retailing']
# Agrupar los datos por año y sumar los empleados de la industria
df_empleados = df_industria.groupby('Año')['Empleados'].sum().reset_index()
# Mostrar el número de empleados por año
print(df_empleados)
Año Empleados
0 2015 1639586
1 2016 2410036
2 2017 2597109
3 2018 4895823
4 2019 4803267
5 2020 5492541
6 2021 5997078
7 2022 6001421
# !pip install ffmpeg-python
# !pip install bar_chart_race
# import pandas as pd
# import bar_chart_race as bcr
# df_empleados = df_2015_2022.loc[(df_2015_2022['Año'] >= '2015') & (df_2015_2022['Año'] <= '2022')]
# df_grouped = df_empleados.groupby(['Industria', 'Año'])['Empleados'].sum().reset_index()
# bcr.bar_chart_race(
# df=df_grouped,
# title='Variación del número de empleados por industria',
# orientation='h',
# sort='desc',
# n_bars=6,
# fixed_order=False,
# steps_per_period=10,
# period_length=500,
# interpolate_period=False,
# label_bars=True,
# bar_size=.95,
# period_label={'x': .99, 'y': .25, 'ha': 'right', 'va': 'center'},
# period_fmt='%Y',
# period_summary_func=lambda v, r: {'x': .99, 'y': .18, 's': f'Total empleados: {v.sum():,.0f}', 'ha': 'right', 'size': 8, 'family': 'Courier New'},
# perpendicular_bar_func='median',
# figsize=(6.5, 3.5),
# dpi=144,
# cmap='dark12',
# title_size='',
# bar_label_size=7,
# tick_label_size=7,
# shared_fontdict={'family' : 'Helvetica', 'color' : '.1'},
# scale='linear',
# writer=None,
# fig=None,
# bar_kwargs={'alpha': .7},
# filter_column_colors=False)
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
# Leer los datos y filtrar los de 2015 a 2022
df_empleados = df_2015_2022.loc[(df_2015_2022['Año'] >= '2015') & (df_2015_2022['Año'] <= '2022')]
# Agrupar los datos por año e industria y sumar los empleados de cada empresa
df_year_industrias = df_empleados.groupby(['Año', 'Industria']).agg({'Empleados': sum}).reset_index()
# Seleccionar todas las industrias
industrias = df_year_industrias['Industria'].unique()
# Crear la figura y el eje
fig, ax = plt.subplots(figsize=(25, 30))
fig.subplots_adjust(right=0.85) # Agregar un padding al lado derecho del gráfico
# Definir la función update
def update(year):
# Filtrar los datos para el año actual y todas las industrias
df_filtered = df_year_industrias.loc[(df_year_industrias['Año'] == str(year)) & (df_year_industrias['Industria'].isin(industrias))]
# Ordenar las industrias por cantidad de empleados
df_filtered = df_filtered.sort_values('Empleados', ascending=False)
# Crear el gráfico de barras
ax.clear()
cmap = plt.get_cmap('tab20c') # Obtener la paleta de colores
colors = cmap(range(len(industrias))) # Asignar un color a cada industria
bars = ax.bar(df_filtered['Industria'], df_filtered['Empleados'], color=colors, width=0.8, align='center', edgecolor='white')
# Agregar el título y los ejes
ax.set_title(f'Todas las Industrias con cantidad de Empleados ({year})', fontsize=20)
ax.set_xlabel('Industria', fontsize=14)
ax.set_ylabel('Cantidad de empleados (en millones)', fontsize=14)
ax.tick_params(labelsize=12, axis='x', rotation=90)
# Formatear los valores de empleados
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: f'{x/1000000:,.1f}M'))
# Agregar el total de empleados encima de cada barra
for bar, empleados in zip(bars, df_filtered['Empleados']):
ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 50000, f'{empleados/1000000:,.2f}M', ha='center', va='bottom', fontsize=10)
# Crear la animación
anim_b = FuncAnimation(fig, update, frames=range(2015, 2023), interval=5000, repeat=True)
# Exportar la animación a un archivo de video
#anim_b.save('grafico_b.mp4', dpi=150)
# Convertir la animación a HTML5 y mostrarla en Colab
html5_video = anim_b.to_html5_video()
HTML(html5_video)
Cantidad de empleados por Industria "CLICK AQUI PARA VER EN FORMA INTERACTIVA"
C.Utilizando la biblioteca Choropleth Maps in Python, genera un mapa con el total de ventas globales por país en el año 2020
import pandas as pd
# Agrupar por pais y sumar las ganancias totales
ventas_totales = df_2015_2022.groupby('Pais')['Ganancias'].sum().reset_index()
# Renombrar la columna de ganancias totales
df_ventas_globales = ventas_totales.rename(columns={'Ganancias': 'Ventas Globales'})
# Mostrar el DataFrame resultante
df_ventas_globales
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Pais | Ventas Globales | |
---|---|---|
0 | Australia | 96799.4 |
1 | Austria | 5283.9 |
2 | Belgium | 45312.0 |
3 | Bermuda | 6057.0 |
4 | Brazil | 137511.9 |
5 | Canada | 196369.3 |
6 | Chile | 502.8 |
7 | China | 1482651.2 |
8 | Colombia | 3751.6 |
9 | Finland | -1969.2 |
10 | France | 320223.6 |
11 | Germany | 409937.4 |
12 | Hong Kong | 58422.0 |
13 | India | 111164.2 |
14 | Ireland | 74911.9 |
15 | Italy | 62288.0 |
16 | Japan | 700160.8 |
17 | Luxembourg | 13966.3 |
18 | Mexico | 4537.9 |
19 | Netherlands | 184866.0 |
20 | Norway | 13377.3 |
21 | Russia | 254933.9 |
22 | Singapore | 12746.0 |
23 | South Korea | 350206.2 |
24 | Spain | 96121.5 |
25 | Sweden | 570.0 |
26 | Switzerland | 208400.9 |
27 | Taiwan | 79703.5 |
28 | Thailand | 6613.0 |
29 | Turkey | 4980.4 |
30 | United Kingdom | 401189.7 |
31 | United States | 5159154.3 |
32 | Venezuela | 3553.4 |
import pandas as pd
import plotly.express as px
import json
import requests
# Agrupar por país y sumar las ganancias totales
ventas_totales = df_2015_2022.groupby('Pais')['Ganancias'].sum().reset_index()
# Renombrar la columna de ganancias totales
df_ventas_globales = ventas_totales.rename(columns={'Ganancias': 'Ventas Globales'})
# Obtener el archivo GeoJSON desde el repositorio de GitHub
url = 'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
geojson = requests.get(url).json()
# Crear el mapa de coropletas
fig = px.choropleth(df_ventas_globales, locations='Pais', locationmode='country names', color='Ventas Globales',
featureidkey='properties.name', geojson=geojson,
color_continuous_scale='Viridis', range_color=(0, df_ventas_globales['Ventas Globales'].max()),
title='Ventas Globales por País')
# Configurar el tamaño y el diseño del mapa y los datos de herramientas emergentes (hover)
fig.update_layout(height=600, margin={"r":0,"l":0,"b":0},
coloraxis_colorbar=dict(title='Ventas Globales (en millones de dólares)',
tickprefix='U$', separatethousands=True),
geo=dict(showcountries=True, showcoastlines=True, projection_type='equirectangular',
landcolor='rgb(211, 211, 211)', countrycolor='black'))
# Actualizar las opciones de las herramientas emergentes (hover)
fig.update_traces(hovertemplate='<b>%{location}</b><br><br>Ventas Globales: U$%{z:,.1f}')
# Mostrar el mapa
fig.show()
Ventas Globales por País "CLICK AQUI PARA VER EN FORMA INTERACTIVA"