Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Saya memberi tahu Anda dari pengalaman pribadi apa yang berguna di mana dan kapan. Ini gambaran umum dan tesis, sehingga jelas apa dan di mana Anda dapat menggali lebih jauh - tetapi di sini saya memiliki pengalaman pribadi yang sangat subjektif, mungkin semuanya benar-benar berbeda untuk Anda.

Mengapa penting untuk mengetahui dan dapat menggunakan bahasa kueri? Pada intinya, Ilmu Data memiliki beberapa tahapan kerja yang penting, dan yang pertama dan paling penting (tanpanya, tentu tidak akan ada yang berhasil!) adalah memperoleh atau mengekstraksi data. Seringkali, data berada di suatu tempat dalam bentuk tertentu dan perlu “diambil” dari sana. 

Bahasa kueri memungkinkan Anda mengekstrak data ini! Dan hari ini saya akan memberi tahu Anda tentang bahasa kueri yang berguna bagi saya dan saya akan memberi tahu Anda serta menunjukkan kepada Anda di mana dan bagaimana tepatnya - mengapa perlu dipelajari.

Akan ada tiga blok utama tipe kueri data, yang akan kita bahas di artikel ini:

  • Bahasa kueri "Standar" adalah apa yang umumnya dipahami ketika berbicara tentang bahasa kueri, seperti aljabar relasional atau SQL.
  • Bahasa kueri pembuatan skrip: misalnya, skrip Python things pandas, numpy, atau shell.
  • Bahasa kueri untuk grafik pengetahuan dan database grafik.

Semua yang ditulis di sini hanyalah pengalaman pribadi, apa yang berguna, dengan deskripsi situasi dan “mengapa hal itu diperlukan” - semua orang dapat mencoba bagaimana situasi serupa dapat menghampiri Anda dan mencoba mempersiapkannya terlebih dahulu dengan memahami bahasa-bahasa ini ​​sebelum Anda harus melamar (segera) pada suatu proyek atau bahkan sampai ke proyek yang membutuhkannya.

Bahasa kueri "Standar".

Bahasa kueri standar persis seperti yang biasanya kita pikirkan saat membicarakan kueri.

Aljabar relasional

Mengapa aljabar relasional dibutuhkan saat ini? Untuk memahami dengan baik mengapa bahasa kueri disusun dengan cara tertentu dan menggunakannya secara sadar, Anda perlu memahami inti yang mendasarinya.

Apa itu aljabar relasional?

Definisi formalnya adalah sebagai berikut: aljabar relasional adalah sistem operasi tertutup pada relasi dalam model data relasional. Sederhananya, ini adalah sistem operasi pada tabel sehingga hasilnya selalu berupa tabel.

Lihat semua operasi relasional di ini artikel dari Habr - di sini kami menjelaskan mengapa Anda perlu mengetahuinya dan di mana hal itu berguna.

Kenapa?

Mulai memahami apa itu bahasa kueri dan operasi apa yang ada di balik ekspresi dalam bahasa kueri tertentu sering kali memberikan pemahaman yang lebih dalam tentang apa yang berfungsi dalam bahasa kueri dan bagaimana caranya.

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Diambil dari ini artikel. Contoh operasi: join, yang menggabungkan tabel.

Bahan untuk belajar:

Kursus pengantar yang bagus dari Stanford. Secara umum, ada banyak materi tentang aljabar dan teori relasional - Coursera, Udacity. Ada juga banyak sekali materi online, termasuk yang bagus kursus akademik. Saran pribadi saya: Anda perlu memahami aljabar relasional dengan baik - ini adalah dasar dari dasar-dasarnya.

SQL

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Diambil dari ini artikel.

SQL pada dasarnya adalah implementasi aljabar relasional - dengan peringatan penting, SQL bersifat deklaratif! Artinya, ketika menulis kueri dalam bahasa aljabar relasional, Anda sebenarnya mengatakan cara menghitung - tetapi dengan SQL Anda menentukan apa yang ingin Anda ekstrak, dan kemudian DBMS sudah menghasilkan ekspresi (efektif) dalam bahasa aljabar relasional (mereka kesetaraan dikenal oleh kita sebagai teorema Codd).

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Diambil dari ini artikel.

Kenapa?

DBMS Relasional: Oracle, Postgres, SQL Server, dll masih ada dimana-mana dan ada kemungkinan besar Anda harus berinteraksi dengan mereka, yang berarti Anda harus membaca SQL (yang sangat mungkin) atau menulisnya ( bukan tidak mungkin juga).

Apa yang harus dibaca dan dipelajari

Menurut tautan yang sama di atas (tentang aljabar relasional), ada banyak sekali materi, misalnya, ini.

Ngomong-ngomong, apa itu NoSQL?

“Perlu ditekankan sekali lagi bahwa istilah “NoSQL” memiliki asal usul yang spontan dan tidak memiliki definisi atau institusi ilmiah yang diterima secara umum di baliknya.” Sesuai artikel di Habr.

Faktanya, orang-orang menyadari bahwa model relasional penuh tidak diperlukan untuk memecahkan banyak masalah, terutama untuk masalah yang, misalnya, kinerja sangat penting dan kueri sederhana tertentu dengan agregasi mendominasi - yang mengharuskan penghitungan metrik dengan cepat dan menuliskannya ke database, dan sebagian besar fitur bersifat relasional ternyata tidak hanya tidak diperlukan, tetapi juga berbahaya - mengapa menormalkan sesuatu jika itu akan merusak hal terpenting bagi kita (untuk beberapa tugas tertentu) - produktivitas?

Selain itu, skema fleksibel sering kali diperlukan alih-alih skema matematika tetap dari model relasional klasik - dan ini sangat menyederhanakan pengembangan aplikasi ketika sangat penting untuk menerapkan sistem dan mulai bekerja dengan cepat, memproses hasil - atau skema dan jenis data yang disimpan tidak begitu penting.

Misalnya, kita membuat sistem pakar dan ingin menyimpan informasi pada domain tertentu bersama dengan beberapa informasi meta - kita mungkin tidak mengetahui semua bidang dan hanya menyimpan JSON untuk setiap catatan - ini memberi kita lingkungan yang sangat fleksibel untuk memperluas data model dan iterasi dengan cepat - jadi dalam hal ini, NoSQL akan lebih disukai dan lebih mudah dibaca. Contoh entri (dari salah satu proyek saya di mana NoSQL berada tepat di tempat yang dibutuhkan).

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

Anda dapat membaca lebih lanjut di sini tentang NoSQL.

Apa yang harus dipelajari?

Di sini, Anda hanya perlu menganalisis tugas Anda secara menyeluruh, properti apa yang dimilikinya, dan sistem NoSQL apa yang tersedia yang sesuai dengan deskripsi ini - dan kemudian mulai mempelajari sistem ini.

Bahasa Kueri Skrip

Pada awalnya, tampaknya, apa hubungannya dengan Python secara umum - ini adalah bahasa pemrograman, dan bukan tentang kueri sama sekali.

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

  • Pandas secara harfiah adalah pisau Ilmu Data Swiss Army; sejumlah besar transformasi data, agregasi, dll. terjadi di dalamnya.
  • Numpy - perhitungan vektor, matriks dan aljabar linier di sana.
  • Scipy - ada banyak matematika dalam paket ini, terutama statistik.
  • Lab Jupyter - banyak analisis data eksplorasi yang cocok untuk laptop - berguna untuk diketahui.
  • Permintaan - bekerja dengan jaringan.
  • Pyspark sangat populer di kalangan insinyur data, kemungkinan besar Anda harus berinteraksi dengan ini atau Spark, hanya karena popularitas mereka.
  • *Selenium - sangat berguna untuk mengumpulkan data dari situs dan sumber daya, terkadang tidak ada cara lain untuk mendapatkan data tersebut.

Saran utama saya: pelajari Python!

Panda

Mari kita ambil kode berikut sebagai contoh:

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

Pada dasarnya, kita melihat bahwa kode tersebut cocok dengan pola SQL klasik.

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

Namun bagian pentingnya adalah kode ini adalah bagian dari skrip dan pipeline; sebenarnya, kami menyematkan kueri ke dalam pipeline Python. Dalam situasi ini, bahasa kueri datang kepada kami dari perpustakaan seperti Pandas atau pySpark.

Secara umum, di pySpark kita melihat tipe transformasi data serupa melalui bahasa kueri dengan semangat:

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

Di mana dan apa yang harus dibaca

Pada Python sendiri secara umum tidak masalah mencari bahan untuk dipelajari. Ada banyak sekali tutorial online panda, pySpark dan kursus percikan (dan juga dengan sendirinya DS). Secara keseluruhan, konten di sini bagus untuk googling, dan jika saya harus memilih satu paket untuk fokus, tentu saja itu adalah panda. Mengenai kombinasi material DS+Python juga banyak.

Shell sebagai bahasa kueri

Beberapa proyek pemrosesan dan analisis data yang pernah saya kerjakan sebenarnya adalah skrip shell yang memanggil kode dalam Python, Java, dan perintah shell itu sendiri. Oleh karena itu, secara umum, Anda dapat mempertimbangkan pipeline di bash/zsh/etc sebagai semacam kueri tingkat tinggi (tentu saja Anda dapat memasukkan loop ke dalamnya, tetapi ini tidak khas untuk kode DS dalam bahasa shell), mari kita berikan contoh sederhana - Saya perlu melakukan pemetaan QID data wiki dan tautan lengkap ke wiki Rusia dan Inggris, untuk ini saya menulis permintaan sederhana dari perintah di bash dan untuk hasilnya saya menulis skrip sederhana dengan Python, yang saya disatukan seperti ini:

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

dimana

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

Faktanya, ini adalah keseluruhan pipeline yang menciptakan pemetaan yang diperlukan; seperti yang kita lihat, semuanya bekerja dalam mode aliran:

  • pv filepath - memberikan bilah kemajuan berdasarkan ukuran file dan meneruskan isinya dan seterusnya
  • unpigz -c membaca sebagian arsip dan memberikannya ke jq
  • jq dengan kunci - stream segera menghasilkan hasilnya dan meneruskannya ke postprocessor (sama seperti contoh pertama) dengan Python
  • secara internal, postprocessor adalah mesin keadaan sederhana yang memformat output 

Secara total, pipeline kompleks yang bekerja dalam mode aliran pada data besar (0.5TB), tanpa sumber daya yang signifikan dan dibuat dari pipeline sederhana dan beberapa alat.

Tip penting lainnya: dapat bekerja dengan baik dan efektif di terminal dan menulis bash/zsh/etc.

Dimana manfaatnya? Ya, hampir di semua tempat - sekali lagi, ada BANYAK materi untuk dipelajari di Internet. Khususnya di sini ini artikel saya sebelumnya.

skrip R

Sekali lagi, pembaca mungkin berseru - ini adalah bahasa pemrograman yang utuh! Dan tentu saja, dia benar. Namun, saya biasanya menemukan R dalam konteks yang sebenarnya sangat mirip dengan bahasa kueri.

R adalah lingkungan komputasi statistik dan bahasa untuk komputasi statis dan visualisasi (menurut ini).

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Diambil karenanya. Ngomong-ngomong, saya merekomendasikannya, bahannya bagus.

Mengapa seorang data scientist perlu mengetahui R? Setidaknya, karena ada banyak sekali orang non-IT yang menganalisis data di R. Saya menemukannya di tempat berikut:

  • Sektor farmasi.
  • Ahli biologi.
  • Sektor keuangan.
  • Orang dengan pendidikan matematika murni yang berhubungan dengan statistik.
  • Model statistik khusus dan model pembelajaran mesin (yang seringkali hanya dapat ditemukan dalam versi penulis sebagai paket R).

Mengapa ini sebenarnya bahasa kueri? Dalam bentuk yang sering ditemukan, sebenarnya ini adalah permintaan untuk membuat model, termasuk membaca data dan memperbaiki parameter kueri (model), serta memvisualisasikan data dalam paket seperti ggplot2 - ini juga merupakan bentuk penulisan kueri .

Contoh kueri untuk visualisasi

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

Secara umum, banyak ide dari R telah bermigrasi ke paket python seperti pandas, numpy atau scipy, seperti kerangka data dan vektorisasi data - jadi secara umum banyak hal di R akan terasa familier dan nyaman bagi Anda.

Ada banyak sumber untuk dipelajari, misalnya saja. ini.

Grafik pengetahuan

Di sini saya memiliki pengalaman yang sedikit tidak biasa, karena saya cukup sering harus bekerja dengan grafik pengetahuan dan bahasa kueri untuk grafik. Oleh karena itu, mari kita bahas secara singkat dasar-dasarnya, karena bagian ini sedikit lebih eksotis.

Dalam database relasional klasik kita memiliki skema tetap, tetapi di sini skemanya fleksibel, setiap predikat sebenarnya adalah “kolom” dan bahkan lebih.

Bayangkan Anda sedang memodelkan seseorang dan ingin mendeskripsikan hal-hal penting, misalnya, mari kita ambil orang tertentu, Douglas Adams, dan gunakan deskripsi ini sebagai dasar.

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
www.wikidata.org/wiki/Q42

Jika kita menggunakan database relasional, kita harus membuat tabel besar atau tabel dengan jumlah kolom yang banyak, yang sebagian besar adalah NULL atau diisi dengan nilai False default, misalnya, kecil kemungkinannya banyak dari kita yang memiliki database relasional. entri di perpustakaan nasional Korea - tentu saja, kita dapat menempatkannya dalam tabel terpisah, tetapi ini pada akhirnya akan menjadi upaya untuk memodelkan rangkaian logika fleksibel dengan predikat menggunakan relasional tetap.

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Jadi bayangkan semua data disimpan sebagai grafik atau ekspresi boolean biner dan unary.

Di mana Anda bisa menemukan ini? Pertama, bekerja dengan wiki data, dan dengan database grafik atau data yang terhubung.

Berikut ini adalah bahasa kueri utama yang pernah saya gunakan dan kerjakan.

SPARQL

Wiki:
SPARQL (akronim rekursif dari Eng. Protokol SPARQL dan Bahasa Kueri RDF) - bahasa permintaan data, diwakili oleh model RDFDan protokol untuk mengirimkan permintaan ini dan menanggapinya. SPARQL adalah sebuah rekomendasi Konsorsium W3C dan salah satu teknologinya Web semantik.

Namun pada kenyataannya ini adalah bahasa query untuk predikat logika unary dan biner. Anda cukup menentukan secara kondisional apa yang ditetapkan dalam ekspresi Boolean dan apa yang tidak (sangat disederhanakan).

Basis RDF (Resource Description Framework) itu sendiri, di mana kueri SPARQL dieksekusi, adalah rangkap tiga object, predicate, subject - dan kueri memilih tripel yang diperlukan sesuai dengan batasan yang ditentukan dalam semangat: temukan X sedemikian rupa sehingga p_55(X, q_33) benar - di mana, tentu saja, p_55 adalah semacam relasi dengan ID 55, dan q_33 adalah sebuah objek dengan ID 33 (di sini dan keseluruhan cerita, sekali lagi menghilangkan segala macam detail).

Contoh penyajian data:

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data
Gambar dan contoh negara di sini karenanya.

Contoh Kueri Dasar

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

Sebenarnya kita ingin mencari nilai variabel ?negara untuk predikatnya
member_of, memang benar member_of(?country,q458) dan q458 adalah ID Uni Eropa.

Contoh query SPARQL nyata di dalam mesin python:

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

Biasanya, saya harus membaca SPARQL daripada menulisnya - dalam situasi tersebut, mungkin akan berguna untuk memahami bahasa tersebut setidaknya pada tingkat dasar untuk memahami dengan tepat bagaimana data diambil. 

Ada banyak materi untuk dipelajari secara online: misalnya di sini ini и ini. Saya biasanya mencari desain dan contoh spesifik di Google dan itu sudah cukup untuk saat ini.

Bahasa kueri logis

Anda dapat membaca lebih lanjut tentang topik ini di artikel saya di sini. Dan di sini, kami hanya akan membahas secara singkat mengapa bahasa logis sangat cocok untuk menulis kueri. Pada dasarnya, RDF hanyalah sekumpulan pernyataan logis dalam bentuk p(X) dan h(X,Y), dan kueri logis memiliki bentuk berikut:

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

Di sini kita berbicara tentang membuat keluaran predikat baru/1 (/1 berarti unary), asalkan untuk X benar bahwa negara(X) - yaitu, X adalah negara dan juga member_of(X,"EU ").

Artinya, dalam hal ini data dan aturan disajikan dengan cara yang sama, sehingga memungkinkan kita memodelkan masalah dengan sangat mudah dan baik.

Di mana Anda bertemu di industri ini?: sebuah proyek besar dengan perusahaan yang menulis pertanyaan dalam bahasa seperti itu, serta pada proyek saat ini di inti sistem - tampaknya ini adalah hal yang agak eksotis, tetapi terkadang hal itu terjadi.

Contoh fragmen kode dalam wikidata pemrosesan bahasa logis:

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

Bahan: Di sini saya akan memberikan beberapa tautan ke bahasa pemrograman logis modern Pemrograman Kumpulan Jawaban - Saya sarankan mempelajarinya:

Catatan Ilmuwan Data: Tinjauan yang Dipersonalisasi tentang Bahasa Kueri Data

Sumber: www.habr.com

Tambah komentar