![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Unha das habilidades vitais dun experto profesional de datos é o manexo eficaz de grandes conxuntos de datos, garantindo a calidade e fiabilidade dos datos. Os datos son a peza central e fundamental de calquera sistema de datos, e calquera que sexan as boas habilidades que teña noutros aspectos do noso comercio, esta é unha que non pode permitirse pasar por alto.
Neste artigo, exploro técnicas robustas para realizar comprobacións de control de calidade en grandes conxuntos de datos mediante a biblioteca Deequ e os métodos estatísticos. Ao combinar os enfoques que explico a continuación, poderás manter a integridade dos datos, mellorar as túas prácticas de xestión de datos e evitar posibles problemas nas aplicacións posteriores.
Garantir a calidade dos datos a escala é unha tarefa desalentadora, especialmente cando se trata de miles de millóns de filas almacenadas en sistemas de ficheiros distribuídos ou almacéns de datos. A biblioteca Deequ é un marco de perfís de datos e control de calidade de código aberto construído en Spark que é unha ferramenta moderna e versátil deseñada para resolver este problema. O que o diferencia de ferramentas similares é a súa capacidade de integrarse perfectamente con Spark, aproveitando a potencia de procesamento distribuída para un manexo eficiente de conxuntos de datos a gran escala.
Cando o probes, verás como a súa flexibilidade che permite definir regras de validación complexas adaptadas aos teus requisitos específicos, garantindo unha cobertura completa. Ademais, Deequ presenta amplas métricas e capacidades de detección de anomalías que che axudarán a identificar e abordar proactivamente os problemas de calidade dos datos. Para os profesionais de datos que traballan con conxuntos de datos grandes e dinámicos, Deequ é unha solución de coitelo suízo. A ver como podemos usalo.
Podes acceder a máis detalles sobre a configuración da biblioteca Deequ e os casos de uso sobre o perfil de datos aquí . Por motivos de simplicidade, neste exemplo, só xeramos algúns rexistros de xoguetes:
val rdd = spark.sparkContext.parallelize(Seq( Item(1, "Thingy A", "awesome thing.", "high", 0), Item(2, "Thingy B", "available at http://thingb.com", null, 0), Item(3, null, null, "low", 5), Item(4, "Thingy D", "checkout https://thingd.ca", "low", 10), Item(5, "Thingy E", null, "high", 12))) val data = spark.createDataFrame(rdd)
A maioría das aplicacións de datos veñen con suposicións implícitas sobre atributos de datos, como valores non NULL e unicidade. Con Deequ, estas suposicións fanse explícitas mediante probas unitarias. Aquí tes algunhas comprobacións comúns:
Conta de filas: asegúrese de que o conxunto de datos conteña un número específico de filas.
Integridade dos atributos: comprobe que os atributos como id e productName nunca sexan NULL.
Singularidade dos atributos: asegúrese de que certos atributos, como id, sexan únicos.
Intervalo de valores: valida que atributos como priority e numViews se encuentren dentro dos intervalos esperados.
Coincidencia de patróns: verifica que as descricións conteñan URL cando se espera.
Propiedades estatísticas: asegúrese de que a mediana dos atributos numéricos cumpra criterios específicos.
Aquí é como pode implementar estas comprobacións usando Deequ:
import com.amazon.deequ.VerificationSuite import com.amazon.deequ.checks.{Check, CheckLevel, CheckStatus} val verificationResult = VerificationSuite() .onData(data) .addCheck( Check(CheckLevel.Error, "unit testing my data") .hasSize(_ == 5) // we expect 5 rows .isComplete("id") // should never be NULL .isUnique("id") // should not contain duplicates .isComplete("productName") // should never be NULL // should only contain the values "high" and "low" .isContainedIn("priority", Array("high", "low")) .isNonNegative("numViews") // should not contain negative values // at least half of the descriptions should contain a url .containsURL("description", _ >= 0.5) // half of the items should have less than 10 views .hasApproxQuantile("numViews", 0.5, _ <= 10)) .run()
Despois de executar estas comprobacións, Deequ tradúceas nunha serie de traballos de Spark, que executa para calcular as métricas dos datos. Despois, invoca as túas funcións de afirmación (por exemplo, _ == 5 para a comprobación do tamaño) nestas métricas para ver se as restricións manteñen os datos. Podemos inspeccionar o obxecto "verificationResult" para ver se a proba atopou erros:
import com.amazon.deequ.constraints.ConstraintStatus if (verificationResult.status == CheckStatus.Success) { println("The data passed the test, everything is fine!") } else { println("We found errors in the data:\n") val resultsForAllConstraints = verificationResult.checkResults .flatMap { case (_, checkResult) => checkResult.constraintResults } resultsForAllConstraints .filter { _.status != ConstraintStatus.Success } .foreach { result => println(s"${result.constraint}: ${result.message.get}") } }
Se executamos o exemplo, obtemos a seguinte saída:
We found errors in the data: CompletenessConstraint(Completeness(productName)): Value: 0.8 does not meet the requirement! PatternConstraint(containsURL(description)): Value: 0.4 does not meet the requirement!
A proba descubriu que as nosas suposicións foron violadas! Só 4 de cada 5 (80 %) dos valores do atributo productName non son nulos e só 2 de 5 (é dicir, 40 %) dos valores do atributo descrición contiñan un URL. Afortunadamente, realizamos unha proba e atopamos os erros; alguén debería arranxar inmediatamente os datos!
Aínda que Deequ ofrece un marco robusto para a validación de datos, a integración de métodos estatísticos pode mellorar aínda máis as túas comprobacións de control de calidade, especialmente se estás a tratar con métricas agregadas dun conxunto de datos. Vexamos como pode empregar métodos estatísticos para supervisar e garantir a calidade dos datos.
Considere un escenario empresarial onde un proceso ETL (Extract, Transform, Load) produce N rexistros nun traballo programado diario. Os equipos de soporte poden querer configurar comprobacións de control de calidade para emitir unha alerta se hai unha desviación significativa no reconto de rexistros. Por exemplo, se o proceso adoita xerar entre 9.500 e 10.500 rexistros diarios durante dous meses, calquera aumento ou diminución significativo pode indicar un problema cos datos subxacentes.
Podemos utilizar un método estatístico para definir este limiar sobre que proceso debe emitir unha alerta ao equipo de soporte. A continuación móstrase unha ilustración do seguimento do reconto de rexistros durante dous meses:
Para analizalo, podemos transformar os datos do reconto de rexistros para observar os cambios do día a día. Estes cambios xeralmente oscilan arredor de cero, como se mostra no seguinte gráfico:
Cando representamos esta taxa de cambio cunha distribución normal, forma unha curva de campá, o que indica que os datos se distribúen normalmente. A variación esperada rolda o 0%, cunha desviación típica do 2,63%.
Esta análise suxire que o reconto de rexistros normalmente cae dentro do intervalo de -5,26% a +5,25% cun 90% de confianza. En base a isto, pode establecer unha regra para activar unha alerta se o reconto de rexistros se desvía máis aló deste intervalo, garantindo unha intervención oportuna.
A cobertura de atributos refírese á proporción de valores non NULL co reconto total de rexistros para unha instantánea do conxunto de datos. Por exemplo, se 8 de cada 100 rexistros teñen un valor NULL para un determinado atributo, a cobertura para ese atributo é do 92%.
Revisemos outro caso de negocio cun proceso ETL que xera unha instantánea da táboa de produtos diariamente. Queremos supervisar a cobertura dos atributos de descrición do produto. Se a cobertura cae por debaixo dun determinado limiar, débese emitir unha alerta para o equipo de soporte. A continuación móstrase unha representación visual da cobertura de atributos para as descricións de produtos durante dous meses:
Ao analizar as diferenzas diarias absolutas na cobertura, observamos que os cambios oscilan arredor de cero:
Representar estes datos como unha distribución normal mostra que se distribúe normalmente cunha variación esperada de arredor do 0% e unha desviación típica do 2,45%.
Como vemos, para este conxunto de datos, a cobertura de atributos de descrición do produto normalmente varía entre -4,9 % e +4,9 % cun 90 % de confianza. En base a este indicador, podemos establecer unha regra para activar unha alerta se a cobertura se desvía máis aló deste intervalo.
Se traballas con conxuntos de datos que mostran variacións significativas debido a factores como a estacionalidade ou as tendencias, os métodos estatísticos tradicionais poden activar alertas falsas. Os algoritmos de series temporais ofrecen un enfoque máis refinado, mellorando a precisión e a fiabilidade das túas comprobacións de control de calidade.
Para producir alertas máis sensatas, pode usar calquera das opcións
Imos simular as vendas diarias que exhiben patróns de tendencia e estacionais usando Holt-Winters:
import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # Load and preprocess the dataset data = pd.read_csv('sales_data.csv', index_col='date', parse_dates=True) data = data.asfreq('D').fillna(method='ffill') # Fit the Holt-Winters model model = ExponentialSmoothing(data, trend='add', seasonal='add', seasonal_periods=365) fit = model.fit() # Forecast and detect anomalies forecast = fit.fittedvalues residuals = data - forecast threshold = 3 * residuals.std() anomalies = residuals[abs(residuals) > threshold] print("Anomalies detected:") print(anomalies)
Usando este método, pode detectar desviacións significativas que poden indicar problemas de calidade dos datos, proporcionando un enfoque máis matizado para as comprobacións de control de calidade.
Espero que este artigo che axude a implementar de forma eficiente as comprobacións de control de calidade dos teus grandes conxuntos de datos. Usando a biblioteca Deequ e integrando métodos estatísticos e algoritmos de series temporais, pode garantir a integridade e fiabilidade dos datos, mellorando as súas prácticas de xestión de datos.
A implementación das técnicas descritas anteriormente axudarache a evitar posibles problemas nas aplicacións posteriores e mellorará a calidade xeral dos teus fluxos de traballo de datos.