jojo54
Hola, bastante nuevo en Power BI. Estoy tratando de replicar algo que hago en Excel en Power BI, principalmente porque Excel no puede manejar la cantidad de datos que se están procesando.
Estoy tratando de averiguar qué tan lleno está un café en diferentes momentos del día. Tengo los siguientes datos sobre cada cliente y a qué hora llegan y salen del café.
Nombre | Hora de entrada | Hora de salida |
Persona 1 | 6:00 | 9:00 |
Persona 2 | 7:00 | 8:30 |
Persona 3 | 8:00 | 9:15 |
Persona 4 | 6:45 | 10:00 |
Persona 5 | 7:15 | 7:45 |
Y quiero ver cuántas personas hay realmente en el café en un momento dado, como en el siguiente
6:00 | 6:15 | 6:30 | 6:45 | 7:00 | 7:15 | 7:30 | 7:45 | 8:00 | |
Persona 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Persona 2 | 1 | 1 | 1 | 1 | 1 | ||||
Persona 3 | |||||||||
Persona 4 | 1 | 1 | 1 | 1 | 1 | 1 | |||
Persona 5 | 1 | 1 | 1 | ||||||
Total | 1 | 1 | 1 | 2 | 3 | 4 | 4 | 4 | 3 |
Definitivamente puedo hacerlo en Excel, ¡pero no sé cómo hacerlo en Power BI! ¡Cualquier ayuda sería genial!
Geradav
En respuesta a jojo54
Hola @ jojo54
Vea si lo siguiente puede solucionarlo para lo que necesita
Number of clients 2 = VAR vMinVal = MIN ( TimeTable[Value] ) VAR vMaxVal = MAX ( TimeTable[Value] ) VAR vNumberOfClients = COUNTROWS ( FILTER ( ALLSELECTED ( ClientsTbl ), ClientsTbl[Entry Time] <= vMinVal && ClientsTbl[Exit Time] >= vMaxVal ) ) RETURN vNumberOfClients
Cada vez que tengo más tiempo, puedo pensar en algo mejor.
jojo54
¡Gracias a todos! Disculpas por la demora en la respuesta, ¡vamos a echar un vistazo y probar estas soluciones!
Geradav
Hola @ jojo54
Aquí hay una alternativa que usa DAX
Number of clients = VAR vMinVal = MIN ( TimeTable[Value] ) VAR vMaxVal = MAX ( TimeTable[Value] ) VAR vClientEntry = CALCULATE ( COUNTROWS ( ClientsTbl ), TimeTable[Value] <= vMinVal, ALL ( TimeTable ) ) VAR vClientExit = CALCULATE ( COUNTROWS ( ClientsTbl ), TimeTable[Value] >= vMaxVal, ALL ( TimeTable ), USERELATIONSHIP ( ClientsTbl[Exit Time], TimeTable[Value] ) ) RETURN MIN ( vClientExit, vClientEntry )
Cree una tabla de tiempo, luego cree una relación entre la Hora de inicio y el valor de la hora, y una segunda entre la Hora de salida y el valor de la hora. Uno será una relación activa, mientras que el segundo estará inactivo.
Como esto:
Entonces puedes usar esa medida en tu visualización. Valor de tiempo en el eje X y la medida en el área Valor
Y también puede hacer uso del mismo código DAX en el modelo de datos de Excel (Power Pivot)
Háganos saber lo que funciona para usted
jojo54
En respuesta a Geradav
@Geradav
¡Gracias por esta solución! ¡Me gusta que de hecho puedo escribir esto para averiguar lo que está haciendo!
Pero encuentro un problema con lo siguiente: (tabla actualizada)
Nombre | Hora de entrada | Hora de salida |
Persona 1 | 6:00 | 9:00 |
Persona 2 | 7:00 | 8:30 |
Persona 3 | 8:15 | 9:15 |
Persona 4 | 6:45 | 10:00 |
Persona 5 | 7:15 | 7:45 |
Si tuviera que mirar a las 8 am, de acuerdo con la consulta de DAX,
vcliententry = 4
vclientexit = 4
Entonces la consulta devolverá 4 siendo min (4,4)
Sin embargo, en realidad solo hay 3 personas en el café (Persona 1, 2, 4)
Intenté escribir esto en papel y descubrí que este error de cálculo ocurre cuando hay personas en la lista que han salido antes de TimeValue Y hay personas que aún no han ingresado al café en TimeValue.
¿Alguna idea sobre cómo solucionar este problema?
¡Gracias!
Geradav
En respuesta a jojo54
Hola @ jojo54
Vea si lo siguiente puede solucionarlo para lo que necesita
Number of clients 2 = VAR vMinVal = MIN ( TimeTable[Value] ) VAR vMaxVal = MAX ( TimeTable[Value] ) VAR vNumberOfClients = COUNTROWS ( FILTER ( ALLSELECTED ( ClientsTbl ), ClientsTbl[Entry Time] <= vMinVal && ClientsTbl[Exit Time] >= vMaxVal ) ) RETURN vNumberOfClients
Cada vez que tengo más tiempo, puedo pensar en algo mejor.
kriswright77
En respuesta a Geradav
Hola Geradev
Tengo un problema similar al que enfrenta el OP, y he intentado implementar sus soluciones para mi propio propósito, pero obtengo resultados incorrectos (probablemente similares al OP)
Todavía no incursiono en BI, pero recientemente comencé a enseñarme Power Query y Power Pivot en Excel, que es similar, así que espero que no sea la razón del error de resultados.
Si creo una medida de tabla dinámica similar a su primera solución, algunos resultados son incorrectos para algunos períodos y algunas empresas (necesito contar el número de personas de una empresa en particular en cada período).
Y si pruebo la segunda solución, obtengo el total de subvenciones correcto de personas en cada período, pero se repite para todas las empresas.
Con respecto a la primera solución, parece que está tratando de replicar una función Excel CountIfs, donde toma el mínimo (por compañía) de «Personas que ingresan antes del período de tiempo» y «Personas que se van después del período de tiempo», independientemente de cuándo entraron.
El resultado que creo que realmente necesito es el recuento de personas que han entrado y no se han ido.
¿Hay alguna forma de hacer esto?
Con respecto a la segunda solución, todavía no he aprendido lo suficiente como para averiguar cómo adaptar la fórmula para que regrese por empresa.
Cualquier ayuda que pueda brindar será recibida con gratitud.
Kris
samsaralamb
En respuesta a Geradav
Hola Geradav, parece que tu solución se basa en una fecha. Si hay varios días, ¿puedo preguntar cómo manejarlo? ¡Gracias!
Geradav
En respuesta a samsaralamb
Hola @samsaralamb,
Si lo entendí correctamente, en lugar de usar una tabla de tiempo (con solo valores de tiempo), podría tener una tabla que use valores de fecha y hora, para que pueda obtener la frecuencia durante varios días
jojo54
En respuesta a Geradav
hola, ahora estoy tratando de agregar una columna adicional de información que muestra de qué compañía es la persona. Sin embargo, cuando trato de aplicar un filtro de página para filtrar por empresas individuales, el comando parece seguir revisando toda la tabla y no filtrando el recuento solo para esa empresa. ¿Alguna idea para solucionarlo?
jojo54
En respuesta a Geradav
@Geradav gracias !! ¡Eso funciona perfectamente!
mussaenda
En respuesta a Geradav
Hola @Geradav,
Buen enfoque usando dax! ¿Hay alguna manera de hacer que el intervalo sea cada 15 minutos en lugar de cada 5 minutos?
Geradav
En respuesta a mussaenda
Hola @mussaenda
Usé una función de tabla para generar una serie de tiempo con un incremento de 5 minutos, así que sí, puede ser fácilmente cambiado a 15 minutos.
TimeTable = GENERATESERIES ( TIME ( 5, 0, 0 ), TIME ( 13, 0, 0 ), TIME ( 0, 15, 0 ) )
mussaenda
Hola @ jojo54,
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCkgtKs7PUzBU0lEyszIwAFKWICpWBy5lBBQzh0hZWBmjSBmDxaC6DE2RpUzABpqYAilDAzQTTcEmGkIooJLYWAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Name = _t, #"Entry Time" = _t, #"Exit Time" = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Entry Time", type time}, {"Exit Time", type time}}), #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.Times([Entry Time], 20, #duration(0, 0, 15, 0))), #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"), #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type time}}), #"Added Custom1" = Table.AddColumn(#"Changed Type1", "Custom.1", each if [Exit Time] < [Custom] then "Hide" else "Show"), #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([Custom.1] = "Show")) in #"Filtered Rows"
A partir del resultado que publicaste, la persona 3 también debe contar a las 8:00 porque las 8:00 es su hora de entrada, ¿verdad?
El archivo está aquí
wynhopkins
En respuesta a mussaenda
Buen enfoque @mussaenda, ¿por qué usar el 20 en List.Times?
Además, @ jojo54, dado que este código funcionará en Excel, me interesaría saber qué problemas de rendimiento tiene que está probando PowerBI. ¿Es la versión de Excel de 32 bits la que te limita?
Wyn
jojo54
En respuesta a wynhopkins
Tengo ~ 3 millones de líneas de datos, por lo que Excel es extremadamente limitante. Lo estoy mirando todos los días, a lo largo de algunos años.
mussaenda
En respuesta a wynhopkins
Hola @wynhopkins,
Gracias por el cumplido. Solo usé 20 porque asumí que una persona se queda en un café como máximo 5 horas.
20 se pueden cambiar, @ jojo54. depende de su necesidad. 🙂
¡Que tenga un lindo día!