Función de ventana SQL e implementación de Pandas

Reimpreso de : Función de ventana SQL e implementación de Pandas
Autor original : Notas de crecimiento de ciencia de datos


La función de ventana escrita en el frente
proporciona un método de procesamiento de datos más simple cuando se trata de requisitos complejos. Se usa ampliamente en negocios reales y también es un punto de conocimiento en el que a los entrevistadores les gusta concentrarse.

¿Qué son las funciones de ventana?

La función de ventana también se denomina OLAP (Procesamiento analítico en línea) o Función analítica (Función analítica). La ventana se refiere al cálculo del conjunto que cumple las condiciones y devuelve el resultado del análisis para cada fila de datos. El formato de la función de ventana es como sigue:

<función de ventana> OVER (partición por <nombre de columna para agrupar> orden por <nombre de columna para ordenar> cláusula_marco)

1. Funciones de ventana de uso común

1) 聚合函数:sum()、count()、max()、min()、avg()   
2) 排序函数:row_number()、rank()、dense_rank()    
3) 分布函数:percent_rank()、cume_dist()
4) 平移函数:lead()、lag()
5) 首尾函数:first_val()、last_val()

2, partición (partición por)

over中partition by类似group by对数据进行分区,此时,窗口函数会对每个分区单独进行分析,如果不指定partition by将会对整体数据进行分析。

3. Ordenar por

over中的order by对分区內的数据进行排序,默认为升序,当order by某个字段中有重复值时会对重复值进行求和,然后对所有数据进行累加。

4. Tamaño de la ventana (frame_clause)

over中的frame_clause指对分区集合指定一个移动窗口,当指定了窗口大小后函数就不会在分区上进行计算,而是基于窗口大小內的数据进行计算。窗口大小的格式如下:
filas frame_start
o
filas entre frame_start y frame_end

Entre ellos, filas representa el número de filas desplazadas. frame_start indica la posición inicial de la ventana, hay tres opciones:

  • PRECEDENTE ILIMITADO, que es el valor predeterminado, significa comenzar desde la primera fila.
  • N PRECEDENTE, significa a partir de la línea anterior, si faltan los datos de la línea anterior, será 0.
  • FILA ACTUAL significa comenzar desde la fila actual.

frame_end indica la posición final de la ventana, hay tres opciones:

  • FILA ACTUAL es el valor predeterminado, que indica el final de la fila actual.
  • N SIGUIENTE, que indica el final de la línea N después de la línea actual.
  • SIGUIENTE SIN LÍMITES, lo que indica que la ventana termina en la última línea de la partición.

La opción predeterminada en sql es: filas entre FILA PRECEDENTE SIN LÍMITES Y FILA ACTUAL , lo que indica que las estadísticas van desde la primera fila hasta la fila del registro actual.
filas entre 1 PRECEDENTE Y 1 SIGUIENTE significa que la fila actual se agrega con la fila anterior y la fila siguiente, y se usa principalmente para estadísticas de datos en los últimos N meses.
filas entre la fila actual y SIGUIENTE SIN LÍMITES significa la fila actual y todas las filas subsiguientes.

Por qué usar funciones de ventana

En los negocios reales, a menudo nos encontramos con la necesidad de realizar estadísticas adicionales sobre los resultados de los datos, como agregar una columna para el salario general de la empresa después de calcular el salario de los empleados en cada departamento, u ordenar los niveles de salario de cada departamento, calculando la proporción , etc. En este momento, si no usa la función de ventana, es posible que deba asociar la tabla varias veces. Por lo tanto, usar la función de ventana puede simplificar enormemente el código y mejorar el rendimiento de lectura y escritura del código.

Cómo usar las funciones de la ventana

En primer lugar, de acuerdo con la definición de funciones de ventana, podemos saber que las funciones de ventana se dividen principalmente en tipos como agregación, clasificación, distribución, traducción y cabeza y cola. Los escenarios de aplicación específicos para cada tipo son los siguientes:

función agregada

Las funciones de agregación también pueden actuar como funciones de ventana. A menudo necesitamos agregar estadísticas sobre los conjuntos de datos debajo de la ventana, que también es una categoría muy utilizada de funciones de ventana. Por ejemplo, necesitamos contar las ventas de cada empleado en cada departamento de la empresa A, y contar el máximo, mínimo, promedio y conteo de cada departamento.

implementación de sql

select dept, name, salary,
       sum(salary) over(partition by dept) as sum_salary, --各部门员工薪资求和
       avg(salary) over(partition by dept) as avg_salary, --各部门员工薪资求平均
       min(salary) over(partition by dept) as min_salary, --各部门员工薪资求最小
       max(salary) over(partition by dept) as max_salary  --各部门员工薪资求最大值
from data

implementación de Python

import numpy as np
import pandas as pd
company=["A","B","C"]
data=pd.DataFrame({
    "dept":[company[x] for x in np.random.randint(0,len(company),8)],
    "name":["a","b","c","d","e","f","g","h"],
    "salary":np.random.randint(10,30,8)
}
)
data['sum_salary'] = data.groupby('dept')['salary'].transform('sum')
data['min_salary'] = data.groupby('dept')['salary'].transform('min')
data['mean_salary'] = data.groupby('dept')['salary'].transform('mean')
data['max_salary'] = data.groupby('dept')['salary'].transform('max')
data

función de clasificación

Las funciones de clasificación se utilizan a menudo para clasificar conjuntos de agrupaciones o datos generales. Por ejemplo, necesitamos clasificar los salarios de los empleados en varios departamentos. Las funciones de clasificación se pueden clasificar de la siguiente manera según el método de clasificación:

1) row_number:对分组內的数据进行"同分不同级"方式排序,不存在序号并列的现象,即使同分时排序也会不同。    
2) rank:对分组內的数据进行"同分同级且不紧密"方式排序,当同分时序号相同,其它排序按正常排名进行排序,即1,2,2,4,5。    
3) dense_rank:对分组內的数据进行"同分同级且紧密"方式排序,当同分时序号相同,其它排序按下一排名进行排序,即1,2,2,3,4。

implementación de sql

select dept, name, salary,
       row_number(salary) over(partition by dept order by salary desc) as row_number, --对各部门员工薪资按同分不同级方式排序
       rank(salary) over(partition by dept order by salary desc) as rank, --对各部门员工薪资按同分同级且紧密方式方式排序
       dense_rank(salary) over(partition by dept order by salary desc) as dense_rank --对各部门员工薪资按同分同级且不紧密方式方式排序
from data

implementación de Python

import numpy as np
import pandas as pd
company=["A","B","C"]
data=pd.DataFrame({
    "dept":[company[x] for x in np.random.randint(0,len(company),8)],
    "name":["a","b","c","d","e","f","g","h"],
    "salary":np.random.randint(10,15,8)
}
)
data['row_number'] = data.groupby('dept')['salary'].rank(ascending=False,method='first') #同分不同级
data['rank'] = data.groupby('dept')['salary'].rank(ascending=False,method='min')   #"同分同级且不紧密"
data['dense_rank'] = data.groupby('dept')['salary'].rank(ascending=False,method='dense') #"同分同级且紧密"
data

Función de distribución

Las funciones de distribución se dividen principalmente en dos categorías: percent_rank() y cume_dist().
percent_rank() : se refiere a calcular el porcentaje según la clasificación, es decir, la clasificación está en el intervalo [0,1], donde el primer lugar en el intervalo es 0 y el último lugar es 1. Su fórmula específica es:

percent_rank()=(rango−1)/(filas−1) percent\_rank() = (rango - 1) / (filas - 1) \\

cume_dist() : se refiere a la relación entre el número de filas mayor o igual a la clasificación actual en el intervalo a la función total en el intervalo. Se utiliza principalmente para juzgar la proporción de usuarios cuyo salario y puntaje son más altos que el salario actual.

implementación de sql

select dept, name, salary,
       percent_rank(salary) over(partition by dept order by salary desc) as percent_rank,
       cume_dist(salary) over(partition by dept order by salary desc) as cume_dist
from data
import numpy as np
import pandas as pd
company=["A","B","C"]
data=pd.DataFrame({
    "dept":[company[x] for x in np.random.randint(0,len(company),8)],
    "name":["a","b","c","d","e","f","g","h"],
    "salary":np.random.randint(10,15,8)
}
)
# data.groupby('dept')['salary'].rank(ascending=False,method='first',pct=True)
data['percent_rank'] = (data.groupby('dept')['salary'].rank(ascending=False,method='min')-1) / \
                            (data.groupby('dept')['salary'].transform('count')-1)  #如果分组只有一个记录则数据为na 
data['cume_dist'] = data.groupby('dept')['salary'].rank(ascending=False,method='first',pct=True)  #可以结合排序函数的方法使用
data

función de traducción

Las funciones de distribución se dividen principalmente en dos categorías: adelanto (nombre de columna, n) y atraso (nombre de columna, n).
lead (nombre de columna, n) : obtener n filas de datos desplazados hacia abajo en la partición.
lag(nombre de columna, n) : Obtenga n filas de datos desplazados hacia arriba en la partición.

implementación de sql

select dept, name, salary,
lead(salary,1) over(partition by dept order by salary desc ) as lead,
lag(salary,1) over(partition by dept order by salary desc) as lag
from data
import numpy as np
import pandas as pd
company=["A","B","C"]
data=pd.DataFrame({
    "dept":[company[x] for x in np.random.randint(0,len(company),8)],
    "name":["a","b","c","d","e","f","g","h"],
    "salary":np.random.randint(10,30,8)
}
)
data['lead'] = data.sort_values(['dept','salary'],ascending=False).groupby('dept')['salary'].shift(-1) # 分区內向下平移一个单位
data['lag'] = data.sort_values(['dept','salary'],ascending=False).groupby('dept')['salary'].shift(1)  # 分区內向上平移一个单位
data

Primera y última función

Las funciones de distribución se dividen principalmente en dos categorías: first_val() y last_val().
first_val() : Obtiene la primera fila de datos en la partición.
last_val() : Obtiene la última fila de datos en la partición.

implementación de sql

select dept, name, salary,
first_val(salary) over(partition by dept order by salary desc ) as first_val,
# 由于窗口函数默认的是第一行至当前行,所以在使用last_val()函数时,会出现分区内最后一行和当前行大小一致的情况,因此我们需要将分区偏移量改为第一行至最后一行。
last_val(salary) over(partition by dept order by salary desc rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) as last_val
from data

implementación de Python

import numpy as np
import pandas as pd
company=[“A”,“B”,“C”]
data=pd.DataFrame({
“dept”:[company[x] for x in np.random.randint(0,len(company),8)],
“name”:[“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”],
“salary”:np.random.randint(10,30,8)
}
)
data[‘first_val’] = data.groupby(‘dept’)[‘salary’].transform(‘min’)
data[‘last_val’] = data.groupby(‘dept’)[‘salary’].transform(‘max’)
data

Preguntas y respuestas

P1: La diferencia entre funciones agregadas y funciones de ventana

Diferencia : las funciones de agregación agregan múltiples piezas de datos en una fila de datos, mientras que las funciones de ventana devuelven un resultado para cada fila de datos.
Conexión : se trata de analizar un conjunto de datos, y las funciones de ventana pueden usar funciones de agregación como funciones.
Cuando necesitamos realizar estadísticas adicionales sobre los resultados de los datos, a menudo necesitamos usar funciones de ventana.

P2: orden de ejecución de SQL

El orden de escritura de SQL es SELECT, FROM, JOIN, ON, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, y el orden de ejecución se muestra en la siguiente figura:

Aquí debemos enfatizar el orden de ejecución de sql, porque en la mayoría de los casos no necesitamos pensar demasiado en el orden de ejecución de sql, sino porque el orden de ejecución de las funciones de ventana se ubica después de la mayoría de los campos y solo antes del campo ORDEN POR, es bastante Se basa en el funcionamiento de la función de ventana ejecutada sobre la base de ejecutar la tabla temporal generada por todos los campos, por ejemplo:

De la figura anterior, podemos ver que cuando la segunda imagen no tiene GROUP BY y la tercera imagen tiene GROUP BY, el número de filas de los datos finales cambia de 7 registros a 3, porque la función de ventana se ejecuta en función del GROUP Campo BY Los cálculos se basan en la tabla temporal, por lo que podemos entender fácilmente los resultados finales después de conocer el orden de ejecución del SQL.

Supongo que te gusta

Origin blog.csdn.net/qq_42374697/article/details/127091388
Recomendado
Clasificación