Skip to content

Código Elasticidad Cruzada

--------------------------------------------------

ELASTICIDAD CRUZADA – CEMENTO

--------------------------------------------------

Se importan las librerias
import pandas as pd
import numpy as np
import unicodedata
from datetime import datetime
from pathlib import Path
from tqdm import tqdm # Añadir esta importación

Utilizamos las columnas necesarias en la base generada previamente en el analisis de elasticidad precio agrupado por ciudad, PDM y Cluster
columnas = [‘Ciudad’, ‘PDM’, ‘Clusters 10, ‘Fecha’, ‘Volumen’, ‘Amount’,‘Precio_GCC’,‘Elasticidad_Precio_OLS’,‘Intercepto_OLS’]
df3=pd.read_csv(r"C:\Users\gerar\OneDrive - Business Data Scientists, S.A.P.I de C.V (1)\GCC - Actualización Simulador GCC\3. Preparación de Datos\Elasticidades\Elasticidad_jeni\elasticidad cruzada\cruzada envasado\delta_envasado_PA3.csv",encoding=‘UTF-8-sig’,
usecols=columnas,
parse_dates=[‘Fecha’],
#date_parser=lambda x: pd.to_datetime(x, format=‘%Y-%m-%d’),
dayfirst=True)
Renombrar ‘Ciudad’ a ‘Zona’ inmediatamente después de cargar
df3 = df3.rename(columns={‘Zona’: ‘Ciudad’})
df3 = df3.rename(columns={‘Precio_GCC’: ‘Precio GCC’})
df3.tail()
# Convertir a datetime
df3['Fecha'] = pd.to_datetime(df3['Fecha'], errors='coerce')
# Asegurar que sea el primer día del mes
df3['Fecha'] = pd.to_datetime(
df3['Fecha'].dt.strftime('%Y-%m-01'),
errors='coerce'
)

Métricas Calculadas

Volumen_total: Suma total de volumen de ventas por grupo
Amount GCC: Suma total del monto GCC (probablemente una medida monetaria)
df4 = (
df3
.groupby(['Ciudad', 'PDM', 'Fecha'], as_index=False)
.apply(
lambda x: pd.Series({
'Volumen_total': x['Volumen'].sum(),
'Amount GCC': x['Amount'].sum(),

'Precio_GCC_prom': np.average(
x['Precio GCC'],
weights=x['Volumen']
),

'Elasticidad_Precio_OLS_agregada': np.average(
x['Elasticidad_Precio_OLS'],
weights=x['Volumen']
),

'Intercepto_OLS_agregado': np.average(
x['Intercepto_OLS'],
weights=x['Volumen']
)
})
)
.reset_index(drop=True)
)
df4.head()
Definimos una función para normalizar texto en ciudades, quitar nombres ajenos y acentos.
# --------------------------------------------------
# Función utilitaria: normalizar texto
# --------------------------------------------------
def normalizar_texto(col):
return (
col.astype(str)
.str.normalize('NFKD')
.str.encode('ascii', errors='ignore')
.str.decode('utf-8')
.str.strip()
)
Cargamos el archivo historico de mercadotecnia correspondiente a cemento
# --------------------------------------------------
# 2. Histórico competencia
# --------------------------------------------------
columnas = ['Fecha', 'Plaza', 'Producto Equivalente', 'Empresa','Ventas']
# Primero cargar el DataFrame

db_env = pd.read_csv(
r"C:\Users\gerar\OneDrive - Business Data Scientists, S.A.P.I de C.V (1)\GCC - Actualización Simulador GCC\2. Entendimiento de Datos\Archivos de Entrada\HistoricoCemento_1723.csv",
encoding='UTF-8-sig',
usecols=columnas,
parse_dates=['Fecha'],
dayfirst =True
)
Filtramos el periodo de 2024 y 2025
# Filtrar solo años 2024 y 2025
db_env_2425 = db_env[
db_env['Fecha'].dt.year.isin([2024, 2025])
].copy()
Normalizamos el producto PDM
# Filtrar y procesar el resto
db_env_2425['Producto Equivalente'] = (
db_env_2425['Producto Equivalente']
.astype(str)
.str.replace('Envasado', 'Cemento Envasado', regex=False)
.str.replace('Cemento envasado', 'Cemento Envasado', regex=False)
.str.replace('Granel', 'Cemento Granel', regex=False)
.str.replace('Cemento granel', 'Cemento Granel', regex=False)
.str.replace('Megabolsa', 'Cemento Mega Bolsa', regex=False)
)
db_env_2425 = (
db_env_2425
.query("Empresa not in ['TOTAL MERCADO', 'GCC']")
.assign(
Ciudad=lambda x: normalizar_texto(x['Plaza']),
VolComp=lambda x: pd.to_numeric(x['Ventas'], errors='coerce').fillna(0),
PDM='Cemento Envasado'
)
)

print("\nProceso completado exitosamente!")

db_env_2425['Plaza'].unique()
Normalizamos los nombres de ciudades
db_env_2425['Plaza'] = (
db_env_2425['Plaza']
.astype(str)
.str.replace('Jiménez', 'Jimenez', regex=False)
.str.replace('Juárez', 'Juarez', regex=False)
.str.replace('Cuauthémoc', 'Cuauhtemoc', regex=False)
.str.replace('Nuevo Casas Grandes', 'Casas Grandes', regex=False)
)
db_env_2425.tail()
Se suma el volumen de la competencia
df5 = (
db_env_2425
.groupby(['Ciudad','PDM','Fecha'], as_index=False)
.agg({
'VolComp': 'sum'
}))

df5.head()
Unimos histórico con las elasticidades previamente calculadas en el análisis de elasticidad-precio
envasado = (
df4
.merge(
df5,
on=['Ciudad', 'PDM', 'Fecha'],
how='left' # recomendado
)
)

rename_dict = {
'Elasticidad_Precio_OLS_agregada': 'Elasticidad GCC',
'Intercepto_OLS_agregado': 'Intercepto GCC',
}
envasado.rename(columns=rename_dict, inplace=True)
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.