Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
Мен сізге қай жерде және қашан пайдалы болғанын жеке тәжірибемнен айтып отырмын. Бұл шолу және тезис, әрі қарай нені және қайда қазуға болатынын түсіну үшін - бірақ бұл жерде менде тек субъективті жеке тәжірибе бар, мүмкін сіз үшін бәрі мүлдем басқаша.

Неліктен сұрау тілдерін білу және қолдана білу маңызды? Негізінде Data Science жұмыстың бірнеше маңызды кезеңдерін қамтиды және ең бірінші және ең маңыздысы (онсыз, әрине, ештеңе жұмыс істемейді!) деректерді алу немесе шығару. Көбінесе деректер бір жерде қандай да бір пішінде отырады және сол жерден «шығару» қажет. 

Сұрау тілдері дәл осы деректерді шығаруға мүмкіндік береді! Ал бүгін мен сізге пайдалы болған сұрау тілдері туралы айтып беремін және сізге қай жерде және қалай нақты оқу керек екенін айтып беремін.

Деректер сұрау түрлерінің үш негізгі блогы болады, біз осы мақалада талқылаймыз:

  • «Стандартты» сұрау тілдері реляциялық алгебра немесе SQL сияқты сұрау тілі туралы сөйлескенде жиі түсінілетін нәрсе.
  • Сценарий сұрау тілдері: мысалы, Python нәрселері пандалар, numpy немесе қабық сценарийлері.
  • Білім графиктері мен графикалық дерекқорларға арналған сұрау тілдері.

Мұнда жазылғанның бәрі жай ғана жеке тәжірибе, пайдалы болғаны, жағдайлардың сипаттамасы және «бұл не үшін қажет болды» - әркім осы тілдерді түсініп, ұқсас жағдайлар сіздің алдыңызда қалай болатынын және оларға алдын ала дайындалуға тырысуы мүмкін Сіз жобаға (шұғыл) өтініш бермес бұрын немесе тіпті қажет жобаға бармас бұрын.

«Стандартты» сұрау тілдері

Стандартты сұрау тілдері дәл осы мағынада, біз әдетте сұраулар туралы сөйлескенде олар туралы ойлаймыз.

Реляциялық алгебра

Реляциялық алгебра бүгін не үшін қажет? Сұрау тілдерінің неліктен белгілі бір түрде құрылымдалғанын және оларды саналы түрде қолдануын жақсы түсіну үшін олардың негізінде жатқан өзегін түсіну керек.

Реляциялық алгебра дегеніміз не?

Формальды анықтамасы келесідей: реляциялық алгебра реляциялық деректер үлгісіндегі қатынастарға операциялардың жабық жүйесі болып табылады. Кішкене адамдық тілмен айтқанда, бұл нәтиже әрқашан кесте болатындай кестелердегі операциялар жүйесі.

Барлық реляциялық операцияларды қараңыз бұл Хабр мақаласы - мұнда біз не үшін білу керек екенін және оның қай жерде пайдалы екенін сипаттаймыз.

Неліктен?

Сұрау тілдері қандай екенін және белгілі бір сұрау тілдеріндегі өрнектердің артында қандай операциялар тұрғанын түсінуді бастау көбінесе сұрау тілдерінде не және қалай жұмыс істейтінін тереңірек түсінуге мүмкіндік береді.

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
-дан алынған бұл мақалалар. Операцияның мысалы: кестелерді біріктіретін біріктіру.

Оқуға арналған материалдар:

Стэнфордтан жақсы кіріспе курс. Жалпы, реляциялық алгебра және теория бойынша көптеген материалдар бар - Coursera, Udacity. Сондай-ақ Интернетте көптеген материалдар бар, соның ішінде жақсы академиялық курстар. Менің жеке кеңесім: сіз реляциялық алгебраны өте жақсы түсінуіңіз керек - бұл негіздердің негізі.

SQL

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
-дан алынған бұл мақалалар.

SQL негізінен реляциялық алгебраны жүзеге асыру болып табылады - маңызды ескертумен, SQL декларативті болып табылады! Яғни, реляциялық алгебра тілінде сұраныс жазғанда, сіз шынымен қалай есептеу керектігін айтасыз - бірақ SQL көмегімен сіз нені алғыңыз келетінін көрсетесіз, содан кейін ДҚБЖ реляциялық алгебра тілінде (олардың эквиваленттігі бізге белгілі Кодд теоремасы).

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
-дан алынған бұл мақалалар.

Неліктен?

Реляциялық ДҚБЖ: Oracle, Postgres, SQL Server және т.б. әлі де іс жүзінде барлық жерде және олармен өзара әрекеттесуге тура келетін керемет ықтималдық бар, яғни сізге SQL оқу керек (бұл өте ықтимал) немесе оны жазу керек ( екіталай емес).

Не оқып, не оқу керек

Жоғарыдағы бірдей сілтемелерге сәйкес (реляциялық алгебра туралы) материалдың керемет саны бар, мысалы, бұл.

Айтпақшы, NoSQL дегеніміз не?

«NoSQL» терминінің мүлдем стихиялық шығу тегі бар екенін және оның артында жалпы қабылданған анықтамасы немесе ғылыми институты жоқ екенін тағы бір рет атап өткен жөн». Сәйкес мақала Хабрда.

Шын мәнінде, адамдар толық реляциялық модельдің көптеген мәселелерді шешу үшін қажет емес екенін түсінді, әсіресе, мысалы, өнімділік маңызды болып табылатын және жинақтауы бар белгілі бір қарапайым сұраулар басым болатындар үшін - бұл жерде метриканы жылдам есептеу және оларды келесіге жазу маңызды. дерекқор, және көптеген мүмкіндіктер реляциялық болып табылады, тек қажетсіз ғана емес, сонымен қатар зиянды болып шықты - егер ол біз үшін ең маңызды нәрсені (белгілі бір тапсырма үшін) - өнімділікті бұзатын болса, неге бір нәрсені қалыпқа келтіру керек?

Сондай-ақ, классикалық реляциялық модельдің бекітілген математикалық схемаларының орнына икемді схемалар жиі қажет болады - бұл жүйені орналастыру және нәтижелерді өңдеу, схеманы және сақталған деректердің түрлерін өңдеу өте маңызды болған кезде қолданбаларды әзірлеуді керемет жеңілдетеді. соншалықты маңызды емес.

Мысалы, біз сараптамалық жүйе жасап жатырмыз және кейбір мета ақпараттармен бірге белгілі бір доменде ақпаратты сақтағымыз келеді - біз барлық өрістерді білмеуіміз мүмкін және әр жазба үшін жай ғана JSON сақтаймыз - бұл бізге деректерді кеңейту үшін өте икемді орта береді. модель және тез қайталанатын - сондықтан бұл жағдайда NoSQL тіпті жақсырақ және оқылатын болады. Мысал енгізу (NoSQL қажет жерде болған жобаларымның бірінен).

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

Толығырақ осында NoSQL туралы.

Не оқу керек?

Мұнда, керісінше, тапсырмаңызды мұқият талдауыңыз керек, оның қандай қасиеттері бар және осы сипаттамаға сәйкес келетін қандай NoSQL жүйелері бар - содан кейін осы жүйені зерттеуді бастау керек.

Сценарийлік сұраныс тілдері

Бастапқыда, Python-ның оған жалпы не қатысы бар сияқты - бұл бағдарламалау тілі және сұраулар туралы емес.

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

  • Пандалар - бұл Швейцария армиясының деректер ғылымының пышағы; онда деректерді түрлендіру, біріктіру және т.б. көп мөлшерде болады.
  • Numpy - векторлық есептеулер, матрицалар және сызықтық алгебра.
  • Scipy - бұл пакетте математика көп, әсіресе статистика.
  • Jupyter зертханасы - көптеген зерттеу деректерін талдау ноутбуктерге жақсы сәйкес келеді - білу пайдалы.
  • Сұраныс – желімен жұмыс.
  • Pyspark деректер инженерлері арасында өте танымал, ең алдымен, олардың танымалдығына байланысты осы немесе Spark-пен өзара әрекеттесуге тура келеді.
  • *Selenium - сайттар мен ресурстардан деректерді жинау үшін өте пайдалы, кейде деректерді алудың басқа жолы жоқ.

Менің негізгі кеңесім: Python үйрен!

Панда

Мысал ретінде келесі кодты алайық:

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

Негізінде, біз кодтың классикалық SQL үлгісіне сәйкес келетінін көреміз.

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

Бірақ маңызды бөлігі, бұл код сценарий мен конвейердің бөлігі болып табылады; шын мәнінде, біз Python құбырына сұрауларды енгіземіз. Бұл жағдайда сұрау тілі бізге Pandas немесе pySpark сияқты кітапханалардан келеді.

Жалпы, pySpark-те біз сұрау тілі арқылы деректерді түрлендірудің ұқсас түрін көреміз:

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

Қайда және не оқу керек

Жалпы Python-да проблема емес оқуға қажетті материалдарды табу. Интернетте оқу құралдарының үлкен саны бар панда, pySpark және курстар ұшқын (және өзі де DS). Тұтастай алғанда, мұндағы мазмұн Google іздеу үшін тамаша, және мен назар аудару үшін бір пакетті таңдау керек болса, бұл, әрине, пандалар болар еді. DS+Python материалдарының комбинациясы туралы да өте көп.

Shell сұрау тілі ретінде

Мен жұмыс істеген бірнеше деректерді өңдеу және талдау жобалары, шын мәнінде, Python, Java және қабық командаларының өздері кодты шақыратын қабық сценарийлері. Сондықтан, жалпы алғанда, сіз bash/zsh/etc ішіндегі құбырларды жоғары деңгейлі сұраудың қандай да бір түрі ретінде қарастыра аласыз (әрине, онда циклдарды толтыра аласыз, бірақ бұл қабықша тілдеріндегі DS кодына тән емес), берейік. қарапайым мысал - маған викидеректердің QID картасын және орыс және ағылшын викилеріне толық сілтемелерді жасау керек болды, ол үшін мен bash командаларынан қарапайым сұраныс жаздым және нәтиже үшін Python-да қарапайым сценарий жаздым. былай біріктіріңіз:

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

қайда

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

Бұл, шын мәнінде, қажетті картаны жасаған барлық құбыр болды; көріп отырғанымыздай, бәрі ағын режимінде жұмыс істеді:

  • pv файл жолы - файл өлшеміне негізделген орындалу жолағын береді және оның мазмұнын әрі қарай береді
  • unpigz -c мұрағаттың бір бөлігін оқып, jq-ға берді
  • jq пернесі - ағын бірден нәтижені шығарды және оны Python-да постпроцессорға берді (бірінші мысалдағыдай)
  • ішкі, постпроцессор шығысты пішімдейтін қарапайым күй машинасы болды 

Жалпы алғанда, күрделі құбыр желісі үлкен деректерде (0.5 ТБ) ағын режимінде жұмыс істейді, айтарлықтай ресурстарсыз және қарапайым құбырдан және бірнеше құралдардан жасалған.

Тағы бір маңызды кеңес: терминалда жақсы және тиімді жұмыс істей білу және bash/zsh/etc жаза білу.

Қай жерде пайдалы болады? Иә, барлық жерде дерлік - тағы да Интернетте оқуға арналған көптеген материалдар бар. Атап айтқанда, мұнда бұл менің алдыңғы мақалам.

R сценарийі

Тағы да, оқырман айқайлауы мүмкін - бұл тұтас бағдарламалау тілі! Және, әрине, ол дұрыс болады. Дегенмен, мен әдетте R-ді осындай контексте кездестірдім, бұл шын мәнінде ол сұрау тіліне өте ұқсас болды.

R – статистикалық есептеу ортасы және статикалық есептеулер мен визуализацияға арналған тіл (сәйкес бұл).

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
алынды мұнда. Айтпақшы, мен оны ұсынамын, жақсы материал.

Неліктен деректер ғалымы R білуі керек? Кем дегенде, R тілінде деректерді талдайтын IT емес адамдардың үлкен қабаты болғандықтан. Мен оны келесі жерлерде кездестірдім:

  • Фармацевтикалық сектор.
  • Биологтар.
  • Қаржы секторы.
  • Статистикамен айналысатын таза математикалық білімі бар адамдар.
  • Мамандандырылған статистикалық модельдер және машиналық оқыту үлгілері (оларды көбінесе R пакеті ретінде авторлық нұсқада табуға болады).

Неліктен бұл шын мәнінде сұрау тілі? Ол жиі кездесетін пішінде, бұл шын мәнінде деректерді оқуды және сұрау (модель) параметрлерін бекітуді, сондай-ақ ggplot2 сияқты пакеттердегі деректерді визуализациялауды қоса алғанда, модель құруға сұраныс - бұл да сұрауларды жазудың бір түрі. .

Визуализацияға арналған мысал сұраулары

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

Жалпы, R-дан көптеген идеялар пандалар, numpy немесе scipy сияқты деректер фреймдері және деректерді векторлау сияқты питон пакеттеріне көшірілді - сондықтан жалпы R тіліндегі көп нәрсе сізге таныс және ыңғайлы болып көрінеді.

Зерттеуге арналған көптеген дереккөздер бар, мысалы, бұл.

Білім графигі

Бұл жерде менде аздап ерекше тәжірибе бар, өйткені маған білім графиктерімен және графиктер үшін сұрау тілдерімен жиі жұмыс істеуге тура келеді. Сондықтан, қысқаша негіздерге тоқталайық, өйткені бұл бөлік сәл экзотикалық.

Классикалық реляциялық дерекқорларда бізде бекітілген схема бар, бірақ бұл жерде схема икемді, әрбір предикат шын мәнінде «баған» және одан да көп.

Сіз адамды модельдедіңіз және негізгі нәрселерді сипаттағыңыз келді деп елестетіп көріңіз, мысалы, белгілі бір адамды, Дуглас Адамсты алайық және осы сипаттаманы негізге алайық.

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
www.wikidata.org/wiki/Q42

Егер біз реляциялық дерекқорды пайдалансақ, біз үлкен кестені немесе бағандардың үлкен саны бар кестелерді жасауымыз керек еді, олардың көпшілігі NULL болады немесе кейбір әдепкі False мәнімен толтырылады, мысалы, көпшілігімізде бұл екіталай. Кореяның ұлттық кітапханасына кіру - әрине, біз оларды бөлек кестелерге қоюға болады, бірақ бұл, сайып келгенде, бекітілген реляциялық схеманы пайдалана отырып, предикаттармен икемді логикалық схеманы модельдеу әрекеті болар еді.

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
Сонымен, барлық деректер график түрінде немесе екілік және унарлы логикалық өрнектер түрінде сақталады деп елестетіңіз.

Мұны қай жерде кездестіруге болады? Біріншіден, жұмыс деректер вики, және кез келген графикалық дерекқорлармен немесе қосылған деректермен.

Төменде мен пайдаланған және жұмыс істеген негізгі сұрау тілдері берілген.

SPARQL

Wiki:
SPARQL (рекурсивті аббревиатура от Eng. SPARQL протоколы және RDF сұрау тілі) - деректерді сұрау тілі, үлгісімен көрсетілген РДФ, және де хаттама осы сұрауларды жіберу және оларға жауап беру. SPARQL – бұл ұсыныс W3C консорциумы және технологиялардың бірі семантикалық желі.

Бірақ шын мәнінде бұл логикалық унарлық және екілік предикаттарды сұрау тілі. Сіз жай ғана логикалық өрнекте ненің бекітілгенін және ненің жоқтығын шартты түрде көрсетесіз (өте жеңілдетілген).

SPARQL сұраулары орындалатын RDF (Resource Description Framework) базасының өзі үш еселік. object, predicate, subject - және сұрау рухта көрсетілген шектеулерге сәйкес қажетті үштіктерді таңдайды: p_55(X, q_33) ақиқат болатындай Х-ті табыңыз - мұнда, әрине, p_55 - ID 55-пен қандай да бір қатынас түрі, ал q_33 - бұл идентификаторы 33 нысаны (осы жерде және бүкіл оқиға, тағы да барлық мәліметтерді жіберіп алмай).

Деректерді ұсыну мысалы:

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы
Мұнда елдермен суреттер мен мысалдар мұнда.

Негізгі сұрау мысалы

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

Шын мәнінде, біз предикат үшін ?country айнымалысының мәнін тапқымыз келеді
member_of, member_of(?country,q458) және q458 Еуропалық Одақтың идентификаторы екені рас.

Python қозғалтқышындағы нақты SPARQL сұрауының мысалы:

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

Әдетте, мен оны жазудың орнына SPARQL-ді оқуға тура келді - бұл жағдайда деректердің қалай шығарылатынын түсіну үшін тілді кем дегенде базалық деңгейде түсіну пайдалы дағды болар еді. 

Интернетте оқуға болатын материал көп: мысалы, мұнда бұл и бұл. Мен әдетте Google-ге арнайы дизайндар мен мысалдарды іздеймін және бұл қазірге жеткілікті.

Логикалық сұрау тілдері

Тақырып бойынша толығырақ менің мақаламнан оқи аласыз осында. Бұл жерде логикалық тілдер неліктен сұрауларды жазу үшін қолайлы екенін қысқаша ғана қарастырамыз. Негізінде, RDF - бұл p(X) және h(X,Y) пішінінің логикалық мәлімдемелерінің жиынтығы және логикалық сұраудың келесі пішіні бар:

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

Бұл жерде біз жаңа предикат шығысын/1 (/1 біртұтас дегенді білдіреді) жасау туралы айтып отырмыз, егер X үшін ел(X) - яғни X ел, сонымен қатар(X,"ЕО") мүшесі екені рас болса.

Яғни, бұл жағдайда деректер де, ережелер де бірдей түрде беріледі, бұл есептерді өте оңай және жақсы модельдеуге мүмкіндік береді.

Өндірісте қай жерде кездестіңіз?: осындай тілде сұрауларды жазатын компаниямен тұтас үлкен жоба, сондай-ақ жүйенің өзегіндегі ағымдағы жоба - бұл өте экзотикалық нәрсе сияқты көрінуі мүмкін, бірақ кейде солай болады.

Логикалық тілдегі викидеректерді өңдеудегі код фрагментінің мысалы:

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

Материалдар: Мен мұнда заманауи логикалық бағдарламалау тіліне бірнеше сілтеме беремін Answer Set Programming - Мен оны оқуды ұсынамын:

Деректер зерттеушісінің ескертпесі: Деректер сұрау тілдерінің дербестендірілген шолуы

Ақпарат көзі: www.habr.com

пікір қалдыру