החזקת נתונים מדהימה עם Power BI Python

האם ההנהלה שלך רוצה לדעת הכל על פיננסי החברה והיצוב הפרודוקטיבי, אך לא מוכנה לשום דולר על כלי ניהול טכנולוגיה מתקדם? אל תסתייג מכלים שונים למלאי, חיוב ומערכות כרטיסים. יש רק צורך במערכת מרכזית אחת. למה לא לשקול את Power BI Python?

Power BI יכול להפוך משימות מזמן ומתישות לתהליכים אוטומטיים. ובמדריך הזה, תלמד כיצד לחתוך ולשלב את הנתונים שלך בדרכים שלא תוכל לדמות.

בוא תחסוך לעצמך את הלחץ של הבדיקה המורכבת של דוחות!

דרישות קדם

מדובר במדריך מעשי. אם ברצונך לעקוב, וודא שיש לך את התכנים הבאים:

  • A Windows Server – This tutorial uses a Windows Server 2022.
  • Power BI Desktop מותקן על השרת שלך – המדריך משתמש בגרסת Power BI Desktop v2.105.664.0.
  • Gateway נתונים מקומי מותקן על התקנים חיצוניים שתכוון להשתמש בגרסת Desktop.
  • פייתון גרסה 3.6 או מאוחר יותר מותקן – המדריך הזה משתמש בפייתון גרסה 3.10.5.
  • DBeaver מותקן – המדריך הזה משתמש ב-DBeaver גרסה 22.0.2.

בניית מסד נתונים של MySQL

Power BI יכול להמחיש נתונים בצורה יפה, אך עליך לאחזר ולאחסן אותם לפני שתוכל להתחיל בהמחשה של הנתונים. אחת הדרכים הטובות ביותר לאחסן נתונים היא במסד נתונים. MySQL הוא כלי מסד נתונים חזק וחינמי.

1. פתח מזהה פקודה כמנהל מערכת, הרץ את הפקודה mysql למטה והזן את שם המשתמש הראשי (-u) והסיסמה (-p) כשידרוש.

באופן ברירת מחדל, רק משתמש השורש יש לו הרשאה לבצע שינויים במסד הנתונים.

mysql -u root -p
Logging into MySQL as the root

2. הרץ את השאילתה למטה כדי ליצור משתמש במסד נתונים חדש (CREATE USER) עם סיסמה (IDENTIFIED BY). אתה יכול לתת שם שונה למשתמש, אבל במדריך זה בחרו בשם ata_levi.

CREATE USER 'ata_levi'@'localhost' IDENTIFIED BY 'Password';
Creating a new database user

3. לאחר שיצרת משתמש, הרץ את השאילתה למטה כדי להעניק הרשאות (ALL PRIVILEGES) למשתמש החדש, כגון יצירת מסד נתונים בשרת.

GRANT ALL PRIVILEGES ON . TO 'ata_levi'@'localhost' WITH GRANT OPTION;
Granting privileges to the newly-created user

4. כעת, הרץ את הפקודה \q למטה כדי להתנתק מ-MySQL.

Logging out from MySQL as root

5. הרץ את פקודת הmysql למטה כדי להתחבר כמשתמש מסד הנתונים החדש שנוצר (ata_levi).

mysql -u ata_levi -p
Logging in to MySQL as ata_levi

6. לבסוף, הרץ את השאילתה הבאה כדי ליצור מסד נתונים חדש בשם ata_database. אבל כמובן, אתה יכול לתת שם שונה למסד הנתונים.

CREATE DATABASE ata_database;
Creating a new database (ata_database)

ניהול מסדי נתונים ב־DBeaver

בניהול מסדי נתונים, נדרשת ידע ב-SQL בדרך כלל. אך עם DBeaver, יש לך ממשק משתמש גרפי שבו תוכל לנהל את מסדי הנתונים שלך במספר לחיצות, ו-DBeaver יטפל בהצהרות ה-SQL עבורך.

1. פתח את DBeaver מהשולחן העבודה שלך או מתפריט ההתחלה.

2. כאשר DBeaver נפתח, לחץ על תפריט החיבור למסד נתונים החדש ובחר MySQL כדי להתחיל בחיבור לשרת MySQL שלך.

Accessing MySQL via DBeaver

3. התחבר לשרת MySQL המקומי שלך עם הפרטים הבאים:

  • שמור את מארח השרת כ- localhost ואת הפורט על 3306 מאחר ואתה מתחבר לשרת מקומי.
  • ספק את הפרטים האישיים של המשתמש ata_levi (שם משתמש וסיסמה) משלב שני של סעיף "בניית מסד נתונים ב-MySQL" ולחץ על סיום כדי להתחבר ל-MySQL.
Logging in to MySQL

שלב 4. כעת, הרחב את מסד הנתונים שלך (ata_database) תחת Navigator המסד נתונים (לחץ ימינה) → לחץ ימינה על Tables, ובחר Create New Table כדי ליצור טבלה חדשה.

Creating a new database table with DBeaver GUI.

5. הקש שם לטבלה החדשה שלך, אך בתרומה הבחירה היא ata_Table, כפי שמוצג למטה.

ודא ששם הטבלה תואם לשם הטבלה שתציין בשלב שבע של שלב "קבלת וצריכת נתוני API".

Naming the new table

6. לבסוף, הרחב את הטבלה החדשה (ata_table) → לחץ ימינה על Columns → בחר Create New Column כדי ליצור עמוד חדש.

Initiating creating a new column

7. הזן שם עמוד, כפי שמוצג למטה, וסמן את תיבת Not Null, ולחץ על OK כדי ליצור את העמוד החדש.

באופן אידיאלי, תרצה להוסיף עמוד בשם "id". למה? רוב ה- API יכילו id, וטבלת המספרים של פנדס בפייתון תמלא אוטומטית את העמודים האחרים.

Creating a column

8. לחץ על שמור (למטה ימינה) או הקש Ctrl+S כדי לשמור את השינויים לאחר שאימתת את העמוד החדש שיצרת (id), כפי שמוצג למטה.

Verifying newly-created column

9. לבסוף, לחץ על Persist כדי לשמור את השינויים שביצעת במסד הנתונים שלך.

Persisting the database changes

קבלת וצריכת נתוני API

עכשיו שיצרת את מסד הנתונים לאחסון הנתונים, עליך לקבל את הנתונים מספק ה- API שלך המתאימים ולהעבירם למסד הנתונים שלך באמצעות פייתון. תגיד את הנתונים שלך להיות מוצגים ב- Power BI.

כדי להתחבר לספק ה- API שלך, תצטרך לקבל שלושה רכיבים מפתח; אמצעי האישור, כתובת ה- URL הבסיסית של ה- API, ונקודת הסיום של ה- API. אם יש ספק לגבי או איך לקבל את המידע הזה, בקר באתר התיעוד של ספק ה- API שלך.

הנה דף תיעוד מ-Syncro.

Overviewing Syncro API documentation

1. פתח את VS Code, צור קובץ Python ותקן את שם הקובץ לפי המידע שמצפה לו ה- API מהקובץ. קובץ זה יהיה אחראי לאחזר ולדחוף את נתוני ה- API לבסיס הנתונים שלך (חיבור למסד הנתונים).

ישנם ספריות רבות של Python זמינות לעזור בחיבור למסד הנתונים, אך תשתמש ב־SQLAlchemy במדריך זה.

הפעל את הפקודה pip למטה בטרמינל של VS Code כדי להתקין את SQLAlchemy בסביבת העבודה שלך.

pip install SQLAlchemy
Installing SQLAlchemy

2. לאחר מכן, צור קובץ בשם connection.py, מלא את הקוד למטה, החלף את הערכים בהתאם, ושמור את הקובץ.

כאשר אתה מתחיל לכתוב סקריפטים לתקשורת עם בסיס הנתונים שלך, יש להקים חיבור לבסיס הנתונים לפני שהבסיס מקבל כל פקודה.

במקום לכתוב מחדש את מחרוזת החיבור לבסיס הנתונים לכל סקריפט שאתה כותב, הקוד למטה מיועד ליצירת חיבור זה כך שיהיה ניתן לקרוא אליו או להתייחס אליו מסקריפטים אחרים.

# יבוא מודולים
# מנוע חיבור מ־SQLAlchemy
from sqlalchemy import create_engine
import sqlalchemy as db
from sqlalchemy.exc import SQLAlchemyError

# שימוש בלוגיקת try/except ליצירת חיבור למסד נתונים של MySQL
# מספק את פרטי שרת ה-MySQL למטה:
# db: שם בסיס הנתונים
# משתמש: שם משתמש
# סיסמה: סיסמה
try:
    engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
    .format(
        db="ata_database",
        user="ata_levi",
        pw="password"
    ))
    print("Connected")
except SQLAlchemyError as e:
    error = str(e.dict['orig'])
print(error)

3. פתח את הטרמינל של Visual Studio (Ctrl+Shift+`), והרץ את הפקודות הבאות כדי להתקין את pandas ו-requests.

pip install pandas
pip install requests
Installing pandas and requests

4. צור קובץ פייתון נוסף בשם invoices.py (או תקנה אותו בשם שונה), ומלא את הקוד לתוך הקובץ.

תוסיף קטעי קוד לקובץ invoices.py בכל צעד לפי כל תת קטע, אך תוכל לראות את הקוד השלם ב-Github של ATA.

הסקריפט invoices.py יופעל מהסקריפט הראשי שיתאר בקטע הבא, שמשיך את המידע הראשוני מה-API שלך.

הקוד למטה מבצע את הפעולות הבאות:

  • צריבת מידע מה-API שלך וכתיבתו לבסיס הנתונים שלך.
  • החלפת אמצעי האימות, המפתח, כתובת ה-URL הבסיסית ונקודות הקצה של ה-API עם פרטי הכניסה שלך ל-API.
# יבוא מודולים חיוניים
import pymysql
from pandas.core.frame import DataFrame
import requests
import pandas as pd
from requests.api import get
from sqlalchemy.dialects.mysql import LONGTEXT

import os
import schedule
import time
import asyncio

# יבוא מחרוזת החיבור מ-connection.py
from connection import engine

5. הוסף את קטע הקוד לקובץ invoices.py כדי להגדיר את הכותרות, לדוג:

  • סוג המבנה של המידע שאתה מצפה לקבל מה-API שלך.
  • ה-URL הבסיסי ונקודת הקצה צריכים להלוות את אמצעי האימות והמפתח הרלוונטי.

ודא שאתה משנה את הערכים למעלה עם הערכים האמיתיים שלך.

# הגדרת פרמטרי הבקשה.
headers = {
'accept':'application/json',
'authorization':'Bearer *Your-bearer-code if the authentication is Bearer*'
}
baseurl = 'https://*your base url*'
endpoint  = 'your endpoint' 

6. הוסף לקובץ invoices.py את הפונקציה האסינכרונית הבאה למטה.

הקוד למטה משתמש ב-AsyncIO כדי לנהל סקריפטים מרובים מסקריפט ראשי אחד, כפי שמתואר בקטע הבא. כאשר הפרויקט שלך מתרחב וכולל יותר מקוד API אחד, זה נהיה תרגול טוב להפעיל את סקריפטי הצריבה שלך בקבצים נפרדים.

# עטוף את הקוד עם פונקציה אסינכרונית כדי להפוך אותו לאסינכרוני.
async def get_invoices():
	print("Going through the invoices")
	def main_request(baseurl,endpoint,x,headers):
	# באמצעות שימוש בשיטת get של request למשיכת נתונים באמצעות פרמטרים מוגדרים.
	# באמצעות מחרוזת f להשתמש באיטרציה בדפים כאשר הפונקציה נקראת.
	r = requests.get(baseurl + endpoint + f'?page={x}',headers=headers)
	return r.json()

7. לבסוף, הוסף את הקוד למטה לקובץ invoices.py, כאשר פונקצית get_pages מטפלת בפגינציה של ה-API שלך.

פונקציה זו מחזירה את מספר הדפים הכולל ב-API שלך ומסייעת לפונקציה range לעבור דרך כל הדפים.

יש ליצור קשר עם מפתחי ה-API שלך לגבי אמצעי הפגינציה שבהם משתמש ספק ה-API שלך.

  def get_pages(response):
			return response['meta']['total_pages']

	def parse_json(response):
	    charlist =[]
	    for item in response['invoices']:
	        charlist.append(item)
	    return charlist
	# קריאה לפונקציה הראשית עם פרמטרים מוגדרים מראש.
	data = main_request(baseurl=baseurl,endpoint=endpoint,x=1,headers=headers)
	
	main_invoices = []
	# סיבוב/פינוק בנתוני ה- API. 
  # ספק ה- API שלך ייתכן ויעשה שימוש בצורה שונה 
	# בשיטה לפינוק.
	for x in range(1,get_pages(data)+1):
	
	    print(x)
	    main_invoices.extend(parse_json(main_request(baseurl,endpoint,x,headers)))
	df_invoices = pd.DataFrame(main_invoices)
	
	# כתוב נתונים חדשים לבסיס הנתונים של SQL.
	# הערה: ודא ששם הטבלה בבסיס הנתונים תואם לשם הטבלה המסופק כאן.
	df_invoices.to_sql('invoices',con=engine,if_exists='replace',index=False)
	
  # פונקציה זו מחכה לפונקציה get_invoices,
	# מפעילה את הפונקציה get_invoices() כאשר נקרא,
	# ותיקרא על ידי קובץ חיצוני להפעיל את קריאת ה- API שלך.

async def call_invoices():
	await get_invoices()

אם תעדיפו להוסיף נקודות קצה נוספות של API לנתונים שלך:

  • חזור על שלבים ארבע עד שישה של קטע "ניהול מסדי נתונים ב-MySQL עם DBeaver".
  • חזור על כל השלבים בחלק "קבלת וצריכת נתוני API".
  • שנה את נקודת הקצה של ה- API לקצה אחר שתרצה לצרוך.

סנכרון נקודות הקצה של ה- API

עכשיו יש לך מסד נתונים וחיבור ל- API, ואתה מוכן להתחיל בצריכת ה- API על ידי הרצת הקוד בקובץ invoices.py. אך יש לך הגבלה לצרוף רק נקודת קצה אחת בו זמנית.

איך לעבור מעבר לגבול? תיצור קובץ Python נוסף כקובץ מרכזי שקורא פונקציות API מקבצי Python שונים ומריץ את הפונקציות אסינכרוניות באמצעות AsyncIO. בכך, אתה שומר על קוד תכנות נקי ומאפשר לך לארוז פונקציות מרובות יחד.

1. צור קובץ Python חדש בשם central.py והוסף את הקוד למטה.

דומה לקובץ invoices.py, תוסיף קטעי קוד לקובץ central.py בכל שלב, אך אתה יכול להציג את הקוד השלם ב- GitHub של ATA.

הקוד למטה מייבא מודולים חיוניים ותסריטים מקבצים אחרים באמצעות הקוד from <שם קובץ> import <שם פונקציה>.

from datetime import datetime
from numpy import product
# מיובאת פונקציית ה- API לאיסוף חשבוניות מ- invoices.py
from invoices import call_invoices
import asyncio
import time
import schedule
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime
import os

2. לבארץ, הוסף את הקוד הבא לשליטה על התסריטים מ- invoices.py בקובץ central.py.

עליך להתייחס/לקרוא לפונקציית הקריאה_לחשבוניות מ- invoices.py למשימת AsyncIO (משימת חשבונית) ב- central.py.

# יצירת הפונקציה הראשית
async def chain():
	def _handle_task_result(task: asyncio.Task) -> None:
		try:
				task.result()
		except asyncio.CancelledError:
				pass
		except Exception:
				logging.exception('Exception raised by task %r',task)
	start = time.perf_counter()
	# יצירת משימה עבור הפונקציה שיובאה מ- invoices.py
	invoice_task = asyncio.create_task(call_invoices())

שלב 3. לאחר יצירת המשימה AsyncIO, המתינו למשימה כדי לאחזר ולבצע את פונקציית call_invoices מתוך invoice.py כאשר פונקציית השרשור (בשלב שני) מתחילה לרוץ.

	# המתנה למשימה שנוצרה
	await invoice_task
	# מעקב אחר זמני המשימה
	end = time.perf_counter()-start
	l_time =  time.localtime()
	human_time = time.asctime(l_time)
	print (f"chained result took {end:0.2f} seconds")
	print(f"Current time is {human_time}")
	

4. צור AsyncIOScheduler כדי לתזמן עבור התסריט לבצע משימה. המשימה שנוספה בקוד זה מפעילה את פונקציית השרשור במרוודי שנייה.

המשימה הזו חשובה כדי לוודא שהתוכנית שלך ממשיכה להריץ את הסקריפטים שלך כדי לשמור על המידע שלך מעודכן.

if name == "main":
# השגת קוד שלולץ לא סופית ולקביעת הפסקות שינה בינה
    scheduler = AsyncIOScheduler()
scheduler.add_job(chain,'interval',seconds=1)
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:
	asyncio.get_event_loop().run_forever()
except (KeyboardInterrupt,SystemExit):
    pass

5. לבסוף, הפעילו את סקריפט central.py על VS Code, כפי שמוצג למטה.

Running the central.py script

לאחר הפעלת הסקריפט, תראו את הפלט בטרמינל כמו שמוצג למטה.

Viewing central.py script outputs

למטה, הפלט מאשר שחשבוניות נוספו למסד הנתונים.

Verifying invoices are added to the database

פיתוח Power BI Visuals

לאחר קודות תכנות שמתחברים למידע API ודוחסים את המידע הזה למסד נתונים, אתה כמעט מוכן לקצור מהמידע שלך. אבל תחילה, תדחוף את המידע במסד הנתונים ל-Power BI להמחשה, הסיום.

המון מידע הוא בלתי שימושי אם אתה לא יכול להמחיש את המידע ולהקשות על חיבורים עמוקים. למזלך, הוויזואליזציות של Power BI דומות לכיצד גרפים יכולים להפוך משוואות מתמטיות מסובכות לפשוטות ולניחוז.

1. פתח את Power BI מהשולחן העבודה שלך או מתפריט התחלה.

2. לחץ על סמל מקור הנתונים מעל רשימת השליפה שבחלון הראשי של Power BI. חלון קופץ מופיע כאשר באפשרותך לבחור את מקור הנתונים שברצונך להשתמש בו (שלב שלוש).

Accessing data sources

3. חפש את mysql, בחר במסד נתונים של MySQL, ולחץ על החיבור כדי להתחיל להתחבר למסד הנתונים שלך ב- MySQL.

Selecting MySQL as the data source to connect

4. כעת, התחבר למסד הנתונים שלך ב- MySQL עם ההוראות הבאות:

  • הזן localhost:3306 מאחר ואתה מתחבר לשרת MySQL המקומי שלך בפורט 3306.
  • ספק את שם מסד הנתונים שלך, במקרה זה, ata_db.
  • לחץ על אישור כדי להתחבר למסד הנתונים שלך ב- MySQL.
Connecting to MySQL database

5. כעת, לחץ על "שנה את הנתונים" (בתחתית-ימין) כדי לראות את סקירת הנתונים בעורך השאילתות של Power BI (שלב חמישה).

Initiating transforming data

6. לאחר צפייה במקור הנתונים, לחץ על "סגור והחל" כדי לחזור ליישום הראשי ולאשר אם שינויים כלשהם הוחלו.

עורך השאילתות מציג טבלאות ממקור הנתונים שלך בצד שמאל הרחוק. בו זמנית, אתה יכול לבדוק את התבנית של הנתונים לפני המשך ליישום הראשי.

Previewing the data source

7. לחץ על לשונית כלים של טבלה, בחר בכל טבלה בחלון השדות ולחץ על "נהל יחסים" כדי לפתוח את אשף היחסים.

לפני יצירת חזות, עליך לוודא שהטבלאות שלך מקושרות, לכן סמן כל יחס בין הטבלאות שלך באופן ברור. למה? Power BI אינו זוהה אוטומטית יחסים מורכבים באופן אוטומטי עדיין.

Opening relationships wizard

8. סמן את התיבות של היחסים הקיימים לעריכה, ולחץ על "ערוך". חלון קופץ מופיע, בו תוכל לערוך את היחסים הנבחרים (שלב תשע).

אך אם תעדיפ/י להוסיף קשר חדש, לחץ/י על "חדש".

Selecting relationships to edit

9. ערוך יחסים באמצעות השלב הבא:

  • לחץ/י על רשימת הטבלאות ובחר/י טבלה.
  • לחץ/י על הכותרות כדי לבחור את העמודות שתשמשו.
  • סמן/י את הפעל יחס זה כדי לוודא שהיחסים תקפים.
  • לחץ/י על אישור כדי ליצור את היחס ולסגור את חלון עריכת היחס.
Editing existing relationship

10. כעת, לחץ/י על סוג הוויזואליזציה "טבלה" בחלון הוויזואליזציות (הכי ימין) כדי ליצור את הוויזואל הראשון שלך, וויזואל טבלה ריק מופיע (שלב 11).

Adding the table visual

11. בחר/י את הוויזואל הטבלאי והשדות הנתונים (בחלון השדות) להוספה לוויזואל הטבלה שלך, כפי שמוצג למטה.

Adding data fields to the table visual

12. לבסוף, לחץ/י על סוג הוויזואליזציה "Slicer" כדי להוסיף וויזואל נוסף. כפי שהשם מרמז, וויזואל ה-Slicer מסנן נתונים ומפילט וויזואליזציות אחרות.

לאחר הוספת ה-Slicer, בחר/י נתונים מחלון השדות להוספה לוויזואל ה-Slicer.

Adding a slicer visual and adding a data field

שינוי וויזואליזציות

המראה הברירתי של הוויזואליזציות די לחובה. אך האם לא היה נהדר אם היית מסוגל/ת לשנות את מראה הוויזואליזציות למשהו שלא כל כך משעמם? תן/י ל-Power BI להביא לך את הפתרון.

לחץ/י על סמל "עצב את הוויזואל שלך" תחת הוויזואליזציות כדי לגשת לעורך הוויזואליזציה, כפי שמוצג למטה.

שב/י זמן קצר לשחק עם הגדרות הוויזואליזציה כדי לקבל את המראה הרצוי של הוויזואליזציות שלך. הוויזואליזציות שלך יקשרו כל עוד תקימו יחס בין הטבלאות שאליהן אתם מעוררים עניין בוויזואליזציות שלכם.

Accessing the Power BI visualization editor

לאחר שינוי ההגדרות של הוויזואליזציה, תוכל ליצור דוחות דומים לאלו שלמטה.

עכשיו, תוכל להמחיש ולנתח את הנתונים שלך בלעדיות ובלתי מורכבות עיניים.

Testing Power BI visualizations

בהמשך בהוויזואליזציה, בעת הצגת גרף הטרנדים, תראה שמשהו השתבש באפריל 2020. בזמן זה פעלו הסגרים הראשוניים של קוביד-19 בדרום אפריקה.

הפלט הזה מוכיח את יכולתו המיוחדת של Power BI ליצירת ויזואליזציות מדויקות עם המידע.

Testing Power BI visualizations

מסקנה

מדריך זה יועיל להצגת כיצד להקים קו נתונים דינמי חי באמצעות אחזקת הנתונים מנקודות קצה של API. בנוסף, בעיבוד והעברת הנתונים למסד הנתונים ול-Power BI באמצעות Python. עם הידע הזה החדש, תוכל כעת לצרוך נתוני API וליצור ויזואליזציות משלך.

עסקים רבים יוצרים יותר ויותר אפליקציות אינטרנט עם RESTful API. ובנקודה זו, אתה בטוח כעת בשימוש ב-APIs באמצעות Python ויצירת ויזואליזציות של נתונים עם Power BI, שיכולות להשפיע על החלטות עסקיות.

Source:
https://adamtheautomator.com/power-bi-python/