GithubHelp home page GithubHelp logo

willydmq / datainsider Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 0.0 12.54 MB

Trabajas como científico/a de datos para Data Insider, un reconocido equipo de asesores financieros con presencia global, y te ha sido solicitado que elabores un informe detallado para entender de manera objetiva el comportamiento de grandes corporaciones a nivel mundial a partir del año 2015.

Home Page: https://soysena-my.sharepoint.com/:p:/g/personal/mayad_soy_sena_edu_co/EfYwvASznrVArQn7FPbvjhMBPS_6ngQIgjOOHbGmFwNozQ?e=Mc1bAC

Jupyter Notebook 51.12% HTML 48.88%
alurachallengedatainsider choropleth data-science datawrangling dexplot matplotlib numpy pandas pandas-dataframe plotly polygon seaborn

datainsider's Introduction

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:
  1. Forbes Global 2000 2008-2022 (mil $ unit)
  2. Fortune Global 500
  3. Continentes y países
  • 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

  1. 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.

  2. 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.

  1. 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)

  2. 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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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();

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
+ 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();

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()])

png

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

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
+ 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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()])

png

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

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

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)
<iframe src="https://player.vimeo.com/video/841387026?autoplay=1&loop=1" width="800" height="450" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>

png

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)
<iframe src="https://player.vimeo.com/video/841387012?autoplay=1&loop=1" width="800" height="450" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>

png

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
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
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()

png

Ventas Globales por País "CLICK AQUI PARA VER EN FORMA INTERACTIVA"

datainsider's People

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.