Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Tôi đang nói với bạn từ kinh nghiệm cá nhân điều gì hữu ích ở đâu và khi nào. Đó là tổng quan và luận điểm, để biết rõ bạn có thể tìm hiểu sâu hơn về những gì và ở đâu - nhưng ở đây tôi chỉ có kinh nghiệm cá nhân chủ quan, có thể mọi thứ hoàn toàn khác đối với bạn.

Tại sao việc biết và có thể sử dụng các ngôn ngữ truy vấn lại quan trọng? Về cốt lõi, Khoa học dữ liệu có một số giai đoạn công việc quan trọng và giai đoạn đầu tiên và quan trọng nhất (không có nó, chắc chắn sẽ không có gì hiệu quả!) Là thu thập hoặc trích xuất dữ liệu. Thông thường, dữ liệu nằm ở đâu đó dưới một dạng nào đó và cần được “truy xuất” từ đó. 

Ngôn ngữ truy vấn cho phép bạn trích xuất chính dữ liệu này! Và hôm nay tôi sẽ kể cho bạn nghe về những ngôn ngữ truy vấn hữu ích với tôi và tôi sẽ cho bạn biết và chỉ cho bạn chính xác địa điểm và cách thức - tại sao cần phải học.

Sẽ có ba khối loại truy vấn dữ liệu chính mà chúng ta sẽ thảo luận trong bài viết này:

  • Ngôn ngữ truy vấn "chuẩn" là ngôn ngữ được hiểu phổ biến khi nói về ngôn ngữ truy vấn, chẳng hạn như đại số quan hệ hoặc SQL.
  • Ngôn ngữ truy vấn tập lệnh: ví dụ: Python things pandas, numpy hoặc shell script.
  • Ngôn ngữ truy vấn cho đồ thị tri thức và cơ sở dữ liệu đồ thị.

Mọi thứ được viết ở đây chỉ là trải nghiệm cá nhân, hữu ích, kèm theo mô tả các tình huống và “tại sao cần thiết” - mọi người có thể thử xem các tình huống tương tự có thể xảy ra theo cách của bạn như thế nào và cố gắng chuẩn bị trước cho chúng bằng cách hiểu các ngôn ngữ này ​​trước khi bạn phải nộp đơn (khẩn cấp) cho một dự án hoặc thậm chí đến một dự án mà họ cần.

Ngôn ngữ truy vấn "chuẩn"

Các ngôn ngữ truy vấn tiêu chuẩn chính xác theo nghĩa mà chúng ta thường nghĩ về chúng khi nói về truy vấn.

đại số quan hệ

Tại sao đại số quan hệ lại cần thiết ngày nay? Để hiểu rõ lý do tại sao các ngôn ngữ truy vấn được cấu trúc theo một cách nhất định và sử dụng chúng một cách có ý thức, bạn cần hiểu cốt lõi của chúng.

đại số quan hệ là gì?

Định nghĩa chính thức như sau: đại số quan hệ là một hệ thống khép kín các phép toán trên các quan hệ trong mô hình dữ liệu quan hệ. Nói một cách nhân văn hơn một chút thì đây là một hệ thống các thao tác trên bảng sao cho kết quả luôn là một bảng.

Xem tất cả các hoạt động quan hệ trong điều này bài viết từ Habr - ở đây chúng tôi mô tả lý do tại sao bạn cần biết và nó hữu ích ở đâu.

Tại sao?

Việc bắt đầu hiểu ngôn ngữ truy vấn là gì và thao tác nào đằng sau các biểu thức trong các ngôn ngữ truy vấn cụ thể thường giúp bạn hiểu sâu hơn về những gì hoạt động trong ngôn ngữ truy vấn và cách thức hoạt động.

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Được lấy từ điều này bài viết. Một ví dụ về thao tác: nối, nối các bảng.

Tài liệu phục vụ nghiên cứu:

Khóa học nhập môn tốt từ Stanford. Nói chung có rất nhiều tài liệu về đại số và lý thuyết quan hệ - Coursera, Udacity. Ngoài ra còn có một lượng lớn tài liệu trực tuyến, bao gồm cả những tài liệu hay các khóa học. Lời khuyên cá nhân của tôi: bạn cần hiểu rất rõ về đại số quan hệ - đây là nền tảng của những điều cơ bản.

SQL

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Được lấy từ điều này bài viết.

SQL về cơ bản là một triển khai của đại số quan hệ - với một lưu ý quan trọng, SQL là khai báo! Nghĩa là, khi viết một truy vấn bằng ngôn ngữ đại số quan hệ, bạn thực sự nói cách tính - nhưng với SQL, bạn chỉ định những gì bạn muốn trích xuất và sau đó DBMS đã tạo ra các biểu thức (hiệu quả) bằng ngôn ngữ đại số quan hệ (của chúng). sự tương đương được chúng ta biết đến như là Định lý Codd).

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Được lấy từ điều này bài viết.

Tại sao?

Các DBMS quan hệ: Oracle, Postgres, SQL Server, v.v. vẫn hầu như ở khắp mọi nơi và có khả năng cực kỳ cao là bạn sẽ phải tương tác với chúng, điều đó có nghĩa là bạn sẽ phải đọc SQL (rất có thể) hoặc viết nó ( cũng không có khả năng xảy ra).

Đọc và nghiên cứu những gì

Theo các liên kết tương tự ở trên (về đại số quan hệ), ví dụ, có một lượng tài liệu đáng kinh ngạc này.

Nhân tiện, NoSQL là gì?

“Cần nhấn mạnh một lần nữa rằng thuật ngữ “NoSQL” có nguồn gốc hoàn toàn tự phát và không có định nghĩa hay tổ chức khoa học nào được chấp nhận chung đằng sau nó.” tương ứng bài viết trên Habr.

Trên thực tế, mọi người nhận ra rằng không cần một mô hình quan hệ đầy đủ để giải quyết nhiều vấn đề, đặc biệt đối với những vấn đề mà hiệu suất là rất quan trọng và một số truy vấn đơn giản nhất định có tính tổng hợp chiếm ưu thế - trong đó điều quan trọng là phải nhanh chóng tính toán số liệu và ghi chúng vào cơ sở dữ liệu và hầu hết các tính năng đều mang tính chất quan hệ hóa ra không những không cần thiết mà còn có hại - tại sao lại bình thường hóa thứ gì đó nếu nó sẽ làm hỏng điều quan trọng nhất đối với chúng ta (đối với một số nhiệm vụ cụ thể) - năng suất?

Ngoài ra, các lược đồ linh hoạt thường cần thiết thay vì các lược đồ toán học cố định của mô hình quan hệ cổ điển - và điều này giúp đơn giản hóa đáng kể việc phát triển ứng dụng khi việc triển khai hệ thống và bắt đầu làm việc nhanh chóng, xử lý kết quả là rất quan trọng - hoặc lược đồ và các loại dữ liệu được lưu trữ không quá quan trọng.

Ví dụ: chúng tôi đang tạo một hệ thống chuyên gia và muốn lưu trữ thông tin trên một miền cụ thể cùng với một số thông tin meta - chúng tôi có thể không biết tất cả các trường và chỉ lưu trữ JSON cho mỗi bản ghi - điều này mang lại cho chúng tôi một môi trường rất linh hoạt để mở rộng dữ liệu lập mô hình và lặp lại nhanh chóng - vì vậy trong trường hợp này, NoSQL thậm chí sẽ thích hợp hơn và dễ đọc hơn. Mục nhập ví dụ (từ một trong những dự án của tôi trong đó NoSQL đã ở đúng nơi cần thiết).

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

Bạn có thể đọc thêm đây về NoSQL.

Học gì?

Thay vào đó, ở đây, bạn chỉ cần phân tích kỹ lưỡng nhiệm vụ của mình, nó có những thuộc tính gì và hệ thống NoSQL nào có sẵn phù hợp với mô tả này - sau đó bắt đầu nghiên cứu hệ thống này.

Ngôn ngữ truy vấn tập lệnh

Lúc đầu, có vẻ như Python phải làm gì với nó nói chung - đó là ngôn ngữ lập trình chứ không phải về truy vấn.

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

  • Pandas theo đúng nghĩa đen là một con dao Khoa học Dữ liệu của Quân đội Thụy Sĩ; một lượng lớn chuyển đổi, tổng hợp dữ liệu, v.v. diễn ra trong đó.
  • Numpy - tính toán vectơ, ma trận và đại số tuyến tính ở đó.
  • Scipy - có rất nhiều toán học trong gói này, đặc biệt là số liệu thống kê.
  • Phòng thí nghiệm Jupyter - rất nhiều phân tích dữ liệu khám phá rất phù hợp với máy tính xách tay - hữu ích cần biết.
  • Yêu cầu - làm việc với mạng.
  • Pyspark rất phổ biến trong giới kỹ sư dữ liệu, rất có thể bạn sẽ phải tương tác với cái này hoặc Spark, đơn giản là do mức độ phổ biến của chúng.
  • *Selenium - rất hữu ích để thu thập dữ liệu từ các trang web và tài nguyên, đôi khi không có cách nào khác để lấy dữ liệu.

Lời khuyên chính của tôi: hãy học Python!

Gấu trúc

Hãy lấy đoạn mã sau làm ví dụ:

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

Về cơ bản, chúng tôi thấy rằng mã phù hợp với mẫu SQL cổ điển.

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

Nhưng phần quan trọng là mã này là một phần của tập lệnh và quy trình; trên thực tế, chúng tôi đang nhúng các truy vấn vào quy trình Python. Trong tình huống này, ngôn ngữ truy vấn đến với chúng ta từ các thư viện như Pandas hoặc pySpark.

Nói chung, trong pySpark, chúng ta thấy một kiểu chuyển đổi dữ liệu tương tự thông qua ngôn ngữ truy vấn theo tinh thần:

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

Đọc ở đâu và đọc gì

Trên chính Python nói chung không vấn đề gì tìm tài liệu để học. Có một số lượng lớn các hướng dẫn trực tuyến gấu trúc, pySpark và các khóa học về Spark (và cũng chính nó DS). Nhìn chung, nội dung ở đây rất phù hợp để tìm kiếm trên Google và nếu tôi phải chọn một gói để tập trung vào thì đó tất nhiên sẽ là gấu trúc. Về việc kết hợp vật liệu DS+Python nữa rất nhiều.

Shell là ngôn ngữ truy vấn

Trên thực tế, khá nhiều dự án xử lý và phân tích dữ liệu mà tôi đã làm việc là các tập lệnh shell gọi mã bằng Python, Java và chính các lệnh shell. Do đó, nói chung, bạn có thể coi các đường dẫn trong bash/zsh/etc như một loại truy vấn cấp cao nào đó (tất nhiên, bạn có thể nhét các vòng lặp vào đó, nhưng điều này không điển hình cho mã DS trong ngôn ngữ shell), hãy đưa ra một ví dụ đơn giản - tôi cần thực hiện ánh xạ QID của wikidata và các liên kết đầy đủ đến wiki tiếng Nga và tiếng Anh, để làm được điều này, tôi đã viết một yêu cầu đơn giản từ các lệnh trong bash và đối với đầu ra, tôi đã viết một tập lệnh đơn giản bằng Python, mà tôi ghép lại với nhau như thế này:

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

đâu

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

Trên thực tế, đây là toàn bộ quy trình đã tạo ra ánh xạ cần thiết; như chúng ta thấy, mọi thứ đều hoạt động ở chế độ luồng:

  • pv filepath - cung cấp thanh tiến trình dựa trên kích thước tệp và chuyển nội dung của nó trở đi
  • unpigz -c đọc một phần của kho lưu trữ và đưa nó cho jq
  • jq bằng khóa - luồng ngay lập tức tạo ra kết quả và chuyển nó đến bộ xử lý hậu kỳ (giống như ví dụ đầu tiên) trong Python
  • bên trong, bộ xử lý sau là một máy trạng thái đơn giản định dạng đầu ra 

Tổng cộng, một đường ống phức tạp hoạt động ở chế độ luồng trên dữ liệu lớn (0.5TB), không cần nhiều tài nguyên và được tạo từ một đường ống đơn giản và một vài công cụ.

Một mẹo quan trọng khác: có thể hoạt động tốt và hiệu quả trong terminal và viết bash/zsh/etc.

Nó sẽ hữu ích ở đâu? Có, hầu như ở khắp mọi nơi - một lần nữa, có RẤT NHIỀU tài liệu để nghiên cứu trên Internet. Đặc biệt, ở đây cái này bài viết trước của tôi.

Kịch bản R

Một lần nữa, người đọc có thể thốt lên - à, đây là cả một ngôn ngữ lập trình! Và tất nhiên, anh ấy sẽ đúng. Tuy nhiên, tôi thường gặp R trong bối cảnh mà trên thực tế, nó rất giống với ngôn ngữ truy vấn.

R là môi trường và ngôn ngữ tính toán thống kê dành cho tính toán tĩnh và trực quan hóa (theo này).

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Lấy do đó. Nhân tiện, tôi khuyên bạn nên dùng nó, chất liệu tốt.

Tại sao một nhà khoa học dữ liệu cần biết R? Ít nhất, bởi vì có một lượng lớn người không chuyên về CNTT phân tích dữ liệu trong R. Tôi đã xem nó ở những nơi sau:

  • Lĩnh vực dược phẩm.
  • Các nhà sinh vật học.
  • Lĩnh vực tài chính.
  • Những người có trình độ học vấn thuần túy về toán học làm việc với các số liệu thống kê.
  • Các mô hình thống kê chuyên dụng và mô hình học máy (thường chỉ có thể tìm thấy trong phiên bản của tác giả dưới dạng gói R).

Tại sao nó thực sự là một ngôn ngữ truy vấn? Ở dạng thường thấy, nó thực sự là một yêu cầu tạo một mô hình, bao gồm đọc dữ liệu và sửa các tham số truy vấn (mô hình), cũng như hiển thị dữ liệu trong các gói như ggplot2 - đây cũng là một dạng viết truy vấn .

Các truy vấn mẫu để trực quan hóa

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

Nói chung, nhiều ý tưởng từ R đã chuyển sang các gói python như pandas, numpy hoặc scipy, như dataframes và data vectorization - vì vậy nhìn chung, rất nhiều thứ trong R sẽ có vẻ quen thuộc và tiện lợi với bạn.

Có rất nhiều nguồn để nghiên cứu, ví dụ, này.

Đồ thị tri thức

Ở đây tôi có một trải nghiệm hơi bất thường, vì tôi thường xuyên phải làm việc với biểu đồ tri thức và ngôn ngữ truy vấn cho biểu đồ. Do đó, chúng ta hãy điểm qua những điều cơ bản một cách ngắn gọn vì phần này kỳ lạ hơn một chút.

Trong cơ sở dữ liệu quan hệ cổ điển, chúng ta có một lược đồ cố định, nhưng ở đây lược đồ này rất linh hoạt, mỗi vị từ thực sự là một “cột” và thậm chí còn hơn thế nữa.

Hãy tưởng tượng rằng bạn đang làm mẫu cho một người và muốn mô tả những điều quan trọng, chẳng hạn, hãy lấy một người cụ thể, Douglas Adams, và sử dụng mô tả này làm cơ sở.

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
www.wikidata.org/wiki/Q42

Nếu sử dụng cơ sở dữ liệu quan hệ, chúng ta sẽ phải tạo một hoặc nhiều bảng lớn với số lượng cột khổng lồ, hầu hết trong số đó sẽ là NULL hoặc chứa một số giá trị Sai mặc định, chẳng hạn, không chắc nhiều người trong chúng ta có một mục trong thư viện quốc gia Hàn Quốc - tất nhiên, chúng ta có thể đặt chúng vào các bảng riêng biệt, nhưng điều này cuối cùng sẽ là một nỗ lực để mô hình hóa một mạch logic linh hoạt với các vị từ sử dụng một quan hệ cố định.

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Vì vậy, hãy tưởng tượng rằng tất cả dữ liệu được lưu trữ dưới dạng biểu đồ hoặc dưới dạng biểu thức boolean nhị phân và đơn nhất.

Bạn thậm chí có thể gặp phải điều này ở đâu? Thứ nhất, làm việc với dữ liệu wikivà với bất kỳ cơ sở dữ liệu đồ thị hoặc dữ liệu được kết nối nào.

Sau đây là các ngôn ngữ truy vấn chính mà tôi đã sử dụng và làm việc.

SPARQL

Wiki:
SPARQL (từ viết tắt đệ quy từ Eng. Giao thức SPARQL và Ngôn ngữ truy vấn RDF) - ngôn ngữ truy vấn dữ liệu, được biểu thị bằng mô hình RDFgiao thức để truyền tải những yêu cầu này và đáp ứng chúng. SPARQL là một khuyến nghị Hiệp hội W3C và một trong những công nghệ web ngữ nghĩa.

Nhưng trên thực tế, nó là ngôn ngữ truy vấn dành cho các vị từ logic đơn nhất và nhị phân. Bạn chỉ đơn giản là xác định có điều kiện những gì được cố định trong biểu thức Boolean và những gì không (rất đơn giản).

Bản thân cơ sở RDF (Khung mô tả tài nguyên), trên đó các truy vấn SPARQL được thực thi, là một bộ ba object, predicate, subject - và truy vấn chọn các bộ ba cần thiết theo các hạn chế được chỉ định về mặt tinh thần: tìm một X sao cho p_55(X, q_33) là đúng - trong đó, tất nhiên, p_55 là một loại quan hệ nào đó với ID 55, và q_33 là một đối tượng có ID 33 (ở đây và toàn bộ câu chuyện, một lần nữa lược bỏ tất cả các loại chi tiết).

Ví dụ về trình bày dữ liệu:

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu
Hình ảnh và ví dụ với các nước tại đây do đó.

Ví dụ truy vấn cơ bản

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

Trong thực tế, chúng ta muốn tìm giá trị của biến ?country sao cho vị ngữ
member_of, đúng là member_of(?country,q458) và q458 là ID của Liên minh Châu Âu.

Một ví dụ về truy vấn SPARQL thực bên trong công cụ python:

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

Thông thường, tôi phải đọc SPARQL thay vì viết nó - trong tình huống đó, có thể sẽ là một kỹ năng hữu ích nếu hiểu ngôn ngữ đó ít nhất ở mức cơ bản để hiểu chính xác cách truy xuất dữ liệu. 

Có rất nhiều tài liệu để học trực tuyến: ví dụ như ở đây này и này. Tôi thường google các thiết kế và ví dụ cụ thể và bây giờ thế là đủ.

Ngôn ngữ truy vấn logic

Bạn có thể đọc thêm về chủ đề này trong bài viết của tôi đây. Và ở đây, chúng ta sẽ chỉ xem xét ngắn gọn lý do tại sao các ngôn ngữ logic lại rất phù hợp để viết truy vấn. Về cơ bản, RDF chỉ là một tập hợp các câu lệnh logic có dạng p(X) và h(X,Y), và một truy vấn logic có dạng sau:

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

Ở đây chúng ta đang nói về việc tạo một vị từ mới đầu ra/1 (/1 có nghĩa là đơn nguyên), với điều kiện là đối với X đúng là quốc gia(X) - tức là X là một quốc gia và cũng là member_of(X,"EU ").

Nghĩa là, trong trường hợp này, cả dữ liệu và quy tắc đều được trình bày theo cùng một cách, điều này giúp mô hình hóa các vấn đề rất dễ dàng và tốt.

Bạn đã gặp ở đâu trong ngành?: cả một dự án lớn với một công ty viết các truy vấn bằng ngôn ngữ như vậy, cũng như về dự án hiện tại trong lõi của hệ thống - có vẻ như đây là một điều khá kỳ lạ, nhưng đôi khi nó vẫn xảy ra.

Một ví dụ về đoạn mã trong wikidata xử lý ngôn ngữ logic:

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

Tài liệu: Ở đây tôi sẽ cung cấp một số liên kết đến ngôn ngữ lập trình logic hiện đại Lập trình bộ câu trả lời - Tôi khuyên bạn nên nghiên cứu nó:

Ghi chú của nhà khoa học dữ liệu: Đánh giá cá nhân về ngôn ngữ truy vấn dữ liệu

Nguồn: www.habr.com

Thêm một lời nhận xét