ProHoster > Blog > nûçeyên înternetê > Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery
Meriv çawa raporên hêsan ji robotek re şandiye. Nivîsandina botek li Python û Google BigQuery
Karên we hene ku roj bi roj, hefte bi hefte dubare dikin? Ji bo nimûne, nivîsandina raporan. Hûn daneyan daxwaz dikin, wê analîz bikin, wê xuyang bikin (grafîkan, nexşeyan çêbikin), û dûv re wê ji serokê xwe re bişînin. Lê eger ev hemî bixweber bû?
Di vê tutoriyê de em ê botekek ji bo Telegram-ê biafirînin ku dê alîkariya raporkirina otomatîk bike. Û ya herî xweş ev e ku hemî bername dê tenê ji 50 rêzikên kodê pêk were! Ger hûn cara yekem botekek ji bo Telegram diafirînin, wê hingê divê hûn vê yekê jî bixwînin post.
Em bînin bîra xwe:ji bo hemî xwendevanên "Habr" - dema ku hûn beşdarî qursek Skillbox-ê bi karanîna koda danasînê ya "Habr" têne qeyd kirin 10 rubleyan dakêşin.
pip3 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot saz bike
Girêdana Google BigQuery API
Ger em dixwazin karûbarê bikar bînin, divê em API-ya Google BigQuery ve girêbidin. Ji bo vê yekê em diçin Console Developers of Google û projeyek nû biafirînin (an jî yek heyî hilbijêrin).
Di panela kontrolê de, APIS Û XIZMETÊN ENABLE hilbijêrin û li API-a BigQuery bigerin.
Ji bo girêdana API-ê çalak bike hilbijêrin.
Mifteyek hesabek çêbikin
Ka em dîsa herin Console Developers of Google, tabloya pêbaweriyê hilbijêrin, pêbaweriyê biafirînin û mifteya hesabê karûbarê.
Dûv re - Hesabê karûbarê nû, û navê di qada navê hesabê karûbarê de binivîsin.
Ji navnîşa dakêşana Rolê, Proje> Xwedî hilbijêrin, paşê Biafirînin.
Pela ku dê bixweber were daxistin jê re creds.json tê gotin.
GOOGLE_APPLICATION_CREDENTIALS saz bike, di termînalê de riya creds.json diyar bike.
Ev fonksiyon dê daxwazê wekî çarçoveyek daneyê vegerîne.
Visualizing data
Ji bo çareserkirina vê pirsgirêkê, matplotlib hilbijêrin.
matplotlib.pyplot wekî plt têxe
Pêdiviya me bi pênc pîvanan heye, ku x daneya eksê ye, x_label sernavê eksê ye, y daneya y-ê ye, y_label sernavê eksê ye, û sernav sernavê tevahiya dîtbariyê ye.
def visualize_bar_chart(x, x_label, y, y_label, title):
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
index = np.arange(len(x))
plt.xticks(index, x, fontsize=5, rotation=30)
plt.bar(index, y)
return plt
Wêne tomar bike
Naha em du fonksiyonan bikar bînin da ku dîmenek çêbikin û wê hilînin.
Em ê hejmara postên ku rojane têne weşandin bişînin. Pêşî em daxwazek dinivîsin.
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
Lêpirsîn ji 2-ê Kanûna Pêşîn, 2018-an pê ve du hefte ji berhevkirina daneyan re dibe alîkar.
Em vê tarîxê bikar tînin ji ber ku 2018-12-02 daneya herî dawî ye ku di bigquery-public-data.stackoverflow.post_history de hatî tomar kirin, di rewşên din de hûn dikarin CURRENT_DATE() bikar bînin da ku daneya herî nû bistînin.
Ji bo wergirtina daneyê bangî fonksiyona query_to_bigquery bikin.
dataframe = query_to_bigquery (pirsîn)
Dûv re em stûna daneya tarîxê ji bo eksê x-ê, û stûna total_posts ji bo y-xebatê bikar tînin.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
Em wê bi karanîna fonksiyona visualize_bar_chart xuya dikin û wekî wêneyek hilînin.
Em vê kodê di fonksiyonek bi navê get_and_save_image de dipêçin.
def get_and_save_image():
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
dataframe = query_to_bigquery(query)
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
Wêneyek bişînin
Ji bo ku hûn raporek ji wergir re bişînin, hûn hewce ne ku pîvana chat_id zanibin.
Em bikar tînin userinfobot û binivîsin / dest pê bikin. Bot bi agahdariya pêwîst bersiv dide, chat_id di qada id de heye.
Naha em fonksiyona send_image biafirînin. Ew ê fonksiyona get_and_save_image bikar bîne da ku wêneyê bigire û hilîne. Û paşê em her tiştî bi têkiliya rast re bişînin.