Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
Size kişisel deneyimlerime dayanarak neyin nerede ve ne zaman yararlı olduğunu söylüyorum. Bu bir genel bakış ve tezdir, böylece neyi ve nerede daha fazla kazabileceğiniz açıktır - ancak burada tamamen öznel kişisel deneyimim var, belki sizin için her şey tamamen farklıdır.

Sorgu dillerini bilmek ve kullanabilmek neden önemlidir? Veri Biliminin özünde birkaç önemli çalışma aşaması vardır ve ilk ve en önemlisi (onsuz kesinlikle hiçbir şey işe yaramaz!) veri elde etmek veya çıkarmaktır. Çoğu zaman veriler bir şekilde bir yerde duruyor ve oradan "geri alınması" gerekiyor. 

Sorgu dilleri bu verileri çıkarmanıza olanak tanır! Ve bugün size benim için yararlı olan sorgu dillerinden bahsedeceğim ve size tam olarak nerede ve nasıl - neden çalışmanın gerekli olduğunu anlatacağım ve göstereceğim.

Bu makalede ele alacağımız üç ana veri sorgu türü bloğu olacaktır:

  • "Standart" sorgu dilleri, ilişkisel cebir veya SQL gibi bir sorgu dili hakkında konuşurken yaygın olarak anlaşılan dillerdir.
  • Komut dosyası oluşturma sorgu dilleri: örneğin, Python şeyler pandaları, numpy veya kabuk komut dosyası oluşturma.
  • Bilgi grafikleri ve grafik veritabanları için sorgulama dilleri.

Burada yazılan her şey sadece kişisel bir deneyimdir, yararlı olan, durumların açıklaması ve "neden gerekli olduğu" ile birlikte - herkes benzer durumların karşınıza nasıl çıkabileceğini deneyebilir ve bu dilleri anlayarak bunlara önceden hazırlanmaya çalışabilir. ​Bir projeye (acilen) başvurmanız veya hatta ihtiyaç duyulan bir projeye gitmeniz gerekmeden önce.

"Standart" sorgu dilleri

Standart sorgu dilleri tam olarak sorgulardan bahsederken genellikle düşündüğümüz anlamdadır.

İlişkisel cebir

Günümüzde ilişkisel cebire neden ihtiyaç duyulmaktadır? Sorgu dillerinin neden belli bir şekilde yapılandırıldığını iyi anlamak ve bilinçli kullanmak için bunların altında yatan özü anlamanız gerekir.

İlişkisel cebir nedir?

Resmi tanım şu şekildedir: ilişkisel cebir, ilişkisel bir veri modelindeki ilişkiler üzerinde yapılan kapalı bir işlemler sistemidir. Biraz daha insani bir dille ifade edersek bu, tablolar üzerinde yapılan ve sonucu her zaman tablo olacak şekilde yapılan bir işlem sistemidir.

Tüm ilişkisel işlemleri görün bu Habr'dan makale - burada neden bilmeniz gerektiğini ve bunun nerede işe yarayacağını açıklıyoruz.

Neden?

Sorgu dillerinin neyle ilgili olduğunu ve belirli sorgu dillerindeki ifadelerin arkasında hangi işlemlerin bulunduğunu anlamaya başlamak, genellikle sorgu dillerinde nelerin ve nasıl çalıştığının daha derinlemesine anlaşılmasını sağlar.

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
-Den alınan bu nesne. Bir işlem örneği: tabloları birleştiren birleştirme.

Çalışma malzemeleri:

Stanford'dan iyi bir giriş kursu. Genel olarak ilişkisel cebir ve teori üzerine pek çok materyal var - Coursera, Udacity. Ayrıca internette çok sayıda materyal mevcut, bunlar arasında iyi olanlar da var. akademik kurslar. Kişisel tavsiyem: ilişkisel cebiri çok iyi anlamalısınız - temellerin temeli budur.

SQL

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
-Den alınan bu makale.

SQL aslında ilişkisel cebirin bir uygulamasıdır - önemli bir uyarı ile SQL bildirimseldir! Yani, ilişkisel cebir dilinde bir sorgu yazarken aslında nasıl hesaplanacağını söylersiniz - ancak SQL ile neyi çıkarmak istediğinizi belirtirsiniz ve ardından DBMS zaten ilişkisel cebir dilinde (etkili) ifadeler üretir (onların denklik bizim tarafımızdan bilinmektedir Codd teoremi).

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
-Den alınan bu makale.

Neden?

İlişkisel DBMS'ler: Oracle, Postgres, SQL Server, vb. hala neredeyse her yerdedir ve onlarla etkileşime geçmek zorunda kalma olasılığınız inanılmaz derecede yüksektir, bu da ya SQL okumanız (ki bu çok muhtemeldir) ya da yazmanız gerektiği anlamına gelir ( pek olası da değil).

Ne okunmalı ve çalışılmalı

Yukarıdaki aynı bağlantılara göre (ilişkisel cebir hakkında), inanılmaz miktarda malzeme var, örneğin, bu.

Bu arada NoSQL nedir?

“NoSQL teriminin tamamen spontane bir kökene sahip olduğunu ve arkasında genel kabul görmüş bir tanım ya da bilimsel kurumun bulunmadığını bir kez daha vurgulamakta fayda var.” karşılık gelen makale Habr'da.

Aslında, insanlar pek çok sorunu çözmek için tam bir ilişkisel modele ihtiyaç duyulmadığını fark etti; özellikle de örneğin performansın kritik olduğu ve toplamalı bazı basit sorguların hakim olduğu durumlarda - metrikleri hızlı bir şekilde hesaplamanın ve bunları bilgisayara yazmanın kritik olduğu durumlarda - veritabanı ve çoğu özelliğin ilişkisel olduğu ortaya çıktı, sadece gereksiz değil, aynı zamanda zararlı da olduğu ortaya çıktı - eğer bizim için en önemli şeyi (bazı belirli bir görev için) - üretkenliği bozacaksa neden bir şeyi normalleştirelim ki?

Ayrıca, klasik ilişkisel modelin sabit matematiksel şemaları yerine genellikle esnek şemalara ihtiyaç duyulur ve bu, sistemi konuşlandırmanın ve hızlı bir şekilde çalışmaya başlamanın, sonuçların veya şema ve depolanan veri türlerinin işlenmesinin kritik olduğu durumlarda uygulama geliştirmeyi inanılmaz derecede basitleştirir. o kadar önemli değil.

Örneğin, bir uzman sistem oluşturuyoruz ve bilgileri bazı meta bilgilerle birlikte belirli bir alanda depolamak istiyoruz - tüm alanları bilemeyebiliriz ve her kayıt için yalnızca JSON'u saklayabiliriz - bu bize verileri genişletmek için çok esnek bir ortam sağlar model ve hızlı bir şekilde yineleniyor - yani bu durumda NoSQL daha da tercih edilebilir ve daha okunabilir olacaktır. Örnek giriş (NoSQL'in tam ihtiyaç duyulan yerde olduğu projelerimden birinden).

{"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}

Daha fazla okuyabilirsiniz burada NoSQL hakkında.

Ne çalışmalı?

Burada, görevinizi, hangi özelliklere sahip olduğunu ve bu tanıma uyan hangi NoSQL sistemlerinin mevcut olduğunu kapsamlı bir şekilde analiz etmeniz ve ardından bu sistemi incelemeye başlamanız yeterlidir.

Komut Dosyası Sorgulama Dilleri

İlk bakışta Python'un genel olarak bununla ne ilgisi var gibi görünüyor - bu bir programlama dili ve sorgularla ilgili değil.

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

  • Pandalar tam anlamıyla Veri Biliminin İsviçre Çakısı'dır; içinde büyük miktarda veri dönüşümü, toplama vb. gerçekleşir.
  • Numpy - vektör hesaplamaları, matrisler ve doğrusal cebir var.
  • Scipy - Bu pakette çok fazla matematik var, özellikle istatistikler.
  • Jupyter laboratuvarı - birçok keşifsel veri analizi dizüstü bilgisayarlara çok iyi uyuyor - bilmek faydalı.
  • İstekler - ağ ile çalışma.
  • Pyspark, veri mühendisleri arasında çok popülerdir, büyük olasılıkla popülerlikleri nedeniyle bununla veya Spark ile etkileşime girmeniz gerekecektir.
  • *Selenyum - sitelerden ve kaynaklardan veri toplamak için çok faydalıdır, bazen verileri almanın başka yolu yoktur.

Temel tavsiyem: Python'u öğrenin!

Pandalar

Örnek olarak aşağıdaki kodu ele alalım:

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'}))

Temel olarak kodun klasik SQL kalıbına uyduğunu görüyoruz.

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

Ancak önemli olan kısım, bu kodun betiğin ve işlem hattının bir parçası olmasıdır; aslında biz sorguları Python işlem hattına yerleştiriyoruz. Bu durumda sorgu dili bize Pandas veya pySpark gibi kütüphanelerden geliyor.

Genel olarak, pySpark'ta aşağıdakilerin ruhuna uygun olarak bir sorgu dili aracılığıyla benzer türde bir veri dönüşümü görüyoruz:

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

Nerede ve ne okunmalı

Genel olarak Python'un kendisi hakkında bir sorun değil çalışacak materyaller bulun. Çevrimiçi olarak çok sayıda eğitim var pandalar, pykıvılcım ve kurslar Kıvılcım (ve ayrıca kendi başına DS). Genel olarak, buradaki içerik Google'da gezinmek için harika ve eğer odaklanmak için bir paket seçmem gerekse bu elbette pandalar olurdu. DS+Python malzemelerinin kombinasyonuyla ilgili olarak da çok fazla.

Sorgu dili olarak kabuk

Birlikte çalıştığım pek çok veri işleme ve analiz projesi aslında Python'da, Java'da ve kabuk komutlarının kendisinde kod çağıran kabuk komut dosyalarıdır. Bu nedenle, genel olarak bash/zsh/etc'deki işlem hatlarını bir tür üst düzey sorgu olarak düşünebilirsiniz (tabii ki döngüleri burada doldurabilirsiniz, ancak bu, kabuk dillerindeki DS kodu için tipik değildir), hadi şunu verelim: basit bir örnek - Wiki verilerinin QID eşlemesini ve Rusça ve İngilizce wiki'lere tam bağlantıları yapmam gerekiyordu, bunun için bash'taki komutlardan basit bir istek yazdım ve çıktı için Python'da basit bir komut dosyası yazdım. şu şekilde bir araya getirin:

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

nerede

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

Bu aslında gerekli eşlemeyi oluşturan boru hattının tamamıydı; gördüğümüz gibi her şey akış modunda çalışıyordu:

  • pv dosya yolu - dosya boyutuna göre bir ilerleme çubuğu verir ve içeriğini iletir
  • unpigz -c arşivin bir kısmını okudu ve jq'ye verdi
  • key -stream komutuyla jq hemen sonucu üretti ve bunu Python'daki son işlemciye (ilk örnekte olduğu gibi) aktardı
  • dahili olarak son işlemci, çıktıyı biçimlendiren basit bir durum makinesiydi 

Toplamda, büyük veriler (0.5 TB) üzerinde akış modunda çalışan, önemli kaynaklara ihtiyaç duymayan ve basit bir işlem hattı ve birkaç araçtan oluşan karmaşık bir işlem hattı.

Bir diğer önemli ipucu: Terminalde iyi ve etkili bir şekilde çalışabilmek ve bash/zsh/etc yazabilmek.

Nerede faydalı olacak? Evet, hemen hemen her yerde - yine internette çalışılacak bir sürü materyal var. Özellikle burada bu önceki makalem.

R komut dosyası oluşturma

Okuyucu yine şunu haykırabilir: Bu tam bir programlama dilidir! Ve elbette haklı olacak. Ancak R ile genellikle öyle bir bağlamda karşılaştım ki aslında bir sorgulama diline çok benziyordu.

R, statik hesaplama ve görselleştirmeye yönelik istatistiksel bir hesaplama ortamı ve dilidir (göre bu).

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
Kurtarılan bundan dolayı. Bu arada tavsiye ederim, iyi malzeme.

Bir veri bilimcinin neden R'yi bilmesi gerekiyor? En azından R'de verileri analiz eden BT dışı kişilerden oluşan çok büyük bir katman olduğu için, aşağıdaki yerlerde bununla karşılaştım:

  • İlaç sektörü.
  • Biyologlar.
  • Finans sektörü.
  • İstatistiklerle uğraşan, tamamen matematik eğitimi almış insanlar.
  • Özel istatistiksel modeller ve makine öğrenimi modelleri (bunlar genellikle yalnızca yazarın sürümünde bir R paketi olarak bulunabilir).

Neden aslında bir sorgulama dili? Sıklıkla bulunduğu formda, aslında veri okuma ve sorgu (model) parametrelerini düzeltmenin yanı sıra ggplot2 gibi paketlerdeki verileri görselleştirmeyi içeren bir model oluşturma isteğidir - bu aynı zamanda bir sorgu yazma biçimidir .

Görselleştirme için örnek sorgular

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

Genel olarak, R'deki pek çok fikir, veri çerçeveleri ve veri vektörleştirme gibi pandalar, numpy veya scipy gibi python paketlerine taşınmıştır - dolayısıyla genel olarak R'deki pek çok şey size tanıdık ve kullanışlı görünecektir.

İncelenecek birçok kaynak var, örneğin, bu.

Bilgi grafikleri

Burada biraz alışılmadık bir deneyimim var çünkü sıklıkla bilgi grafikleri ve grafikler için sorgulama dilleri ile çalışmak zorunda kalıyorum. Bu nedenle bu kısım biraz daha egzotik olduğundan kısaca temel konulara geçelim.

Klasik ilişkisel veritabanlarında sabit bir şemamız var ama burada şema esnek, her yüklem aslında bir “sütun” ve hatta daha fazlası.

Bir kişiyi modellediğinizi ve önemli şeyleri tanımlamak istediğinizi hayal edin; örneğin, belirli bir kişiyi, Douglas Adams'ı ele alalım ve bu tanımlamayı temel olarak kullanalım.

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
www.wikidata.org/wiki/Q42

İlişkisel bir veritabanı kullansaydık, büyük bir tablo veya çok sayıda sütuna sahip tablolar oluşturmamız gerekirdi; bunların çoğu NULL olurdu veya bazı varsayılan False değerleri ile doldurulurdu; örneğin, çoğumuzun bu tabloya sahip olması pek olası değildir. Kore ulusal kütüphanesine giriş - tabii ki bunları ayrı tablolara koyabiliriz, ancak bu sonuçta sabit bir ilişkisel devre kullanarak yüklemlerle esnek bir mantıksal devre modelleme girişimi olacaktır.

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
Tüm verilerin bir grafik veya ikili ve tekli boole ifadeleri olarak depolandığını hayal edin.

Bununla nerede karşılaşabilirsin? Öncelikle birlikte çalışmak veri wiki'sive herhangi bir grafik veritabanları veya bağlı verilerle.

Kullandığım ve çalıştığım ana sorgulama dilleri aşağıdadır.

SPARQL

wiki:
SPARQL (özyinelemeli kısaltma itibaren Müh. SPARQL Protokolü ve RDF Sorgu Dili) - veri sorgulama dilimodel tarafından temsil edilen RDFVe protokol Bu istekleri iletmek ve onlara yanıt vermek. SPARQL bir öneridir W3C Konsorsiyumu ve teknolojilerden biri anlamsal ağ.

Ancak gerçekte mantıksal tekli ve ikili yüklemler için bir sorgulama dilidir. Basitçe, bir Boolean ifadesinde neyin sabit olduğunu ve neyin sabit olmadığını (çok basitleştirilmiş) koşullu olarak belirtiyorsunuz.

SPARQL sorgularının yürütüldüğü RDF (Kaynak Açıklama Çerçevesi) tabanının kendisi üçlü bir yapıya sahiptir. object, predicate, subject - ve sorgu, belirtilen kısıtlamalara göre gerekli üçlüleri seçer: p_55(X, q_33) doğru olacak şekilde bir X bulun - burada elbette p_55, ID 55 ile bir tür ilişkidir ve q_33, bir ID 33'e sahip nesne (burada ve tüm hikaye, yine her türlü ayrıntıyı atlayarak).

Veri sunumu örneği:

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi
Ülkelerle ilgili resimler ve örnekler burada bundan dolayı.

Temel Sorgu Örneği

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

Aslında, ?ülke değişkeninin değerini yüklem için öyle bulmak istiyoruz ki
member_of, member_of(?country,q458) ve q458'in Avrupa Birliği'nin kimliği olduğu doğrudur.

Python motoru içindeki gerçek bir SPARQL sorgusu örneği:

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

Tipik olarak, SPARQL'i yazmak yerine okumak zorunda kaldım; bu durumda, verilerin tam olarak nasıl alındığını anlamak için dili en azından temel düzeyde anlamak muhtemelen yararlı bir beceri olacaktır. 

Çevrimiçi olarak çalışılacak pek çok materyal var: örneğin, burada bu и bu. Genellikle belirli tasarımları ve örnekleri Google'da araştırıyorum ve şimdilik bu kadar yeterli.

Mantıksal sorgu dilleri

Konuyla ilgili daha fazla bilgiyi makalemde okuyabilirsiniz burada. Ve burada mantıksal dillerin neden sorgu yazmaya çok uygun olduğunu kısaca inceleyeceğiz. Temel olarak RDF, p(X) ve h(X,Y) formundaki mantıksal ifadelerin bir kümesidir ve mantıksal bir sorgu aşağıdaki forma sahiptir:

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

Burada, X için country(X)'in doğru olması koşuluyla, yeni bir yüklem çıktısı/1 (/1, tekli anlamına gelir) oluşturmaktan bahsediyoruz - yani, X bir ülke ve ayrıca member_of(X,"EU").

Yani bu durumda hem veriler hem de kurallar aynı şekilde sunuluyor ve bu da problemleri çok kolay ve iyi bir şekilde modellememize olanak sağlıyor.

Sektörde nerede tanıştınız?: Böyle bir dilde sorgular yazan bir şirketle ve sistemin çekirdeğindeki mevcut projeyle ilgili tamamen büyük bir proje - bu oldukça egzotik bir şey gibi görünebilir, ancak bazen olur.

Vikiveri işleyen mantıksal dildeki bir kod parçası örneği:

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

Materyaller: Burada modern mantıksal programlama dili Cevap Kümesi Programlama'ya birkaç bağlantı vereceğim - çalışmanızı tavsiye ederim:

Veri Bilimcisinin Notları: Veri Sorgulama Dillerinin Kişiselleştirilmiş Bir İncelemesi

Kaynak: habr.com

Yorum ekle