ProHoster > Blog > administração > Notas do cientista de dados: uma revisão personalizada das linguagens de consulta de dados
Notas do cientista de dados: uma revisão personalizada das linguagens de consulta de dados
Estou lhe contando por experiência própria o que foi útil onde e quando. É uma visão geral e uma tese, para que fique claro o que e onde você pode se aprofundar mais - mas aqui tenho uma experiência pessoal exclusivamente subjetiva, talvez tudo seja completamente diferente para você.
Por que é importante conhecer e ser capaz de usar linguagens de consulta? Em sua essência, Data Science possui várias etapas importantes de trabalho, e a primeira e mais importante (sem ela, certamente nada funcionará!) é a obtenção ou extração de dados. Na maioria das vezes, os dados estão armazenados em algum lugar de alguma forma e precisam ser “recuperados” de lá.
As linguagens de consulta permitem extrair esses mesmos dados! E hoje vou falar sobre essas linguagens de consulta que foram úteis para mim e vou te contar e mostrar onde e como exatamente - por que é necessário estudar.
Haverá três blocos principais de tipos de consulta de dados, que discutiremos neste artigo:
Linguagens de consulta "padrão" são o que comumente se entende quando se fala em uma linguagem de consulta, como álgebra relacional ou SQL.
Linguagens de consulta de script: por exemplo, coisas Python pandas, numpy ou scripts de shell.
Linguagens de consulta para gráficos de conhecimento e bancos de dados gráficos.
Tudo o que está escrito aqui é apenas uma experiência pessoal, o que foi útil, com uma descrição das situações e “por que foi necessário” - todos podem experimentar como situações semelhantes podem surgir em seu caminho e tentar se preparar para elas com antecedência, entendendo essas linguagens antes que você precise se inscrever (urgentemente) em um projeto ou até mesmo chegar a um projeto onde eles são necessários.
Linguagens de consulta "padrão"
As linguagens de consulta padrão são exatamente no sentido em que normalmente pensamos nelas quando falamos sobre consultas.
Álgebra relacional
Por que a álgebra relacional é necessária hoje? Para entender bem por que as linguagens de consulta são estruturadas de uma determinada maneira e usá-las de forma consciente, você precisa entender o núcleo subjacente a elas.
O que é álgebra relacional?
A definição formal é a seguinte: a álgebra relacional é um sistema fechado de operações sobre relações em um modelo de dados relacional. Para ser um pouco mais humano, este é um sistema de operações em tabelas de forma que o resultado seja sempre uma tabela.
Veja todas as operações relacionais em este artigo de Habr - aqui descrevemos por que você precisa saber e onde isso é útil.
Por quê?
Começar a entender o que são as linguagens de consulta e quais operações estão por trás das expressões em linguagens de consulta específicas geralmente fornece uma compreensão mais profunda do que funciona nas linguagens de consulta e como.
Tirado de este artigos. Um exemplo de operação: join, que une tabelas.
Materiais para estudo:
Bom curso introdutório de Stanford. Em geral, existem muitos materiais sobre álgebra e teoria relacional - Coursera, Udacity. Há também uma enorme quantidade de material online, incluindo bons cursos acadêmicos. Meu conselho pessoal: você precisa entender muito bem a álgebra relacional - essa é a base do básico.
SQL é essencialmente uma implementação de álgebra relacional - com uma ressalva importante, SQL é declarativo! Ou seja, ao escrever uma consulta na linguagem da álgebra relacional, você na verdade diz como calcular - mas com o SQL você especifica o que deseja extrair, e aí o SGBD já gera expressões (efetivas) na linguagem da álgebra relacional (suas equivalência é conhecida por nós como Teorema de Codd).
SGBDs relacionais: Oracle, Postgres, SQL Server, etc ainda estão praticamente em todos os lugares e há uma chance incrivelmente alta de você ter que interagir com eles, o que significa que você terá que ler SQL (o que é muito provável) ou escrevê-lo ( também não é improvável).
O que ler e estudar
De acordo com os mesmos links acima (sobre álgebra relacional), existe uma quantidade incrível de material, por exemplo, este.
A propósito, o que é NoSQL?
“Vale ressaltar mais uma vez que o termo “NoSQL” tem origem absolutamente espontânea e não possui nenhuma definição geralmente aceita ou instituição científica por trás dele.” Correspondente artigo em Habr.
Na verdade, as pessoas perceberam que um modelo relacional completo não é necessário para resolver muitos problemas, especialmente para aqueles onde, por exemplo, o desempenho é crítico e certas consultas simples com agregação dominam - onde é crítico calcular rapidamente as métricas e escrevê-las no banco de dados, e a maioria dos recursos relacionais acabaram sendo não apenas desnecessários, mas também prejudiciais - por que normalizar algo se isso vai estragar o que é mais importante para nós (para alguma tarefa específica) - a produtividade?
Além disso, muitas vezes são necessários esquemas flexíveis em vez dos esquemas matemáticos fixos do modelo relacional clássico - e isso simplifica incrivelmente o desenvolvimento de aplicativos quando é crítico implantar o sistema e começar a trabalhar rapidamente, processando os resultados - ou o esquema e os tipos de dados armazenados não são tão importantes.
Por exemplo, estamos criando um sistema especialista e queremos armazenar informações sobre um domínio específico junto com algumas meta informações - podemos não conhecer todos os campos e simplesmente armazenar JSON para cada registro - isso nos dá um ambiente muito flexível para expandir os dados modelo e iteração rápida - portanto, neste caso, o NoSQL será ainda preferível e mais legível. Entrada de exemplo (de um dos meus projetos onde o NoSQL estava exatamente onde era necessário).
Aqui, em vez disso, você só precisa analisar minuciosamente sua tarefa, quais propriedades ela possui e quais sistemas NoSQL estão disponíveis que se enquadrariam nessa descrição - e então começar a estudar esse sistema.
Linguagens de consulta de script
A princípio, parece que o que o Python tem a ver com isso em geral é uma linguagem de programação, e não uma questão de consultas.
O Pandas é literalmente um canivete suíço da ciência de dados: nele ocorre uma enorme quantidade de transformação, agregação de dados, etc.
Numpy - cálculos vetoriais, matrizes e álgebra linear.
Scipy – há muita matemática neste pacote, especialmente estatísticas.
Laboratório Jupyter - muitas análises exploratórias de dados cabem bem em laptops - é útil saber.
Solicitações - trabalhando com a rede.
O Pyspark é muito popular entre os engenheiros de dados, provavelmente você terá que interagir com ele ou com o Spark, simplesmente devido à sua popularidade.
*Selenium – muito útil para coletar dados de sites e recursos, às vezes simplesmente não há outra maneira de obter os dados.
Essencialmente, vemos que o código se enquadra no padrão SQL clássico.
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
Mas a parte importante é que esse código faz parte do script e do pipeline; na verdade, estamos incorporando consultas no pipeline do Python. Nessa situação, a linguagem de consulta vem de bibliotecas como Pandas ou pySpark.
Em geral, no pySpark vemos um tipo semelhante de transformação de dados por meio de uma linguagem de consulta no espírito de:
No próprio Python em geral sem problema encontre materiais para estudar. Há um grande número de tutoriais online pandas, pySpark e cursos sobre Faísca (e também por si só DS). No geral, o conteúdo aqui é ótimo para pesquisar no Google, e se eu tivesse que escolher um pacote para focar, seria o pandas, é claro. Em relação à combinação de materiais DS+Python também muito.
Shell como linguagem de consulta
Vários projetos de processamento e análise de dados com os quais trabalhei são, na verdade, scripts shell que chamam código em Python, Java e os próprios comandos shell. Portanto, em geral, você pode considerar pipelines em bash/zsh/etc como algum tipo de consulta de alto nível (você pode, é claro, colocar loops lá, mas isso não é típico para código DS em linguagens shell), vamos dar um exemplo simples - eu precisava fazer um mapeamento QID de wikidata e links completos para wikis em russo e inglês, para isso escrevi uma solicitação simples de comandos no bash e para a saída escrevi um script simples em Python, que eu juntos assim:
JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")'
Este foi, na verdade, todo o pipeline que criou o mapeamento necessário; como vemos, tudo funcionou em modo de fluxo:
pv filepath - fornece uma barra de progresso com base no tamanho do arquivo e passa seu conteúdo adiante
unpigz -c leu parte do arquivo e entregou para jq
jq com a chave - stream produziu imediatamente o resultado e o passou para o pós-processador (o mesmo que no primeiro exemplo) em Python
internamente, o pós-processador era uma máquina de estado simples que formatava a saída
No total, um pipeline complexo trabalhando em modo de fluxo em grandes volumes de dados (0.5 TB), sem recursos significativos e feito a partir de um pipeline simples e algumas ferramentas.
Outra dica importante: ser capaz de trabalhar bem e efetivamente no terminal e escrever bash/zsh/etc.
Onde será útil? Sim, em quase todos os lugares - novamente, há MUITOS materiais para estudar na Internet. Em particular, aqui isso meu artigo anterior.
Script R
Novamente, o leitor pode exclamar - bem, esta é uma linguagem de programação completa! E claro, ele estará certo. No entanto, geralmente encontrei R em um contexto que, na verdade, era muito semelhante a uma linguagem de consulta.
R é um ambiente de computação estatística e uma linguagem para computação estática e visualização (de acordo com este).
Por que um cientista de dados precisa conhecer R? Pelo menos porque há uma enorme camada de pessoas que não são de TI que analisam dados em R. Encontrei isso nos seguintes locais:
Setor farmacêutico.
Biólogos.
Setor financeiro.
Pessoas com formação puramente matemática que lidam com estatísticas.
Modelos estatísticos especializados e modelos de aprendizado de máquina (que muitas vezes só podem ser encontrados na versão do autor como um pacote R).
Por que é realmente uma linguagem de consulta? Na forma como é frequentemente encontrado, é na verdade uma solicitação para criar um modelo, incluindo leitura de dados e correção de parâmetros de consulta (modelo), bem como visualização de dados em pacotes como ggplot2 - esta também é uma forma de escrever consultas .
Consultas de exemplo para visualização
ggplot(data = beav,
aes(x = id, y = temp,
group = activ, color = activ)) +
geom_line() +
geom_point() +
scale_color_manual(values = c("red", "blue"))
Em geral, muitas ideias do R migraram para pacotes python como pandas, numpy ou scipy, como dataframes e vetorização de dados - então, em geral, muitas coisas no R parecerão familiares e convenientes para você.
Existem muitas fontes para estudar, por exemplo, este.
Gráficos de conhecimento
Aqui tenho uma experiência um pouco incomum, porque muitas vezes tenho que trabalhar com gráficos de conhecimento e linguagens de consulta para gráficos. Portanto, vamos repassar brevemente o básico, já que esta parte é um pouco mais exótica.
Nos bancos de dados relacionais clássicos temos um esquema fixo, mas aqui o esquema é flexível, cada predicado é na verdade uma “coluna” e ainda mais.
Imagine que você estava modelando uma pessoa e queria descrever coisas importantes, por exemplo, vamos pegar uma pessoa específica, Douglas Adams, e usar essa descrição como base.
Se utilizássemos um banco de dados relacional, teríamos que criar uma tabela ou tabelas enormes com um grande número de colunas, a maioria das quais seriam NULL ou preenchidas com algum valor padrão False, por exemplo, é improvável que muitos de nós tenhamos um banco de dados relacional. entrada na biblioteca nacional coreana - é claro, poderíamos colocá-los em tabelas separadas, mas isso seria, em última análise, uma tentativa de modelar um circuito lógico flexível com predicados usando um relacional fixo.
Então imagine que todos os dados são armazenados como um gráfico ou como expressões booleanas binárias e unárias.
Onde você pode encontrar isso? Em primeiro lugar, trabalhar com wiki de dados, e com quaisquer bancos de dados gráficos ou dados conectados.
A seguir estão as principais linguagens de consulta que usei e com as quais trabalhei.
Mas, na realidade, é uma linguagem de consulta para predicados lógicos unários e binários. Você está simplesmente especificando condicionalmente o que é fixo em uma expressão booleana e o que não é (muito simplificado).
A própria base RDF (Resource Description Framework), sobre a qual as consultas SPARQL são executadas, é um triplo object, predicate, subject - e a consulta seleciona os triplos necessários de acordo com as restrições especificadas no espírito: encontre um X tal que p_55(X, q_33) seja verdadeiro - onde, é claro, p_55 é algum tipo de relação com ID 55, e q_33 é um objeto com ID 33 (aqui e toda a história, novamente omitindo todos os tipos de detalhes).
Na verdade, queremos encontrar o valor da variável ?country tal que para o predicado
member_of, é verdade que member_of(?country,q458) e q458 é o ID da União Europeia.
Um exemplo de consulta SPARQL real dentro do mecanismo python:
Normalmente, tive que ler SPARQL em vez de escrevê-lo - nessa situação, provavelmente seria uma habilidade útil entender a linguagem pelo menos em um nível básico para entender exatamente como os dados são recuperados.
Há muito material para estudar online: por exemplo, aqui este и este. Normalmente procuro no Google designs e exemplos específicos e isso é o suficiente por enquanto.
Linguagens de consulta lógica
Você pode ler mais sobre o assunto em meu artigo aqui. E aqui examinaremos apenas brevemente por que as linguagens lógicas são adequadas para escrever consultas. Essencialmente, RDF é apenas um conjunto de instruções lógicas na forma p(X) e h(X,Y), e uma consulta lógica tem a seguinte forma:
output(X) :- country(X), member_of(X,“EU”).
Aqui estamos falando sobre a criação de um novo predicado output/1 (/1 significa unário), desde que para X seja verdade que country(X) - ou seja, X é um país e também member_of(X,"EU ").
Ou seja, neste caso, tanto os dados como as regras são apresentados da mesma forma, o que nos permite modelar problemas com muita facilidade e bem.
Onde você se conheceu na indústria?: todo um grande projeto com uma empresa que escreve consultas nessa linguagem, bem como no projeto atual no núcleo do sistema - parece que isso é algo bastante exótico, mas às vezes acontece.
Um exemplo de fragmento de código em uma linguagem lógica que processa wikidata:
Materiais: Darei aqui alguns links para a moderna linguagem de programação lógica Answer Set Programming - recomendo estudá-la: