Tasas de ocupación hotelera

Un usuario Pregunto ✅

gileswalker

Hola a todos,

He estado atascado en este problema durante unos días y probablemente estoy pensando demasiado, así que espero que alguien pueda proporcionar una solución ordenada.

He creado algunos datos ficticios para un hotel y necesito calcular las tasas de ocupación (habitaciones totales/habitaciones llenas). El total de habitaciones es de 48, aquí están los datos:

Room_ID Invitado_ID Fecha de fecha_hasta
109 74 1/01/2016 01/06/2016
217 85 1/01/2016 01/05/2016
210 dieciséis 1/01/2016 01/06/2016
116 53 1/01/2016 01/05/2016
209 129 1/01/2016 01/03/2016
214 82 2/01/2016 01/03/2016
215 96 2/01/2016 01/03/2016
204 13 2/01/2016 7/01/2016
108 18 01/03/2016 01/06/2016
115 101 01/05/2016 8/01/2016
207 12 01/05/2016 7/01/2016
104 23 01/06/2016 7/01/2016
403 138 7/01/2016 01/12/2016
111 15 7/01/2016 01/11/2016
404 131 7/01/2016 01/12/2016
106 95 7/01/2016 01/12/2016
304 95 8/01/2016 01/09/2016
302 17 8/01/2016 13/01/2016
212 109 01/09/2016 01/12/2016
302 4 01/09/2016 14/01/2016

Es una tabla bastante sencilla. Sin embargo, mi problema es si quiero calcular la tasa de ocupación en un día, semana, mes o año, cómo obtener una fórmula dax para calcular los días entre date_from y date_to. Pensé que podría hacerse con el número total de días en el marco de tiempo relevante, sin embargo, estaría interesado en ver las ideas de las comunidades.

El informe tiene una clave de fecha con fechas continuas y todas las semanas, meses, etc. relevantes. Esto está vinculado a través de la columna Fecha_desde.

Gracias,

Giles

rdurkin

Creo que lo tengo resuelto para ti:

Agregue una columna de índice a su tabla de Reservas, ya que asumo que GuestID se refiere a una persona específica y esa persona puede reservar varias habitaciones a la vez o durante un período de tiempo determinado.

Agregue una dimensión de fecha.

Su modelo debe verse como el siguiente:

Ocupación hotelera.png

Crea las siguientes medidas:

Habitaciones Ocupadas:=CALCULAR(DISTINCTCOUNT(Reservas[Index Column]), Filtro (Reservas,[Date_from]<=ÚLTIMA FECHA(DimDate[Date])&&[Date_to]>=FIRSTDATE(DimDate[Date])))

Habitaciones Disponibles (Total para Fechas Seleccionadas):=CALCULAR(DISTINCTCOUNT(DimDate[Date]))*48

Total de fechas reservadas:=CALCULAR(DISTINCTCOUNT(DimDate[Date]),Reservaciones)

Habitaciones Totales Ocupadas:=SUMX(Reservas,[Rooms Occupied]*[Total Dates Booked])

Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])

O

Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])*DIVIDIR([Rows in Bookings],[Rows in Bookings])

Ejemplos de tablas dinámicas:

Ejemplo de tabla dinámica 1.png

Tabla dinámica Ejemplo 2.png

Márquelo como una solución o dé un kudo si funciona para usted, de lo contrario, avíseme si se encuentra con un problema y haré todo lo posible para ayudarlo. Vaya a bipatterns.com para obtener más técnicas y guías de usuario.

Gracias,

ryan durkin

edinvz

No estoy seguro si el problema es demasiado complejo o te confundí.

Si alguien está dispuesto a ayudar, proporcionaré más detalles.

Edín

edinvz

Gracias por sus respuestas @GilesWalker y @Ashish_Mathur, son muy apreciadas.

Intenté usar la fórmula provista para crear una medida, pero arroja el error que experimenté con otros intentos de crear esta medida:

‘La expresión se refiere a múltiples columnas. Varias columnas no se pueden convertir a un valor escalar.’

Podría estar aplicándolo de manera incorrecta, pero también parece que la cuestión de cómo se ve mi tabla de datos como lo señala @Ashish_Mathur puede ser útil.

Mi tabla de datos inicial contiene filas para cada reserva por habitación (litera), cliente, producto, fecha de inicio y fecha de finalización.

Identificación Muelle__c End_Day__c Inicio_día__c Productos__c ID de la cuenta
a4jb0 a4Kb0 16-06-16 15-06-16 a7jb0
a4jb0 a4Kb0 23-09-17 22-09-17 a7jb0
a4jb0 a4Kb0 23-09-17 22-09-17 a7jb0
a4jb0 a4Kb0 24-09-17 23-09-17 a7jb0
a4jb0 a4Kb0 20-06-16 15-06-16 a7jb0
a4jb0 a4Kb0 15-08-17 13-08-17 a7jb0
a4jb0 a4Kb0 03-08-17 02-08-17 a7jb0
a4jb0 a4Kb0 16-06-16 15-06-16 a7jb0

Obviamente, todos los valores aparecen muchas veces, ya que el conjunto de datos contiene pocos años de reservas.

Editar: lo que estoy tratando de obtener es la ocupación por mes y duración, por ejemplo, el ejemplo de duración de ocupación para un período se presenta a continuación. Las columnas Recuento y Área, así como la longitud de las literas, se agregan a la tabla de datos de las tablas relacionadas. La pregunta principal es cómo encontrar el recuento Occ basado en la tabla de datos.

Longitud Contar Área Recuento ocupacional área ocupacional Recuento de % de ocupación % área ocupada
6 8 144 6.40 115.20 80% 80%
7 10 210 8.00 168.00 80% 80%
12 30 1,440 24.00 1,152.00 80% 80%
13.5 20 1,080 16.00 864.00 80% 80%
15 30 2,250 24.00 1,800.00 80% 80%
17 20 1,700 16.00 1,360.00 80% 80%
18 10 1,080 8.00 864.00 80% 80%

Gracias de antemano y avísame si puedo ayudarte con alguna información adicional.

Edín

Ashish_Mathur

En respuesta a edinvz

Hola,

No entiendo cómo ha calculado los números en la columna Occ Count. Por favor explique en detalle.

edinvz

En respuesta a Ashish_Mathur

Mis disculpas por no ser lo suficientemente claro.

Esa información proviene de una tabla diferente. Pero como dije, la atención se centra en el recuento de literas ocupadas y esa es la única información que se calculará. en base a la tabla de datos presentada.

Espero que ahora tenga más sentido.

¡Muchas gracias!

Edín

Ashish_Mathur

En respuesta a edinvz

Sigo sin entender. ¿Cómo ha calculado los números en la columna Occ Count? ¿Cómo llegaste a los números: 6.4,8,24, etc.?

edinvz

En respuesta a Ashish_Mathur

Eso es exactamente lo que quiero obtener: la segunda tabla es el resultado que busco. Mi pregunta es cómo crear una medida que calcule el recuento de ocupación en función de la primera tabla (tabla de datos que contiene reservas y todas las funciones relacionadas).

edinvz

Estimados profesionales de Power BI 🙂

He intentado descifrar este durante algún tiempo y todavía no puedo obtener lo que necesito.

Quiero obtener la medida que calcularía la cantidad de habitaciones ocupadas cada día, pero también obtener la cantidad promedio de habitaciones ocupadas cuando se agrega a una base mensual y anual.

Lo he resuelto creando la Columna Calculada usando la medida [Rooms Occupied] proporcionada por rdurkin y luego promediada. Funciona bien para la ocupación total, pero la espera no permite segmentar por diferentes segmentos, por ejemplo, producto, tipo de habitación, tamaño y similares.

Agradecería si alguien pudiera intentar sugerir una solución para el problema descrito anteriormente.

Y en caso de que haya alguna diferencia, estoy trabajando en Excel Power Pivot, en lugar de Power BI.

Gracias de antemano y espero ver cuán geniales pueden ser las medidas de Dax.

Edín

Ashish_Mathur

En respuesta a edinvz

Hola @edinvz,

Comparta el enlace desde donde puedo descargar su libro de Excel y también el resultado esperado allí.

gileswalker

En respuesta a edinvz

@edinvz: logré encontrar una solución a esto y la he usado varias veces y funciona bien:

Tabla Diaria =
FILTRO (
CROSSJOIN (Tabla 1, CALENDARIO AUTOMÁTICO ()),
Tabla 1[date_from] <= [Date]
&& [Date]
<=
Fecha de finalización del VAR = Tabla 1[date_to]
REGRESO
SI ( Fecha de finalización = EN BLANCO (), HOY (), Fecha de finalización )
)

rdurkin

Creo que lo tengo resuelto para ti:

Agregue una columna de índice a su tabla de Reservas, ya que asumo que GuestID se refiere a una persona específica y esa persona puede reservar varias habitaciones a la vez o durante un período de tiempo determinado.

Agregue una dimensión de fecha.

Su modelo debe verse como el siguiente:

Ocupación hotelera.png

Crea las siguientes medidas:

Habitaciones Ocupadas:=CALCULAR(DISTINCTCOUNT(Reservas[Index Column]), Filtro (Reservas,[Date_from]<=ÚLTIMA FECHA(DimDate[Date])&&[Date_to]>=FIRSTDATE(DimDate[Date])))

Habitaciones Disponibles (Total para Fechas Seleccionadas):=CALCULAR(DISTINCTCOUNT(DimDate[Date]))*48

Total de fechas reservadas:=CALCULAR(DISTINCTCOUNT(DimDate[Date]),Reservaciones)

Habitaciones Totales Ocupadas:=SUMX(Reservas,[Rooms Occupied]*[Total Dates Booked])

Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])

O

Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])*DIVIDIR([Rows in Bookings],[Rows in Bookings])

Ejemplos de tablas dinámicas:

Ejemplo de tabla dinámica 1.png

Tabla dinámica Ejemplo 2.png

Márquelo como una solución o dé un kudo si funciona para usted, de lo contrario, avíseme si se encuentra con un problema y haré todo lo posible para ayudarlo. Vaya a bipatterns.com para obtener más técnicas y guías de usuario.

Gracias,

ryan durkin

yggdrasil

En respuesta a rdurkin

¿Alguna idea de cómo llenar los espacios en blanco?
Por ejemplo, debería haber 5 el 7 y 9 hasta septiembre…
O.PNG

Ashish_Mathur

En respuesta a yggdrasil

Hola,

Explique la pregunta y comparta los datos (en un formato que se pueda pegar en un archivo de Excel)

yggdrasil

En respuesta a Ashish_Mathur

Estoy usando la solución propuesta por @rdurkin y obtengo espacios en blanco donde no hay nadie que se registre.

Todo lo demás es correcto, solo necesito que los números sean acumulativos

gileswalker

En respuesta a rdurkin

@rdurkin: gracias por su ayuda con esto, su solución funcionó, ya que tiene en cuenta el total de días disponibles para las habitaciones y luego usa el recuento real de tiempo que se reserva una habitación.

@sdjensen: gracias por su ayuda con esto, acertó en que debe tener en cuenta los días disponibles en comparación con los días reservados por habitación.

@KHorseman: gracias por toda la ayuda con esto y por aclarar qué estaban haciendo las medidas.

gileswalker

En respuesta a gileswalker

@KHorseman: al tener algunos problemas con esta consulta nuevamente, resultó que los números no se calculaban correctamente y parte de la fórmula que proporcionó funcionó con algunos ajustes para darme el total de días reservados. Para calcular el total de días reservados estoy usando esto:

Días incluidos reservados = SUMX(

FILTRO(Reservas, Reservas[Date_from] <= ÚLTIMA FECHA (clave de fecha[Date]) && Reservaciones[Date_to] >= PRIMERA FECHA (Clave de fecha[Date])),

CUENTAS(FECHAS ENTRE (Clave de fecha[Date],Reservaciones[Date_from],Reservaciones[Date_to])))

El problema con el que me encuentro es con los informes sobre períodos de tiempo. Si tengo una habitación reservada del 30 de enero al 4 de febrero, eso significa que en enero había dos días reservados y en febrero cuatro días reservados. Sin embargo, la fórmula anterior dice reservado para seis días, lo cual es correcto; sin embargo, asigna esos seis días al mes al que tengo vinculada la relación datekey (es decir, si date_from es en enero, entonces enero obtiene los seis días). He intentado cambiar la relación de la tabla DateKey para que se vincule a Date_from y Date_to en la tabla de reservas, no hace ninguna diferencia.

¿Hay algún filtro que se pueda usar para que, al filtrar por mes/semana/trimestre, etc., una medida calcule solo los días del mes? En este ejemplo, enero tendría dos días asignados (30 y 31 de enero) y febrero tendría cuatro días (1-4 de febrero).

Aquí hay una imagen de lo que estoy tratando actualmente:

Ocupación.PNG

Gracias,

Giles

KJinete

En respuesta a gileswalker

@GilesWalker Para cualquiera de las soluciones que sugerí, no debería haber ninguna relación entre Bookings y DateKey. Cualquier relación romperá estos patrones de medida de duración. A partir de ahí, deberías poder usar esto:

Inclusive Days Booked = SUMX(
	FILTER(
		Bookings,
		Bookings[Date_from] <= LASTDATE(DateKey[Date]) &&
		Bookings[Date_to] >= FIRSTDATE(DateKey[Date])
	),
	CALCULATE(
		DISTINCTCOUNT(DateKey[Date]),
		DATESBETWEEN(
			DateKey[Date],
			Bookings[Date_from],
			Bookings[Date_to]
		)
	)
)

Esto solo funciona de manera sensata si solo tiene una habitación seleccionada a la vez, o si hace algo como un gráfico de barras agrupadas con room_ID como leyenda. De lo contrario, el mismo día se contará varias veces, una vez por cada habitación que esté ocupada durante el período de tiempo. Pero su captura de pantalla parece que es solo para una habitación a la vez de todos modos.

Estoy bastante seguro de que poner un CALCULATE dentro de un SUMX es una especie de pecado DAX, pero puedo vivir con eso.

rdurkin

@GilesWalker

Esta es una petición bastante interesante. Si tiene un archivo de Excel ficticio disponible, estaré encantado de proporcionarle una solución. Adjuntarlo aquí si es posible. Para ayudar, necesitaré una mejor comprensión del modelo de datos en este caso.

gileswalker

En respuesta a rdurkin

@rdurkin feliz, ¿cómo hago eso?

KJinete

En respuesta a gileswalker

@GilesWalker Para que no tenga que leer ese otro hilo para elegir la mejor de las soluciones ofrecidas, le recomiendo lo siguiente:

Primero, esa relación entre Date_from y la tabla de fechas. No debe haber relaciones de tabla para que esto funcione. Nuevamente, vea ese otro hilo para más detalles. Entonces aquí está su medida de ocupación:

Ocupación = CALCULAR(
DISTINCTCOUNT(NombreTabla[Room_ID]),
FILTRAR(
Nombre de la tabla,
Nombre de la tabla[Date_from] <= ÚLTIMA FECHA (Tabla de fechas[Date]) &&
Nombre de la tabla[Date_to] >= PRIMERA FECHA(Tabla de Fechas[Date])
)
)

Puede colocar cualquier período de tiempo de la tabla de fechas al lado de esta medida y funcionará. Un mes, una semana, un solo día… Lo tengo contando cada habitación solo una vez, pero es posible que desee hacer un conteo distinto de invitados si desea contar la misma habitación varias veces si está ocupada varias veces en un período. O podría hacer un conteo regular de habitaciones en lugar de un conteo distinto. Depende de sus necesidades específicas.

gileswalker

En respuesta a KJinete

Gracias @KHorseman. Acabo de terminar de leer la información en su enlace y su idea parece agradable y limpia. Una vez que me ponga a trabajar en un par de horas, probaré tanto la idea tuya como la de @Sean para ver qué funciona mejor.

Responderé con lo que he hecho.

Giles

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *