Gemas ocultas en NumPy: 7 funciones que todo científico de datos debe conocer

análisis de datos desde hace un año. Hasta ahora, puedo considerarme confiado en SQL y Power BI. La transición a Python ha sido bastante emocionante. He estado expuesto a algunos enfoques más claros e inteligentes para el análisis de datos.

Después de repasar mis habilidades sobre los fundamentos de Python, el siguiente paso ideal era comenzar a aprender sobre algunas de las bibliotecas de Python para el análisis de datos. NumPy es uno de ellos. Siendo un nerd de las matemáticas, naturalmente, disfrutaría explorando esta biblioteca de Python.

Esta biblioteca está diseñada para personas que desean realizar cálculos matemáticos utilizando Python, desde matemáticas básicas y álgebra hasta conceptos avanzados como cálculo. NumPy puede prácticamente hacerlo todo.

En este artículo, quería presentarles algunas funciones de NumPy con las que he estado jugando. Si eres un científico de datos, un analista financiero o un nerd de la investigación, estas funciones te ayudarán mucho. Sin más, vayamos a ello.

Conjunto de datos de muestra (utilizado en todo momento)

Antes de profundizar, definiré un pequeño conjunto de datos que anclará todos los ejemplos:

importar numpy como np temps = np.array([30, 32, 29, 35, 36, 33, 31])

Usando este pequeño conjunto de datos de temperatura, compartiré 7 funciones que facilitan las operaciones con matrices.

1. np.where()—El If-Else vectorizado

Antes de definir qué es esta función, aquí hay una muestra rápida de la función.

matriz = np.matriz([10, 15, 20, 25, 30]) índices = np.donde(arr > 20) imprimir(índices)

Salida: (matriz ([3, 4]),)

np.where es una función basada en condiciones. Cuando se especifica una condición, genera el índice/índices donde esa condición es verdadera.
Por ejemplo, en el ejemplo anterior, se especifica una matriz y he declarado una función np.where que recupera registros donde el elemento de la matriz es mayor que 20. La salida es matriz ([3, 4]), porque esa es la ubicación/índices donde esa condición es verdadera: serán 25 y 30.

Selección/reemplazo condicional

También es útil cuando intenta definir una salida personalizada para las salidas que cumplen con su condición. Esto se usa mucho en el análisis de datos. Por ejemplo:

importar numpy como np arr = np.array ([1, 2, 3, 4, 5]) resultado = np.where(arr % 2 == 0, ‘par’, ‘impar’) imprimir (resultado)

Producción: [‘odd’ ‘even’ ‘odd’ ‘even’ ‘odd’]

El ejemplo anterior intenta recuperar números pares. Después de la recuperación, se llama a una función de selección/reemplazo de condiciones que agrega un nombre personalizado a nuestras condiciones. Si la condición es verdadera, se reemplaza por par, y si la condición es falsa, se reemplaza por impar.
Muy bien, apliquemos esto a nuestro pequeño conjunto de datos.

Problema: Reemplace todas las temperaturas superiores a 35 °C por 35 (tape las lecturas extremas).

En los datos del mundo real, especialmente los de sensores, estaciones meteorológicas o entradas de usuarios, los valores atípicos son bastante comunes: picos repentinos o valores poco realistas que no son realistas.

Por ejemplo, un sensor de temperatura podría fallar momentáneamente y registrar 42 °C cuando la temperatura real era de 35 °C.

Dejar tales anomalías en sus datos puede:

Promedios sesgados: un único valor alto puede elevar la media. Visualizaciones distorsionadas: los gráficos pueden estirarse para acomodar algunos puntos extremos. Modelos engañosos: los algoritmos de aprendizaje automático son sensibles a rangos inesperados.

vamos a arreglar eso

ajustado = np.donde(temps > 35, 35, temps)

Salida: matriz ([30, 32, 29, 35, 35, 33, 31])

Se ve mucho mejor ahora. Con solo unas pocas líneas de código, logramos corregir valores atípicos poco realistas en nuestro conjunto de datos.

2. np.clip(): mantener los valores dentro del rango

En muchos conjuntos de datos prácticos, los valores pueden salirse del rango esperado, probablemente debido a ruido de medición, error del usuario o discrepancias de escala.

Por ejemplo:

Un sensor de temperatura podría indicar −10 °C cuando el mínimo posible es 0 °C. El resultado de un modelo podría predecir probabilidades como 1,03 o −0,05 debido al redondeo. Al normalizar los valores de píxeles de una imagen, algunos pueden ir más allá de 0 a 255.

Estos valores “fuera de los límites” pueden parecer menores, pero pueden:

Divida los cálculos posteriores (por ejemplo, cálculos logarítmicos o porcentuales). Provocar tramas o artefactos poco realistas (especialmente en el procesamiento de señales/imágenes). Distorsionar la normalización y hacer que las métricas no sean confiables.

np.clip() resuelve claramente este problema al restringir todos los elementos de una matriz dentro de un rango mínimo y máximo especificado. Es como establecer límites en su conjunto de datos.

Ejemplo:
Problema: asegúrese de que todas las lecturas permanezcan dentro [28, 35] rango.

recortado = np.clip(temps, 28, 35) recortado

Salida: matriz ([30, 32, 29, 35, 35, 33, 31])

Esto es lo que hace:

Cualquier valor inferior a 28 se convierte en 28. Cualquier valor superior a 35 se convierte en 35. Todo lo demás permanece igual.

Claro, esto también se podría hacer con np.where() así
tiempo = np.dónde(tiempo < 28, 28, np.dónde(tiempo > 35, 35, tiempo))
Pero prefiero usar np.clip() porque es mucho más limpio y rápido.

3. np.ptp(): encuentre el rango de sus datos en una línea

np.ptp() (pico a pico) básicamente muestra la diferencia entre los elementos máximo y mínimo.

Es básicamente:
np.ptp(a) == np.max(a) — np.min(a)

Pero en una función limpia y expresiva.

Así es como funciona

matriz = np.matriz([[1, 5, 2],
[8, 3, 7]]) # Calcular el rango pico a pico de toda la matriz range_all = np.ptp(arr) print(f”Rango pico a pico de toda la matriz: {range_all}”)

Entonces ese será nuestro valor máximo (8) – valor mínimo (1)

Salida: Rango pico a pico de todo el conjunto: 7

Entonces, ¿por qué es esto útil? Al igual que con los promedios, comprender cuánto varían sus datos suele ser igualmente importante. En los datos meteorológicos, por ejemplo, muestra cuán estables o volátiles eran las condiciones.

En lugar de llamar por separado a max() y min(), o restar manualmente. np.ptp() lo hace conciso, legible y vectorizado, especialmente útil cuando se calculan rangos en varias filas o columnas.

Ahora, apliquemos esto a nuestro conjunto de datos.

Problema: ¿Cuánto varió la temperatura esta semana?

temperaturas = np.array([30, 32, 29, 35, 36, 33, 31]) np.ptp(temperaturas)

Salida: np.int64(7)

Esto nos dice que la temperatura fluctuó 7°C durante el período, de 29°C a 36°C.

4. np.diff(): detectar cambios diarios

np.diff() es la forma más rápida de medir el impulso, el crecimiento o la disminución a lo largo del tiempo. Básicamente calcula las diferencias entre los elementos de una matriz.

Para darle una idea, si su conjunto de datos fuera un viaje, np.ptp() le indica qué tan lejos ha viajado en general, mientras que np.diff() le indica qué tan lejos se movió entre cada parada.

Esencialmente:
np.diff([a1, a2, a3, …]) = [a2 — a1, a3 — a2, …]

Apliquemos esto a nuestro conjunto de datos.

Miremos nuestros datos de temperatura nuevamente:

temperaturas = np.array([30, 32, 29, 35, 36, 33, 31]) cambio_diario = np.diff(temps) imprimir(cambio_diario)

Producción: [ 2 -3 6 1 -3 -2]

En el mundo real, np.diff() se utiliza para

Análisis de series de tiempo: realice un seguimiento de los cambios diarios en la temperatura, las ventas o los precios de las acciones. Procesamiento de señales: identifique picos o caídas repentinas en los datos del sensor. Validación de datos: detecta saltos o inconsistencias entre mediciones consecutivas.

5. np.gradient(): captura tendencias y pendientes suaves

Para ser honesto, cuando me encontré con esto por primera vez, me resultó difícil de entender. Pero esencialmente, np.gradient() calcula el gradiente numérico (una estimación suave del cambio o pendiente) a través de sus datos. Es similar a np.diff(), sin embargo, np.gradient() funciona incluso si los valores de x están espaciados de manera desigual (por ejemplo, marcas de tiempo irregulares). Proporciona una señal más fluida, lo que hace que las tendencias sean más fáciles de interpretar visualmente.

Por ejemplo:

tiempo = np.matriz ([0, 1, 2, 4, 7]) temperatura = np.matriz([30, 32, 34, 35, 36]) np.gradient(temperatura, tiempo)

Salida: matriz ([2. , 2. , 1.5 , 0.43333333, 0.33333333])

Analicemos esto un poco.

Normalmente, np.gradient() supone que los valores de x (las posiciones de su índice) están espaciados uniformemente, como 0, 1, 2, 3, 4, etc. Pero en el ejemplo anterior, la matriz de tiempo no está espaciada uniformemente: observe que los saltos son 1, 1, 2, 3. Eso significa que las lecturas de temperatura no se tomaron cada hora.

Al pasar el tiempo como segundo argumento, esencialmente le estamos diciendo a NumPy que use los intervalos de tiempo reales al calcular qué tan rápido cambia la temperatura.

Para explicar el resultado anterior. Dice que entre 0 y 2 horas, la temperatura aumentó rápidamente (aproximadamente 2 °C por hora), y entre 2 y 7 horas, el aumento se desaceleró a alrededor de 0,3 a 1 °C por hora.

Apliquemos esto a nuestro conjunto de datos.

Problema: Estime la tasa de cambio de temperatura (como la pendiente).

temperaturas = np.array([30, 32, 29, 35, 36, 33, 31]) graduación = np.gradiente(temps) np.redondo(graduación, 2)

Salida: matriz ([ 2. , -0.5, 1.5, 3.5, -1. , -2.5, -2. ])

Puedes leerlo como:

+2 → aumento rápido de la temperatura (calentamiento temprano) -0,5 → caída leve (enfriamiento menor) +1,5, +3,5 → aumento fuerte (gran salto de calor) -1, -2,5, -2 → tendencia de enfriamiento constante

Entonces esto cuenta una historia de la temperatura de la semana. Visualicemos esto muy rápido con matplotlib.

Observe lo fácil que es interpretar la visualización. Eso es lo que hace que np.gradient() sea tan útil.

6. np.percentile(): detectar valores atípicos o umbrales

Esta es una de mis funciones favoritas. np.percentile() le ayuda a recuperar fragmentos o porciones de sus datos. Numpy lo define bien.

numpy.percentile calcula el q-ésimo percentil de datos a lo largo de un eje específico, donde q es un porcentaje entre 0 y 100.

En np.percentile(), normalmente hay un umbral que cumplir (que es 100%). Luego puede retroceder y verificar el porcentaje de registros que caen por debajo de este umbral.

Probemos esto con registros de ventas.

Digamos que su objetivo de ventas mensuales es de 60.000 dólares.

Puedes usar np.percentile() para comprender con qué frecuencia y con qué fuerza estás alcanzando o fallando ese objetivo.

importar numpy como np ventas = np.array([45, 50, 52, 48, 60, 62, 58, 70, 72, 66, 63, 80]) np.percentil(ventas, [25, 50, 75, 90])

Producción: [51.0 61.0 67.5 73.0]

Para desglosar esto:

Percentil 25 = $ 51 mil → 25 % de sus meses estuvieron por debajo de ₦ 51 mil (bajo rendimiento) Percentil 50 = $ 61 mil → la mitad de sus meses estuvieron por debajo de ₦ 61 mil (alrededor de su objetivo) Percentil 75 = $ 67,5 mil → los meses de mayor rendimiento están cómodamente por encima del objetivo Percentil 90 = $ 73 mil → sus mejores meses alcanzaron ₦ 73 mil o más

Entonces ahora puedes decir:
“Alcanzamos o superamos nuestro objetivo de 60.000 dólares en aproximadamente la mitad de todos los meses”.

Esto también se puede visualizar usando una tarjeta KPI. Eso es bastante poderoso.

Eso es contar historias de KPI con datos.

Apliquemos eso a nuestro conjunto de datos de temperatura.

importar numpy como np temps = np.array([30, 32, 29, 35, 36, 33, 31]) np.percentil(temperaturas, [25, 50, 75])

Producción: [30.5 32. 34.5]

Esto es lo que significa:

El 25 % de las lecturas están por debajo de 30,5 °C. El 50 % (la mediana) está por debajo de 32 °C. El 75 % está por debajo de 34,5 °C.

7. np.unique(): encuentre rápidamente valores únicos y sus recuentos

Esta función es perfecta para limpiar, resumir o categorizar datos. np.unique() encuentra todos los elementos únicos en su matriz. También puede comprobar con qué frecuencia aparecen esos elementos en su matriz.

Por ejemplo, digamos que tienes una lista de categorías de productos de tu tienda:

importar numpy como productos np = np.array ([
‘Shoes’, ‘Bags’, ‘Bags’, ‘Hats’,
‘Shoes’, ‘Shoes’, ‘Belts’, ‘Hats’
]) np.unique(productos)

Salida: matriz ([‘Bags’, ‘Belts’, ‘Hats’, ‘Shoes’]tipo d=’

Puedes ir más allá contando el número de veces que aparecen usando la propiedad return_counts:

np.unique(productos, return_counts=True)

Salida: (matriz ([‘Bags’, ‘Belts’, ‘Hats’, ‘Shoes’]tipo d=’

Apliquemos eso a mi conjunto de datos de temperatura. Actualmente, no hay duplicados, por lo que recuperaremos la misma entrada.

importar numpy como np temps = np.array([30, 32, 29, 35, 36, 33, 31]) np.único(temporales)

Salida: matriz ([29, 30, 31, 32, 33, 35, 36])

Observe también cómo las figuras están organizadas en consecuencia: en orden ascendente.

También puedes pedirle a NumPy que cuente cuántas veces aparece cada valor:

np.unique(temperaturas, return_counts=True)

Salida: (matriz ([29, 30, 31, 32, 33, 35, 36]), matriz ([1, 1, 1, 1, 1, 1, 1]))

Concluyendo

Hasta ahora, estas son las funciones con las que me topé. Y los encuentro bastante útiles en el análisis de datos. La belleza de NumPy es que cuanto más juegas con él, más descubres estas pequeñas frases ingeniosas que reemplazan las páginas de código. Así que la próxima vez que estés discutiendo datos o depurando un conjunto de datos desordenado, mantente alejado de Pandas por un tiempo e intenta incluir una de estas funciones. ¡Gracias por leer!