Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — RELATEDTABLE
RELATEDTABLE() Ejemplo:
CantPedidos = COUNTROWS(RELATEDTABLE(Pedidos))Devuelve la tabla relacionada filtrada por el contexto actual (lado muchos). Útil en columnas calculadas para contar filas relacionadas.
🐍 Python del día — collections.Counter
from collections import Counter
Counter(iterable)Ejemplo:
from collections import Counter
texto = 'abracadabra'
c = Counter(texto)
print(c.most_common(3)) # [('a',5),('b',2),('r',2)]Cuenta elementos de cualquier iterable. Soporta operaciones aritméticas entre contadores y el método most_common(n).
🗄️ SQL del día — RANK() / DENSE_RANK()
RANK() OVER (ORDER BY col DESC)
DENSE_RANK() OVER (ORDER BY col DESC)Ejemplo:
SELECT nombre, puntaje,
RANK() OVER (ORDER BY puntaje DESC) AS rank_con_huecos,
DENSE_RANK() OVER (ORDER BY puntaje DESC) AS rank_continuo
FROM jugadores;RANK() deja huecos ante empates (1,1,3). DENSE_RANK() no los deja (1,1,2). Elige según si los huecos tienen sentido en tu contexto de negocio.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — RELATED
RELATED() Ejemplo:
Categoría = RELATED(Productos[Categoría])Trae un valor de una tabla relacionada (lado 1 de la relación). Solo funciona en columnas calculadas, no en medidas.
🐍 Python del día — f-strings avanzados
f'{valor:formato}' / f'{valor!r}' / f'{valor = }'Ejemplo:
pi = 3.14159
print(f'{pi:.2f}') # 3.14
print(f'{pi = }') # pi = 3.14159
print(f'{"hola"!r}') # 'hola'Los f-strings admiten formato numérico, repr (!r), str (!s) y el modo debug (variable = ) que muestra nombre y valor (Python 3.8+).
🗄️ SQL del día — ROW_NUMBER()
ROW_NUMBER() OVER (PARTITION BY col ORDER BY col)Ejemplo:
SELECT nombre, ventas,
ROW_NUMBER() OVER (PARTITION BY region ORDER BY ventas DESC) AS ranking
FROM vendedores;Asigna un número único y consecutivo por fila dentro de cada partición. A diferencia de RANK, no deja huecos ante empates. Ideal para obtener el top 1 por grupo.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — ALLEXCEPT
ALLEXCEPT(, , ) Ejemplo:
CALCULATE(SUM(Ventas[Monto]), ALLEXCEPT(Ventas, Ventas[Vendedor]))Elimina todos los filtros de la tabla excepto los de las columnas indicadas. Útil para mantener un contexto parcial.
🐍 Python del día — Walrus operator :=
variable := expresiónEjemplo:
import re
if m := re.search(r'\d+', texto):
print('Número encontrado:', m.group())Asigna y evalúa en la misma expresión (Python 3.8+). Evita calcular un valor dos veces en condiciones o while loops.
🗄️ SQL del día — Alias de columna en ORDER BY
SELECT expresión AS alias
FROM tabla
ORDER BY alias; -- o por número de columnaEjemplo:
SELECT region, SUM(monto) AS total_ventas
FROM ventas
GROUP BY region
ORDER BY total_ventas DESC
LIMIT 5;En la mayoría de los motores puedes ordenar por el alias definido en SELECT (o por número de posición). No puedes usar el alias en WHERE o HAVING, solo en ORDER BY.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — ALL
ALL() Ejemplo:
% Total = DIVIDE(SUM(Ventas[Monto]), CALCULATE(SUM(Ventas[Monto]), ALL(Ventas)))Elimina todos los filtros de una tabla o columna. Clave para calcular porcentajes sobre el total global.
🐍 Python del día — zip()
for a, b in zip(lista1, lista2):Ejemplo:
nombres = ['Ana', 'Luis']
notas = [90, 85]
for n, nota in zip(nombres, notas):
print(f'{n}: {nota}')Itera dos o más iterables en paralelo. Se detiene en el más corto. Usa zip_longest de itertools si necesitas el más largo.
🗄️ SQL del día — HAVING vs WHERE
SELECT col, AGG(col)
FROM tabla
WHERE condición_filas
GROUP BY col
HAVING condición_sobre_agregado;Ejemplo:
SELECT region, COUNT(*) AS clientes
FROM clientes
WHERE activo = 1 -- filtra antes de agrupar
GROUP BY region
HAVING COUNT(*) > 50; -- filtra después de agruparWHERE filtra filas individuales antes de la agregación. HAVING filtra grupos después de la agregación. Nunca uses HAVING para condiciones que no involucren funciones de agregación.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — FILTER
FILTER(, ) Ejemplo:
CALCULATE(SUM(Ventas[Monto]), FILTER(Ventas, Ventas[Monto] > 1000))Devuelve una tabla filtrada. Se usa dentro de CALCULATE u otras funciones iteradoras para aplicar condiciones complejas.
🐍 Python del día — enumerate()
for índice, valor in enumerate(iterable, start=0):Ejemplo:
frutas = ['manzana', 'pera', 'uva']
for i, f in enumerate(frutas, 1):
print(i, f)Evita usar range(len(...)). Devuelve índice y valor simultáneamente. El parámetro start define el valor inicial del índice.
🗄️ SQL del día — FULL OUTER JOIN
FROM tabla1
FULL OUTER JOIN tabla2 ON condiciónEjemplo:
SELECT COALESCE(a.mes, b.mes) AS mes,
a.ventas, b.objetivo
FROM ventas_reales a
FULL OUTER JOIN objetivos b ON a.mes = b.mes;Devuelve todas las filas de ambas tablas, con NULL donde no hay coincidencia. Útil para comparar dos conjuntos y encontrar lo que existe en uno pero no en el otro.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — SUMX
SUMX(, ) Ejemplo:
Total = SUMX(Ventas, Ventas[Cantidad] * Ventas[PrecioUnit])Itera fila por fila en una tabla y acumula el resultado. Ideal cuando el cálculo necesita operar columna a columna antes de sumar.
🐍 Python del día — Dict comprehension
{clave: valor for item in iterable if condición}Ejemplo:
cuadrados = {x: x**2 for x in range(1, 6)}
# {1:1, 2:4, 3:9, 4:16, 5:25}Construye diccionarios de forma concisa. Ideal para transformar listas en mapas clave-valor.
🗄️ SQL del día — Subconsulta correlacionada
SELECT col FROM tabla_ext
WHERE col operador (
SELECT AGG(col) FROM tabla_int
WHERE tabla_int.clave = tabla_ext.clave
);Ejemplo:
-- Empleados que ganan más que el promedio de su departamento
SELECT nombre, salario, depto
FROM empleados e1
WHERE salario > (
SELECT AVG(salario) FROM empleados e2
WHERE e2.depto = e1.depto
);Subconsulta que referencia la tabla externa. Se ejecuta una vez por fila — puede ser lenta en tablas grandes. Considera reemplazarla por JOIN con CTE cuando el rendimiento importa.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — CALCULATE
CALCULATE(, , ) Ejemplo:
Ventas_USA = CALCULATE(SUM(Ventas[Monto]), Clientes[País] = "USA")La función más poderosa de DAX. Evalúa una expresión modificando el contexto de filtro activo. Casi toda medida compleja la usa.
🐍 Python del día — List comprehension
[expresión for item in iterable if condición]Ejemplo:
pares = [x**2 for x in range(20) if x % 2 == 0]Crea listas en una sola línea. Más rápido y legible que un for + append. La condición al final es opcional.
🗄️ SQL del día — JSON_VALUE / JSON_QUERY
JSON_VALUE(columna_json, '$.clave')
JSON_QUERY(columna_json, '$.objeto')Ejemplo:
-- SQL Server
SELECT JSON_VALUE(payload, '$.nombre') AS nombre,
JSON_VALUE(payload, '$.edad') AS edad
FROM eventos
WHERE JSON_VALUE(payload, '$.tipo') = 'registro';JSON_VALUE extrae un valor escalar del JSON. JSON_QUERY extrae un objeto o array. Permiten consultar columnas de tipo JSON/NVARCHAR con formato JSON sin deserializar en la app.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — KEEPFILTERS
KEEPFILTERS() Ejemplo:
CALCULATE([TotalVentas], KEEPFILTERS(Productos[Categoría] = "Electrónica"))Aplica un filtro adicional sin reemplazar el filtro existente en la misma columna. Combina el filtro del visual con el de la medida.
🐍 Python del día — zip() para transponer matrices
transpuesta = list(zip(*matriz))Ejemplo:
matriz = [[1,2,3],[4,5,6],[7,8,9]]
transpuesta = list(zip(*matriz))
# [(1,4,7), (2,5,8), (3,6,9)]El operador * desempaqueta la lista de listas y zip las entrelaza columna a columna. Truco clásico para transponer sin NumPy en matrices pequeñas.
🗄️ SQL del día — Índices — cuándo y para qué
CREATE INDEX idx_nombre ON tabla (columna);
CREATE INDEX idx_comp ON tabla (col1, col2);Ejemplo:
-- Índice compuesto: el orden importa
-- (region, fecha) acelera filtros por region o region+fecha,
-- pero NO filtros solo por fecha
CREATE INDEX idx_ventas_reg_fecha ON ventas (region, fecha);Un índice acelera SELECT a costa de INSERT/UPDATE/DELETE más lentos. Crear en columnas usadas en WHERE, JOIN ON y ORDER BY. El orden en índices compuestos es crucial.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — EARLIER
EARLIER(, [número]) Ejemplo:
RankVentas = COUNTROWS(FILTER(Ventas, Ventas[Monto] > EARLIER(Ventas[Monto]))) + 1Accede al valor de la columna en un contexto de fila externo. Usado en columnas calculadas con iteraciones anidadas; VAR suele ser preferible.
🐍 Python del día — __slots__
class MiClase:
__slots__ = ('attr1', 'attr2')Ejemplo:
class Punto:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
# Reduce uso de memoria hasta 50% en clases con muchas instanciasReemplaza el __dict__ de instancia por un array fijo. Reduce consumo de memoria y acelera el acceso a atributos. Impide agregar atributos no declarados.
🗄️ SQL del día — EXPLAIN / EXPLAIN ANALYZE
EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...; -- PostgreSQL: ejecuta y mideEjemplo:
EXPLAIN ANALYZE
SELECT * FROM ventas v
JOIN clientes c ON v.id_cliente = c.id
WHERE v.fecha >= '2026-01-01';Muestra el plan de ejecución de la query. Identifica table scans costosos, joins ineficientes y columnas que necesitan índice. El primer paso al optimizar una consulta lenta.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — USERELATIONSHIP
USERELATIONSHIP(, ) Ejemplo:
Ventas x FechaEnvío = CALCULATE([TotalVentas], USERELATIONSHIP(Ventas[FechaEnvío], Calendario[Fecha]))Activa una relación inactiva temporalmente dentro de CALCULATE. Esencial cuando el modelo tiene múltiples relaciones entre tablas.
🐍 Python del día — operator.itemgetter / attrgetter
from operator import itemgetter, attrgetterEjemplo:
from operator import itemgetter
datos = [{'nombre':'Ana','nota':90}, {'nombre':'Luis','nota':85}]
ordena = sorted(datos, key=itemgetter('nota'), reverse=True)Alternativa más rápida a lambda para extraer claves o atributos. itemgetter funciona con dicts y tuplas; attrgetter con objetos. Más eficiente que lambda en ordenamientos masivos.
🗄️ SQL del día — GROUP BY con ROLLUP
GROUP BY ROLLUP(col1, col2, ...)Ejemplo:
SELECT region, producto, SUM(ventas)
FROM ventas
GROUP BY ROLLUP(region, producto);
-- Incluye subtotales por región y total generalGenera subtotales automáticos para cada nivel de agrupación, más un total general. CUBE genera todas las combinaciones posibles. GROUPING() identifica las filas de totales.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — VAR ... RETURN
VAR =
RETURN Ejemplo:
Margen = VAR Venta = SUM(Ventas[Monto])
VAR Costo = SUM(Costos[Monto])
RETURN DIVIDE(Venta - Costo, Venta)Guarda resultados intermedios en variables. Hace las medidas más legibles, evita recalcular expresiones y facilita el debug.
🐍 Python del día — typing — Type hints
def f(param: Tipo) -> RetornoTipo:Ejemplo:
from typing import Optional
def buscar(nombre: str, activo: bool = True) -> Optional[dict]:
...Anotaciones de tipo que mejoran la legibilidad y permiten análisis estático con mypy. No afectan la ejecución. Desde Python 3.10+ usa int | None en vez de Optional[int].
🗄️ SQL del día — GENERATE_SERIES
GENERATE_SERIES(inicio, fin, paso) -- PostgreSQL / BigQueryEjemplo:
-- Calendario de fechas del mes
SELECT fecha::date
FROM GENERATE_SERIES('2026-04-01', '2026-04-30', INTERVAL '1 day') AS t(fecha);Genera una serie de números o fechas. Fundamental para crear tablas de calendario dinámicas o rellenar huecos en series de tiempo. En SQL Server usar un CTE recursivo.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — LOOKUPVALUE
LOOKUPVALUE(, , , ...) Ejemplo:
Precio = LOOKUPVALUE(Precios[Valor], Precios[Código], Productos[Código])Busca un valor en una tabla sin necesidad de una relación formal. El equivalente al BUSCARV de Excel en DAX.
🐍 Python del día — Operador de desempaquetado **dict
{**dict1, **dict2, clave: valor}Ejemplo:
base = {'host': 'localhost', 'port': 5432}
extra = {'db': 'ventas'}
combinado = {**base, **extra, 'timeout': 30}
# {'host':'localhost','port':5432,'db':'ventas','timeout':30}Fusiona diccionarios en una sola expresión (Python 3.9+ también admite d1 | d2). Las claves duplicadas se resuelven de izquierda a derecha.
🗄️ SQL del día — MERGE (UPSERT)
MERGE INTO destino AS d
USING origen AS o ON condición
WHEN MATCHED THEN UPDATE ...
WHEN NOT MATCHED THEN INSERT ...;Ejemplo:
MERGE INTO clientes AS d
USING nuevos_clientes AS o ON d.id = o.id
WHEN MATCHED THEN
UPDATE SET d.nombre = o.nombre
WHEN NOT MATCHED THEN
INSERT (id, nombre) VALUES (o.id, o.nombre);Combina INSERT y UPDATE en una sola operación atómica. Ideal para sincronizar tablas o cargar datos incrementales. Disponible en SQL Server, Oracle, DB2.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — CONCATENATEX
CONCATENATEX(, , [delimitador], [ordenar_por], [orden]) Ejemplo:
Productos = CONCATENATEX(VALUES(Ventas[Producto]), Ventas[Producto], ", ")Une los valores de una expresión iterando una tabla. Permite construir listas de texto dinámicas dentro de una medida.
🐍 Python del día — dict.get() y dict.setdefault()
d.get(clave, valor_default)
d.setdefault(clave, valor_default)Ejemplo:
config = {'host': 'localhost'}
puerto = config.get('port', 8080) # 8080
lista = config.setdefault('tags', []) # crea la clave si no existeget() retorna un default sin lanzar KeyError. setdefault() además inserta el default en el dict si la clave no existía — útil para inicializar listas o dicts anidados.
🗄️ SQL del día — UNPIVOT (SQL Server)
SELECT * FROM tabla
UNPIVOT (
valor FOR columna IN (col1, col2, col3)
) AS u;Ejemplo:
SELECT vendedor, mes, ventas
FROM resumen
UNPIVOT (
ventas FOR mes IN (Ene, Feb, Mar)
) AS u;Operación inversa al PIVOT: transforma columnas en filas. Útil para normalizar tablas anchas antes de análisis. En otros motores usar UNION ALL por columna.
Inteligencia Artificial
Ciencia de Datos
Power BI
💡 DAX del día — MAXX / MINX
MAXX(, ) Ejemplo:
VentaMax = MAXX(Ventas, Ventas[Cantidad] * Ventas[PrecioUnit])Itera una tabla y devuelve el valor máximo (o mínimo con MINX) de la expresión. Útil para el mayor ticket o la venta mínima calculada.
🐍 Python del día — collections.namedtuple
from collections import namedtuple
Tipo = namedtuple('Tipo', ['campo1', 'campo2'])Ejemplo:
from collections import namedtuple
Punto = namedtuple('Punto', ['x', 'y'])
p = Punto(3, 4)
print(p.x, p.y) # 3 4
print(p._asdict()) # {'x':3, 'y':4}Tupla con campos nombrados. Inmutable, ligera y con acceso por nombre. Ideal como alternativa simple a dataclass cuando no se necesitan métodos.
🗄️ SQL del día — PIVOT (SQL Server)
SELECT * FROM tabla
PIVOT (
AGG(valor) FOR columna IN ([v1],[v2],[v3])
) AS p;Ejemplo:
SELECT * FROM (
SELECT vendedor, mes, ventas FROM datos
) src
PIVOT (
SUM(ventas) FOR mes IN ([Ene],[Feb],[Mar])
) AS pvt;Transforma filas en columnas. Requiere conocer los valores de antemano. En PostgreSQL usar crosstab (tablefunc). En otros motores emular con CASE WHEN + GROUP BY.
Final Fantasy XIV
Power BI
Inteligencia Artificial
Ciencia de Datos
💡 DAX del día — AVERAGEX
AVERAGEX(, ) Ejemplo:
TicketProm = AVERAGEX(Ventas, Ventas[Cantidad] * Ventas[PrecioUnit])Calcula el promedio iterando fila por fila. Útil cuando el promedio debe calcularse sobre una expresión, no una columna directa.
🐍 Python del día — match / case (Python 3.10+)
match variable:
case patrón1: ...
case patrón2: ...
case _: ...Ejemplo:
def clasificar(figura):
match figura:
case {'tipo': 'círculo', 'radio': r}:
return 3.14 * r**2
case {'tipo': 'cuadrado', 'lado': l}:
return l**2
case _:
return 0Pattern matching estructural. Más potente que un if/elif: puede hacer destructuring de dicts, listas y dataclasses en los patrones.
🗄️ SQL del día — CAST / TRY_CAST
CAST(expresión AS tipo)
TRY_CAST(expresión AS tipo) -- SQL Server / SnowflakeEjemplo:
SELECT CAST('2026-04-26' AS DATE) AS fecha,
TRY_CAST(comentario AS INT) AS numero_o_null
FROM registros;CAST convierte el tipo y lanza error si falla. TRY_CAST devuelve NULL en vez de error, ideal para datos sucios. En MySQL usar CONVERT(expr, tipo).
Final Fantasy XIV
Power BI
Inteligencia Artificial
Ciencia de Datos
💡 DAX del día — COUNTROWS
COUNTROWS() Ejemplo:
NroPedidos = COUNTROWS(Pedidos)Cuenta las filas de una tabla. Más eficiente que COUNT o COUNTA para contar registros, especialmente dentro de CALCULATE.
🐍 Python del día — Exception chaining
raise NuevaExcepción('msg') from excepción_originalEjemplo:
try:
datos = int(input_usuario)
except ValueError as e:
raise TypeError('Se esperaba un número entero') from eEncadena excepciones preservando el traceback original. Use 'from None' para suprimir el contexto original cuando no es relevante.
🗄️ SQL del día — DATEDIFF / DATE_DIFF
DATEDIFF(parte, fecha_inicio, fecha_fin) -- SQL Server
DATE_DIFF(fecha_fin, fecha_inicio, parte) -- BigQueryEjemplo:
SELECT nombre,
DATEDIFF(day, fecha_registro, GETDATE()) AS dias_como_cliente
FROM clientes;Calcula la diferencia entre dos fechas en la unidad indicada (day, month, year, hour). La sintaxis varía por motor; verifica si el resultado es fecha_fin − fecha_inicio.
Final Fantasy XIV
Power BI
Inteligencia Artificial
Ciencia de Datos
💡 DAX del día — DISTINCT
DISTINCT() Ejemplo:
ClientesUnicos = COUNTROWS(DISTINCT(Ventas[IDCliente]))Similar a VALUES pero excluye la fila BLANK. Preferida para conteos de elementos únicos cuando los blanks no son relevantes.
🐍 Python del día — property decorator
@property
def atributo(self): ...
@atributo.setter
def atributo(self, valor): ...Ejemplo:
class Temperatura:
def __init__(self, celsius):
self._c = celsius
@property
def fahrenheit(self):
return self._c * 9/5 + 32
t = Temperatura(100)
print(t.fahrenheit) # 212.0Convierte métodos en atributos calculados. Permite agregar lógica de validación en setters manteniendo la interfaz de acceso simple.
🗄️ SQL del día — DATE_TRUNC / DATETRUNC
DATE_TRUNC('parte', fecha) -- PostgreSQL
DATETRUNC('parte', fecha) -- SQL Server 2022+Ejemplo:
-- Ventas mensuales
SELECT DATE_TRUNC('month', fecha) AS mes,
SUM(monto) AS total
FROM ventas
GROUP BY 1
ORDER BY 1;Trunca una fecha al inicio del período indicado (month, quarter, year, week, day). La forma más directa de agrupar por período sin convertir a string.