Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Te lo digo por experiencia personal qué fue útil, dónde y cuándo. Es una descripción general y una tesis, para que quede claro qué y dónde se puede profundizar más, pero aquí tengo una experiencia personal exclusivamente subjetiva, tal vez todo sea completamente diferente para usted.

¿Por qué es importante conocer y poder utilizar lenguajes de consulta? En esencia, la ciencia de datos tiene varias etapas de trabajo importantes, y la primera y más importante (sin ella, ¡ciertamente nada funcionará!) es la obtención o extracción de datos. La mayoría de las veces, los datos se encuentran en algún lugar de alguna forma y es necesario “recuperarlos” desde allí. 

¡Los lenguajes de consulta le permiten extraer estos mismos datos! Y hoy les contaré sobre esos lenguajes de consulta que me han sido útiles y les diré y les mostraré dónde y cómo exactamente, por qué es necesario estudiar.

Habrá tres bloques principales de tipos de consultas de datos, que analizaremos en este artículo:

  • Los lenguajes de consulta "estándar" son lo que comúnmente se entiende cuando se habla de un lenguaje de consulta, como el álgebra relacional o SQL.
  • Lenguajes de consulta de secuencias de comandos: por ejemplo, Python cosas pandas, numpy o secuencias de comandos de shell.
  • Lenguajes de consulta para gráficos de conocimiento y bases de datos de gráficos.

Todo lo escrito aquí es solo una experiencia personal, lo que fue útil, con una descripción de las situaciones y "por qué fue necesario". Todos pueden probar cómo pueden surgir situaciones similares y tratar de prepararse para ellas con anticipación entendiendo estos idiomas. ​antes de tener que presentar una solicitud (con urgencia) en un proyecto o incluso llegar a un proyecto donde se necesitan.

Lenguajes de consulta "estándar"

Los lenguajes de consulta estándar lo son precisamente en el sentido en que solemos pensar en ellos cuando hablamos de consultas.

Álgebra relacional

¿Por qué es necesaria el álgebra relacional hoy? Para comprender bien por qué los lenguajes de consulta están estructurados de cierta manera y usarlos conscientemente, es necesario comprender el núcleo subyacente.

¿Qué es el álgebra relacional?

La definición formal es la siguiente: el álgebra relacional es un sistema cerrado de operaciones sobre relaciones en un modelo de datos relacional. Para decirlo un poco más humanamente, se trata de un sistema de operaciones sobre tablas de modo que el resultado es siempre una tabla.

Ver todas las operaciones relacionales en este Artículo de Habr: aquí describimos por qué necesita saberlo y dónde resulta útil.

¿Por qué?

Comenzar a comprender de qué se tratan los lenguajes de consulta y qué operaciones hay detrás de las expresiones en lenguajes de consulta específicos a menudo brinda una comprensión más profunda de qué funciona en los lenguajes de consulta y cómo.

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Tomado de este artículos. Un ejemplo de operación: join, que une tablas.

Materiales para el estudio:

Buen curso introductorio de Stanford.. En general, hay muchos materiales sobre teoría y álgebra relacional: Coursera, Udacity. También hay una gran cantidad de material en línea, incluidos buenos cursos academicos. Mi consejo personal: es necesario comprender muy bien el álgebra relacional; esta es la base de lo básico.

SQL

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Tomado de este artículos

SQL es esencialmente una implementación del álgebra relacional; con una advertencia importante, ¡SQL es declarativo! Es decir, cuando escribe una consulta en el lenguaje del álgebra relacional, en realidad dice cómo calcular, pero con SQL especifica lo que desea extraer, y luego el DBMS ya genera expresiones (efectivas) en el lenguaje del álgebra relacional (su La equivalencia la conocemos como teorema de codd).

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Tomado de este artículos

¿Por qué?

DBMS relacionales: Oracle, Postgres, SQL Server, etc. todavía están prácticamente en todas partes y existe una probabilidad increíblemente alta de que tengas que interactuar con ellos, lo que significa que tendrás que leer SQL (lo cual es muy probable) o escribirlo ( tampoco es improbable).

Que leer y estudiar

Según los mismos enlaces anteriores (sobre álgebra relacional), hay una cantidad increíble de material, por ejemplo, este.

Por cierto, ¿qué es NoSQL?

"Vale la pena enfatizar una vez más que el término "NoSQL" tiene un origen absolutamente espontáneo y no tiene una definición generalmente aceptada ni una institución científica detrás". Correspondiente artículo en Habr.

De hecho, la gente se dio cuenta de que no se necesita un modelo relacional completo para resolver muchos problemas, especialmente para aquellos donde, por ejemplo, el rendimiento es crítico y dominan ciertas consultas simples con agregación, donde es crítico calcular rápidamente métricas y escribirlas en el La base de datos, y la mayoría de las funciones son relacionales, resultaron no solo innecesarias, sino también dañinas. ¿Por qué normalizar algo si arruinará lo más importante para nosotros (para alguna tarea específica): la productividad?

Además, a menudo se necesitan esquemas flexibles en lugar de los esquemas matemáticos fijos del modelo relacional clásico, y esto simplifica increíblemente el desarrollo de aplicaciones cuando es crítico implementar el sistema y comenzar a trabajar rápidamente, procesando los resultados, o el esquema y los tipos de datos almacenados. no son tan importantes.

Por ejemplo, estamos creando un sistema experto y queremos almacenar información en un dominio específico junto con cierta metainformación; es posible que no conozcamos todos los campos y simplemente almacenemos JSON para cada registro; esto nos brinda un entorno muy flexible para expandir los datos. modelo e iteración rápida, por lo que en este caso, NoSQL será aún preferible y más legible. Entrada de ejemplo (de uno de mis proyectos donde NoSQL estaba justo donde se necesitaba).

{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775,"Джонни Кэш","ru"],
"en_wiki_pagecount":2338861}

Puedes leer mas aquí sobre NoSQL.

¿Qué estudiar?

Aquí, más bien, sólo necesita analizar a fondo su tarea, qué propiedades tiene y qué sistemas NoSQL están disponibles que se ajusten a esta descripción, y luego comenzar a estudiar este sistema.

Lenguajes de consulta de secuencias de comandos

Al principio, parece que Python tiene que ver con esto en general: es un lenguaje de programación y no se trata de consultas en absoluto.

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

  • Pandas es literalmente una navaja suiza de la ciencia de datos; en él se produce una gran cantidad de transformación, agregación, etc.
  • Numpy: cálculos vectoriales, matrices y álgebra lineal allí.
  • Scipy: hay muchas matemáticas en este paquete, especialmente estadísticas.
  • Laboratorio Jupyter: una gran cantidad de análisis de datos exploratorios se adaptan bien a las computadoras portátiles; es útil saberlo.
  • Solicitudes: trabajar con la red.
  • Pyspark es muy popular entre los ingenieros de datos, lo más probable es que tengas que interactuar con este o Spark, simplemente debido a su popularidad.
  • *Selenio: muy útil para recopilar datos de sitios y recursos; a veces simplemente no hay otra forma de obtener los datos.

Mi principal consejo: ¡aprende Python!

pandas

Tomemos el siguiente código como ejemplo:

import pandas as pd
df = pd.read_csv(“data/dataset.csv”)
# Calculate and rename aggregations
all_together = (df[df[‘trip_type’] == “return”]
    .groupby(['start_station_name','end_station_name'])
                  	    .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})
                           .rename(columns={'size': 'num_trips', 
           'mean': 'avg_duration_seconds',    
           'amin': min_duration_seconds', 
           ‘amax': 'max_duration_seconds'}))

Básicamente, vemos que el código encaja en el patrón SQL clásico.

SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name

Pero lo importante es que este código es parte del script y del pipeline; de ​​hecho, estamos incorporando consultas al pipeline de Python. En esta situación, el lenguaje de consulta nos llega desde bibliotecas como Pandas o pySpark.

En general, en pySpark vemos un tipo similar de transformación de datos a través de un lenguaje de consulta con el espíritu de:

df.filter(df.trip_type = “return”)
  .groupby(“day”)
  .agg({duration: 'mean'})
  .sort()

Donde y que leer

Sobre Python en general no hay problema encontrar materiales para estudiar. Hay una gran cantidad de tutoriales en línea. Los pandas, pychispa y cursos de Spark (y también por sí mismo DS). En general, el contenido aquí es excelente para buscar en Google, y si tuviera que elegir un paquete en el que centrarme, serían los pandas, por supuesto. En cuanto a la combinación de materiales DS+Python también mucho.

Shell como lenguaje de consulta

Muchos proyectos de análisis y procesamiento de datos con los que he trabajado son, de hecho, scripts de shell que llaman a código en Python, Java y los propios comandos de shell. Por lo tanto, en general, puede considerar las canalizaciones en bash/zsh/etc como algún tipo de consulta de alto nivel (puede, por supuesto, incluir bucles allí, pero esto no es típico del código DS en lenguajes shell), demos un ejemplo simple: necesitaba hacer un mapeo QID de wikidata y enlaces completos a los wikis en ruso e inglés, para esto escribí una solicitud simple desde los comandos en bash y para el resultado escribí un script simple en Python, que juntos así:

pv “data/latest-all.json.gz” | 
unpigz -c  | 
jq --stream $JQ_QUERY | 
python3 scripts/post_process.py "output.csv"

donde

JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' 

De hecho, este fue el proceso completo que creó el mapeo requerido; como vemos, todo funcionó en modo flujo:

  • pv filepath: proporciona una barra de progreso basada en el tamaño del archivo y pasa su contenido hacia adelante
  • unpigz -c leyó parte del archivo y se lo dio a jq
  • jq con la clave - stream inmediatamente produjo el resultado y lo pasó al posprocesador (igual que en el primer ejemplo) en Python
  • Internamente, el postprocesador era una máquina de estado simple que formateaba la salida. 

En total, un pipeline complejo que funciona en modo flujo sobre datos de gran tamaño (0.5 TB), sin recursos significativos y formado a partir de un pipeline simple y un par de herramientas.

Otro consejo importante: poder trabajar bien y eficazmente en la terminal y escribir bash/zsh/etc.

¿Dónde será útil? Sí, en casi todas partes; nuevamente, hay MUCHOS materiales para estudiar en Internet. En particular, aquí este mi artículo anterior.

secuencias de comandos R

Una vez más, el lector puede exclamar: bueno, ¡este es todo un lenguaje de programación! Y, por supuesto, tendrá razón. Sin embargo, normalmente encontré R en un contexto tal que, de hecho, era muy similar a un lenguaje de consulta.

R es un entorno de computación estadística y un lenguaje para computación y visualización estáticas (según esta).

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Tomado por lo tanto. Por cierto lo recomiendo, buen material.

¿Por qué un científico de datos necesita conocer R? Al menos, porque hay una gran capa de personas ajenas a TI que analizan datos en R. Lo encontré en los siguientes lugares:

  • Sector farmacéutico.
  • Biólogos.
  • Sector financiero.
  • Personas con una formación puramente matemática que se ocupan de las estadísticas.
  • Modelos estadísticos especializados y modelos de aprendizaje automático (que a menudo solo se pueden encontrar en la versión del autor como paquete R).

¿Por qué es en realidad un lenguaje de consulta? En la forma en que se encuentra a menudo, en realidad es una solicitud para crear un modelo, incluida la lectura de datos y la corrección de los parámetros de la consulta (modelo), así como la visualización de datos en paquetes como ggplot2; esta también es una forma de escribir consultas. .

Consultas de ejemplo para visualización

ggplot(data = beav, 
       aes(x = id, y = temp, 
           group = activ, color = activ)) +
  geom_line() + 
  geom_point() +
  scale_color_manual(values = c("red", "blue"))

En general, muchas ideas de R han migrado a paquetes de Python como pandas, numpy o scipy, como marcos de datos y vectorización de datos, por lo que, en general, muchas cosas en R le resultarán familiares y convenientes.

Hay muchas fuentes para estudiar, por ejemplo, este.

Gráficos de conocimiento

Aquí tengo una experiencia un poco inusual, porque a menudo tengo que trabajar con gráficos de conocimiento y lenguajes de consulta de gráficos. Por lo tanto, repasemos brevemente lo básico, ya que esta parte es un poco más exótica.

En las bases de datos relacionales clásicas tenemos un esquema fijo, pero aquí el esquema es flexible, cada predicado es en realidad una “columna” y aún más.

Imagina que estás modelando a una persona y quieres describir cosas clave; por ejemplo, tomemos una persona específica, Douglas Adams, y usemos esta descripción como base.

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
www.wikidata.org/wiki/Q42

Si usáramos una base de datos relacional, tendríamos que crear una tabla o tablas enormes con una gran cantidad de columnas, la mayoría de las cuales serían NULL o estarían llenas con algún valor Falso predeterminado, por ejemplo, es poco probable que muchos de nosotros tengamos una entrada en la biblioteca nacional coreana; por supuesto, podríamos ponerlos en tablas separadas, pero esto en última instancia sería un intento de modelar un circuito lógico flexible con predicados usando uno relacional fijo.

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Imaginemos que todos los datos se almacenan como un gráfico o como expresiones booleanas binarias y unarias.

¿Dónde puedes encontrar esto? En primer lugar, trabajar con wiki de datosy con cualquier base de datos de gráficos o datos conectados.

Los siguientes son los principales lenguajes de consulta que he usado y con los que he trabajado.

SPARQL

wiki:
ESPARQL (acrónimo recursivo de Ing. Protocolo SPARQL y lenguaje de consulta RDF) - lenguaje de consulta de datos, representado por el modelo RDFy protocolo transmitir estas solicitudes y responder a ellas. SPARQL es una recomendación Consorcio W3C y una de las tecnologías web semántica.

Pero en realidad es un lenguaje de consulta para predicados lógicos unarios y binarios. Simplemente estás especificando condicionalmente qué está fijo en una expresión booleana y qué no (muy simplificado).

La propia base RDF (Resource Description Framework), sobre la que se ejecutan las consultas SPARQL, es una triple object, predicate, subject - y la consulta selecciona los tripletes requeridos de acuerdo con las restricciones especificadas en el espíritu: encuentre una X tal que p_55(X, q_33) sea verdadera - donde, por supuesto, p_55 es algún tipo de relación con ID 55, y q_33 es una objeto con ID 33 (aquí y la historia completa, nuevamente omitiendo todo tipo de detalles).

Ejemplo de presentación de datos:

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos
Imágenes y ejemplos con países aquí. por lo tanto.

Ejemplo de consulta básica

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

De hecho, queremos encontrar el valor de la variable ?país tal que para el predicado
member_of, es cierto que member_of(?country,q458) y q458 es el ID de la Unión Europea.

Un ejemplo de una consulta SPARQL real dentro del motor Python:

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

Por lo general, he tenido que leer SPARQL en lugar de escribirlo; en esa situación, probablemente sería una habilidad útil comprender el lenguaje al menos en un nivel básico para comprender exactamente cómo se recuperan los datos. 

Hay mucho material para estudiar online: por ejemplo, aquí este и este. Normalmente busco en Google diseños y ejemplos específicos y eso es suficiente por ahora.

Lenguajes de consulta lógica

Puedes leer más sobre el tema en mi artículo. aquí. Y aquí solo examinaremos brevemente por qué los lenguajes lógicos son adecuados para escribir consultas. Esencialmente, RDF es sólo un conjunto de declaraciones lógicas de la forma p(X) y h(X,Y), y una consulta lógica tiene la siguiente forma:

output(X) :- country(X), member_of(X,“EU”).

Aquí estamos hablando de crear un nuevo predicado salida/1 (/1 significa unario), siempre que para X sea cierto que país(X) - es decir, X es un país y también miembro_de(X,"UE ").

Es decir, en este caso tanto los datos como las reglas se presentan de la misma forma, lo que nos permite modelar problemas muy fácil y bien.

¿Dónde os conocisteis en la industria?: un proyecto completamente grande con una empresa que escribe consultas en dicho lenguaje, así como sobre el proyecto actual en el núcleo del sistema; parecería que esto es algo bastante exótico, pero a veces sucede.

Un ejemplo de un fragmento de código en un lenguaje lógico que procesa wikidata:

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

Materiales: Aquí daré un par de enlaces al lenguaje de programación lógico moderno Programación de conjuntos de respuestas. Recomiendo estudiarlo:

Notas del científico de datos: una revisión personalizada de los lenguajes de consulta de datos

Fuente: habr.com

Añadir un comentario