Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Saya memberitahu anda daripada pengalaman peribadi perkara yang berguna di mana dan bila. Ia adalah gambaran keseluruhan dan tesis, supaya jelas apa dan di mana anda boleh menggali lebih jauh - tetapi di sini saya mempunyai pengalaman peribadi subjektif secara eksklusif, mungkin semuanya berbeza untuk anda.

Mengapakah penting untuk mengetahui dan boleh menggunakan bahasa pertanyaan? Pada terasnya, Sains Data mempunyai beberapa peringkat kerja yang penting, dan yang pertama dan paling penting (tanpanya, sudah tentu tiada apa yang akan berfungsi!) ialah mendapatkan atau mengekstrak data. Selalunya, data berada di suatu tempat dalam beberapa bentuk dan perlu "diambil" dari sana. 

Bahasa pertanyaan membolehkan anda mengekstrak data ini! Dan hari ini saya akan memberitahu anda tentang bahasa pertanyaan yang telah berguna kepada saya dan saya akan memberitahu anda dan menunjukkan kepada anda di mana dan bagaimana tepatnya - mengapa ia diperlukan untuk belajar.

Terdapat tiga blok utama jenis pertanyaan data, yang akan kita bincangkan dalam artikel ini:

  • Bahasa pertanyaan "Standard" ialah apa yang biasa difahami apabila bercakap tentang bahasa pertanyaan, seperti algebra hubungan atau SQL.
  • Bahasa pertanyaan skrip: contohnya, Python things panda, numpy atau skrip shell.
  • Bahasa pertanyaan untuk graf pengetahuan dan pangkalan data graf.

Semua yang ditulis di sini hanyalah pengalaman peribadi, perkara yang berguna, dengan penerangan tentang situasi dan "mengapa ia diperlukan" - semua orang boleh mencuba bagaimana situasi yang sama boleh datang kepada anda dan cuba bersedia untuk menghadapinya terlebih dahulu dengan memahami bahasa ini ​​sebelum anda perlu memohon (segera) pada projek atau bahkan sampai ke projek di mana ia diperlukan.

Bahasa pertanyaan "Standard".

Bahasa pertanyaan standard adalah tepat dalam erti kata bahawa kita biasanya memikirkannya apabila kita bercakap tentang pertanyaan.

Algebra hubungan

Mengapakah algebra hubungan diperlukan hari ini? Untuk mempunyai pemahaman yang baik tentang mengapa bahasa pertanyaan disusun dengan cara tertentu dan menggunakannya secara sedar, anda perlu memahami teras yang mendasarinya.

Apakah algebra hubungan?

Takrif formal adalah seperti berikut: algebra hubungan ialah sistem operasi tertutup pada hubungan dalam model data hubungan. Untuk meletakkannya sedikit lebih manusiawi, ini ialah sistem operasi pada jadual supaya hasilnya sentiasa jadual.

Lihat semua operasi hubungan dalam ini artikel dari Habr - di sini kami menerangkan mengapa anda perlu tahu dan di mana ia berguna.

Mengapa?

Mula memahami maksud bahasa pertanyaan dan apakah operasi di sebalik ungkapan dalam bahasa pertanyaan tertentu selalunya memberikan pemahaman yang lebih mendalam tentang perkara yang berfungsi dalam bahasa pertanyaan dan bagaimana.

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Diambil daripada ini artikel. Contoh operasi: bergabung, yang menggabungkan jadual.

Bahan untuk belajar:

Kursus pengenalan yang baik dari Stanford. Secara umum, terdapat banyak bahan mengenai algebra dan teori hubungan - Coursera, Udacity. Terdapat juga sejumlah besar bahan dalam talian, termasuk yang baik kursus akademik. Nasihat peribadi saya: anda perlu memahami algebra hubungan dengan baik - ini adalah asas asas.

SQL

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Diambil daripada ini artikel.

SQL pada asasnya adalah pelaksanaan algebra hubungan - dengan kaveat penting, SQL adalah deklaratif! Iaitu, apabila menulis pertanyaan dalam bahasa algebra hubungan, anda sebenarnya mengatakan cara mengira - tetapi dengan SQL anda menentukan perkara yang anda ingin ekstrak, dan kemudian DBMS sudah menjana ungkapan (berkesan) dalam bahasa algebra hubungan (mereka kesetaraan dikenali kepada kita sebagai Teorem Codd).

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Diambil daripada ini artikel.

Mengapa?

DBMS Relasional: Oracle, Postgres, SQL Server, dan lain-lain masih hampir di mana-mana dan terdapat peluang yang sangat tinggi bahawa anda perlu berinteraksi dengan mereka, yang bermaksud anda perlu membaca SQL (yang berkemungkinan besar) atau menulisnya ( juga tidak mungkin).

Apa yang perlu dibaca dan dipelajari

Menurut pautan yang sama di atas (tentang algebra hubungan), terdapat sejumlah besar bahan, contohnya, ini.

By the way, apa itu NoSQL?

"Perlu ditekankan sekali lagi bahawa istilah "NoSQL" mempunyai asal usul yang spontan dan tidak mempunyai definisi yang diterima umum atau institusi saintifik di belakangnya." sepadan artikel pada Habr.

Malah, orang ramai menyedari bahawa model hubungan penuh tidak diperlukan untuk menyelesaikan banyak masalah, terutamanya bagi mereka yang, sebagai contoh, prestasi adalah kritikal dan pertanyaan mudah tertentu dengan pengagregatan menguasai - di mana penting untuk mengira metrik dengan cepat dan menulisnya ke pangkalan data, dan kebanyakan ciri adalah hubungan ternyata bukan sahaja tidak perlu, tetapi juga berbahaya - mengapa menormalkan sesuatu jika ia akan merosakkan perkara yang paling penting bagi kita (untuk beberapa tugas tertentu) - produktiviti?

Selain itu, skema fleksibel sering diperlukan dan bukannya skema matematik tetap model hubungan klasik - dan ini sangat memudahkan pembangunan aplikasi apabila penting untuk menggunakan sistem dan mula berfungsi dengan cepat, memproses keputusan - atau skema dan jenis data yang disimpan tidak begitu penting.

Sebagai contoh, kami sedang mencipta sistem pakar dan ingin menyimpan maklumat pada domain tertentu bersama-sama dengan beberapa maklumat meta - kami mungkin tidak mengetahui semua medan dan hanya menyimpan JSON untuk setiap rekod - ini memberikan kami persekitaran yang sangat fleksibel untuk mengembangkan data model dan cepat lelaran - jadi dalam kes ini, NoSQL akan menjadi lebih baik dan lebih mudah dibaca. Contoh entri (dari salah satu projek saya di mana NoSQL berada tepat di mana ia diperlukan).

{"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 boleh membaca lebih lanjut di sini mengenai NoSQL.

Apa yang perlu dipelajari?

Di sini, sebaliknya, anda hanya perlu menganalisis tugas anda dengan teliti, apakah sifat yang ada padanya dan sistem NoSQL yang tersedia yang sesuai dengan penerangan ini - dan kemudian mula mengkaji sistem ini.

Bahasa Pertanyaan Skrip

Pada mulanya, nampaknya, apakah kaitan Python dengannya secara umum - ia adalah bahasa pengaturcaraan, dan bukan tentang pertanyaan sama sekali.

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

  • Pandas sebenarnya adalah pisau Tentera Swiss bagi Sains Data; sejumlah besar transformasi data, pengagregatan, dsb. berlaku di dalamnya.
  • Numpy - pengiraan vektor, matriks dan algebra linear di sana.
  • Scipy - terdapat banyak matematik dalam pakej ini, terutamanya statistik.
  • Makmal Jupyter - banyak analisis data penerokaan sesuai dengan komputer riba - berguna untuk diketahui.
  • Permintaan - bekerja dengan rangkaian.
  • Pyspark sangat popular di kalangan jurutera data, kemungkinan besar anda perlu berinteraksi dengan ini atau Spark, hanya kerana populariti mereka.
  • *Selenium - sangat berguna untuk mengumpul data daripada tapak dan sumber, kadangkala tiada cara lain untuk mendapatkan data.

Nasihat utama saya: belajar Python!

Pandas

Mari kita ambil kod 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 asasnya, kita melihat bahawa kod itu sesuai dengan corak 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

Tetapi bahagian penting ialah kod ini adalah sebahagian daripada skrip dan saluran paip; sebenarnya, kami membenamkan pertanyaan ke dalam saluran paip Python. Dalam situasi ini, bahasa pertanyaan datang kepada kami daripada perpustakaan seperti Pandas atau pySpark.

Secara umum, dalam pySpark kita melihat jenis transformasi data yang serupa melalui bahasa pertanyaan dalam semangat:

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

Di mana dan apa yang perlu dibaca

Pada Python sendiri secara umum tidak menjadi masalah mencari bahan untuk belajar. Terdapat sejumlah besar tutorial dalam talian panda, pySpark dan kursus pada Mencetuskan (dan juga dengan sendirinya DS). Secara keseluruhan, kandungan di sini bagus untuk googling, dan jika saya terpaksa memilih satu pakej untuk difokuskan, sudah tentu ia adalah panda. Mengenai gabungan bahan DS+Python juga banyak.

Shell sebagai bahasa pertanyaan

Beberapa projek pemprosesan dan analisis data yang saya telah bekerjasama adalah, sebenarnya, skrip shell yang memanggil kod dalam Python, Java, dan perintah shell itu sendiri. Oleh itu, secara umum, anda boleh menganggap saluran paip dalam bash/zsh/etc sebagai sejenis pertanyaan peringkat tinggi (anda boleh, sudah tentu, gelung barangan di sana, tetapi ini bukan tipikal untuk kod DS dalam bahasa shell), mari berikan contoh mudah - Saya perlu melakukan pemetaan QID wikidata dan pautan penuh ke wiki Rusia dan Inggeris, untuk ini saya menulis permintaan mudah daripada arahan dalam bash dan untuk output saya menulis skrip mudah dalam Python, yang saya susun seperti ini:

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

mana

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

Ini, sebenarnya, keseluruhan saluran paip yang mencipta pemetaan yang diperlukan; seperti yang kita lihat, semuanya berfungsi dalam mod strim:

  • pv filepath - memberikan bar kemajuan berdasarkan saiz fail dan meneruskan kandungannya dan seterusnya
  • unpigz -c membaca sebahagian daripada arkib dan memberikannya kepada jq
  • jq dengan kunci - strim serta-merta menghasilkan hasilnya dan menyerahkannya kepada pascapemproses (sama seperti contoh pertama) dalam Python
  • secara dalaman, pascapemproses ialah mesin keadaan mudah yang memformat output 

Secara keseluruhannya, saluran paip kompleks berfungsi dalam mod aliran pada data besar (0.5TB), tanpa sumber yang ketara dan dibuat daripada saluran paip ringkas dan beberapa alatan.

Satu lagi petua penting: dapat berfungsi dengan baik dan berkesan di terminal dan tulis bash/zsh/etc.

Di manakah ia akan berguna? Ya, hampir di mana-mana - sekali lagi, terdapat BANYAK bahan untuk belajar di Internet. Khususnya, di sini эта artikel saya sebelum ini.

skrip R

Sekali lagi, pembaca mungkin berseru - nah, ini adalah bahasa pengaturcaraan keseluruhan! Dan sudah tentu, dia akan betul. Walau bagaimanapun, saya biasanya menemui R dalam konteks sedemikian yang, sebenarnya, ia sangat serupa dengan bahasa pertanyaan.

R ialah persekitaran dan bahasa pengkomputeran statistik untuk pengkomputeran statik dan visualisasi (mengikut ini).

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
diambil oleh itu. Dengan cara ini, saya mengesyorkannya, bahan yang bagus.

Mengapakah seorang saintis data perlu mengetahui R? Sekurang-kurangnya, kerana terdapat lapisan besar orang bukan IT yang menganalisis data dalam R. Saya menemuinya di tempat berikut:

  • Sektor farmaseutikal.
  • Ahli biologi.
  • Sektor kewangan.
  • Orang yang mempunyai pendidikan matematik semata-mata yang berurusan dengan statistik.
  • Model statistik khusus dan model pembelajaran mesin (yang selalunya hanya boleh ditemui dalam versi pengarang sebagai pakej R).

Mengapa ia sebenarnya bahasa pertanyaan? Dalam bentuk di mana ia sering dijumpai, ia sebenarnya adalah permintaan untuk mencipta model, termasuk membaca data dan menetapkan parameter pertanyaan (model), serta menggambarkan data dalam pakej seperti ggplot2 - ini juga merupakan satu bentuk penulisan pertanyaan .

Contoh pertanyaan 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 idea daripada R telah berhijrah ke dalam pakej python seperti panda, numpy atau scipy, seperti bingkai data dan vektorisasi data - jadi secara amnya banyak perkara dalam R akan kelihatan biasa dan mudah untuk anda.

Terdapat banyak sumber untuk dikaji, contohnya, ini.

Graf pengetahuan

Di sini saya mempunyai pengalaman yang sedikit luar biasa, kerana saya sering perlu bekerja dengan graf pengetahuan dan bahasa pertanyaan untuk graf. Oleh itu, mari kita bincangkan secara ringkas asasnya, kerana bahagian ini sedikit lebih eksotik.

Dalam pangkalan data hubungan klasik kami mempunyai skema tetap, tetapi di sini skema adalah fleksibel, setiap predikat sebenarnya adalah "lajur" dan lebih banyak lagi.

Bayangkan anda memodelkan seseorang dan ingin menerangkan perkara penting, sebagai contoh, mari kita ambil orang tertentu, Douglas Adams, dan gunakan penerangan ini sebagai asas.

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
www.wikidata.org/wiki/Q42

Jika kita menggunakan pangkalan data hubungan, kita perlu mencipta jadual atau jadual yang besar dengan jumlah lajur yang banyak, yang kebanyakannya adalah NULL atau diisi dengan beberapa nilai Palsu lalai, sebagai contoh, tidak mungkin ramai di antara kita mempunyai kemasukan dalam perpustakaan negara Korea - sudah tentu, kita boleh meletakkannya dalam jadual berasingan, tetapi ini akhirnya akan menjadi percubaan untuk memodelkan litar logik fleksibel dengan predikat menggunakan satu hubungan tetap.

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Jadi bayangkan bahawa semua data disimpan sebagai graf atau sebagai ungkapan boolean binari dan unari.

Di mana anda boleh menghadapi ini? Pertama, bekerja dengan data wiki, dan dengan mana-mana pangkalan data graf atau data bersambung.

Berikut adalah bahasa pertanyaan utama yang telah saya gunakan dan bekerjasama.

SPARQL

Wiki:
SPARQL (akronim rekursif daripada Bahasa Inggeris Protokol SPARQL dan Bahasa Pertanyaan RDF) - bahasa pertanyaan data, diwakili oleh model RDFDan protokol untuk menghantar permintaan ini dan membalasnya. SPARQL ialah cadangan Konsortium W3C dan salah satu teknologi web semantik.

Tetapi pada hakikatnya ia adalah bahasa pertanyaan untuk predikat unari dan binari logik. Anda hanya menyatakan secara bersyarat apa yang ditetapkan dalam ungkapan Boolean dan apa yang tidak (sangat dipermudahkan).

Pangkalan RDF (Resource Description Framework) itu sendiri, di mana pertanyaan SPARQL dilaksanakan, adalah tiga kali ganda. object, predicate, subject - dan pertanyaan memilih tiga kali ganda yang diperlukan mengikut sekatan yang ditentukan dalam semangat: cari X supaya p_55(X, q_33) adalah benar - di mana, sudah tentu, p_55 adalah sejenis hubungan dengan ID 55, dan q_33 ialah objek dengan ID 33 (di sini dan keseluruhan cerita, sekali lagi meninggalkan semua jenis butiran).

Contoh persembahan data:

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data
Gambar dan contoh dengan negara di sini oleh itu.

Contoh Pertanyaan Asas

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

Sebenarnya, kita ingin mencari nilai pembolehubah ?negara supaya untuk predikat
member_of, memang benar bahawa member_of(?country,q458) dan q458 ialah ID Kesatuan Eropah.

Contoh pertanyaan SPARQL sebenar di dalam enjin python:

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

Lazimnya, saya terpaksa membaca SPARQL dan bukannya menulisnya - dalam situasi itu, mungkin kemahiran yang berguna untuk memahami bahasa sekurang-kurangnya pada tahap asas untuk memahami dengan tepat cara data diperoleh semula. 

Terdapat banyak bahan untuk belajar dalam talian: sebagai contoh, di sini ini и ini. Saya biasanya google reka bentuk dan contoh khusus dan itu sudah cukup buat masa ini.

Bahasa pertanyaan logik

Anda boleh membaca lebih lanjut mengenai topik dalam artikel saya di sini. Dan di sini, kita hanya akan mengkaji secara ringkas mengapa bahasa logik sangat sesuai untuk menulis pertanyaan. Pada asasnya, RDF hanyalah satu set pernyataan logik dalam bentuk p(X) dan h(X,Y), dan pertanyaan logik mempunyai bentuk berikut:

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

Di sini kita bercakap tentang mencipta output predikat baharu/1 (/1 bermaksud unary), dengan syarat bagi X adalah benar negara(X) - iaitu, X ialah sebuah negara dan juga ahli_of(X,"EU ").

Iaitu, dalam kes ini, kedua-dua data dan peraturan dibentangkan dengan cara yang sama, yang memungkinkan untuk memodelkan masalah dengan sangat mudah dan baik.

Di manakah anda bertemu dalam industri?: keseluruhan projek besar dengan syarikat yang menulis pertanyaan dalam bahasa sedemikian, serta projek semasa dalam teras sistem - nampaknya ini adalah perkara yang agak eksotik, tetapi kadangkala ia berlaku.

Contoh serpihan kod dalam bahasa logik memproses wikidata:

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

Bahan: Saya akan memberikan di sini beberapa pautan ke bahasa pengaturcaraan logik moden Jawapan Set Pengaturcaraan - Saya cadangkan mempelajarinya:

Nota Saintis Data: Kajian Peribadi Bahasa Pertanyaan Data

Sumber: www.habr.com

Tambah komen