Επιταχύνετε τα Pandas στην Python με το Modin
September 30, 2022Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.
Εισαγωγή στην επιτάχυνση των Pandas στην Python
Το Apache Spark χρησιμοποιεί συστάδες για να διανείμει οποιαδήποτε λειτουργία των panda και επιταχύνει τον υπολογισμό.
Ωστόσο, είμαι αρχάριος και δεν έχω τους κατάλληλους πόρους και γνώσεις για να στήσω το Apache Spark. Υπάρχουν άλλες ευκολότερες εναλλακτικές που μπορούν να τρέξουν από την εγγενή Python;

Τι είναι το Modin;

Είναι μια βιβλιοθήκη που δημιουργήθηκε από ορισμένους επιστήμονες δεδομένων στο UC Berkeley. Χρησιμοποιεί παράλληλους υπολογισμούς για την ταχύτερη επεξεργασία των εκτελέσεων πλαισίων δεδομένων.
Τι δίνει στον Modin The Edge;

-
Επιτρέπει τη χρήση μόνο ενός πυρήνα τη φορά.
-
Το Modin, από την άλλη πλευρά, μας δίνει τη δυνατότητα να χρησιμοποιούμε όλους τους πυρήνες της CPU.
-
Επίσης, το Modin είναι ελαφρύ και απλό στην ενσωμάτωση και χρήση.
Αρχιτεκτονική άποψη υψηλού επιπέδου

Προβολή συστήματος
Το Data Scientist εκτελεί τις λειτουργίες του πλαισίου δεδομένων. Στο backend, το Modin χρησιμοποιεί Ray/Dask και διανέμει τις λειτουργίες παράλληλα για να ενισχύσει τις λειτουργίες.
Ας δούμε τον κώδικα:
Βήμα 1: Εγκατάσταση
Μπορούμε να εγκαταστήσουμε το Modin χρησιμοποιώντας την εντολή pip:
pip install modin[all] # (Recommended) Install Modin with all of Modin's currently supported engines.
Βήμα 2: Λήψη των δεδομένων
Κάντε λήψη του δείγματος δεδομένων. Θα χρησιμοποιήσουμε τα δεδομένα ταξιδιού στη Νέα Υόρκη. Θα κατεβάσουμε το αρχείο παρκέ (περίπου 100 Mb).
Σύνδεσμος αρχείου 1
Σύνδεσμος αρχείου 2
Βήμα 3: Εισαγωγή βιβλιοθηκών
Εισαγάγετε τα σχετικά πακέτα και αρχικοποιήστε το Ray για modin.
import pandas import time import modin.pandas as pd import ray ray.init()
Βήμα 4: Χρησιμοποιήστε το αρχείο λήψης
Δώστε τη διαδρομή του αρχείου παρκέ που κατεβάσαμε στο βήμα 2
parquet_path="yellow_tripdata_2022-03.parquet"
Βήμα 5: Πραγματική σύγκριση
Εκτελέστε τις λειτουργίες για pandas και Modin.
- read_parquet(): Αυτή η μέθοδος χρησιμοποιείται για την ανάγνωση δεδομένων από ένα αρχείο παρκέ σε ένα πλαίσιο δεδομένων.
start = time.time() pandas_df = pandas.read_parquet(parquet_path) end = time.time() pandas_duration = end - start print("Time to read with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df = pd.read_parquet(parquet_path) end = time.time() modin_duration = end - start print("Time to read with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `read_parquet`!". format(round(pandas_duration / modin_duration, 2)))

- isnull() : Επιστρέφει ένα πλαίσιο δεδομένων όπου οι τιμές NULL αντικαθίστανται με TRUE, αλλιώς FALSE.
start = time.time() pandas_df.isnull() end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df.isnull() end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `is_null()`!". format(round(pandas_duration / modin_duration, 2)))

- fill() : Αντικαθιστά τις τιμές NULL με την τιμή που καθορίζεται στην παρένθεση.
start = time.time()
pandas_df.fillna(0) end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df.fillna(0) end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `is_null()`!". format(round(pandas_duration / modin_duration, 2)))

start = time.time() pandas_df["trip_distance"].apply(round) end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df["trip_distance"].apply(round) end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `apply()`!". format(round(pandas_duration / modin_duration, 2)))

start = time.time() pandas_df[["trip_distance"]].applymap(round) end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df[["trip_distance"]].applymap(round) end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `applymap()`!". format(round(pandas_duration / modin_duration, 2)))

- concat(): αυτή η μέθοδος προσαρτά το πλαίσιο δεδομένων πάνω από έναν άξονα. Εδώ, θα συνδέσουμε το αρχικό πλαίσιο δεδομένων με τον εαυτό του 20 φορές – κάνοντάς το έτσι 20 φορές μεγαλύτερο σε μέγεθος.
start = time.time() pandas.concat([pandas_df for _ in range(20)]) end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() pd.concat([modin_df for _ in range(20)]) end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `concat()`!". format(round(pandas_duration / modin_duration, 2)))

- to_csv(): Αυτή η μέθοδος χρησιμοποιείται για την εξαγωγή ενός πλαισίου δεδομένων σε μορφή csv.
start = time.time() pandas_df.to_csv('Pandas_test.csv') end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() modin_df.to_csv('Mobin_test.csv') end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `to_csv()`!". format(round(pandas_duration / modin_duration, 2)))

- συγχώνευση(): Αυτή η μέθοδος χρησιμοποιείται για τη σύνδεση πλαισίων δεδομένων, εδώ θα κάνουμε μια εσωτερική ένωση.
start = time.time() pandas.merge(pandas_df.head(1000),pandas_df.head(1000),how='inner', left_on='VendorID',right_on='VendorID') end = time.time() pandas_duration = end - start print("Time with pandas: {} seconds".format(round(pandas_duration, 3))) start = time.time() pd.merge(modin_df.head(1000),modin_df.head(1000),how='inner', left_on='VendorID',right_on='VendorID') end = time.time() modin_duration = end - start print("Time with Modin: {} seconds".format(round(modin_duration, 3))) print("Modin is {}x faster than pandas at `merge()`!". format(round(pandas_duration / modin_duration, 2)))

Στατιστικά περίληψης απόδοσης (Modin & Pandas)
Πραγματοποιήσαμε αρκετές επεμβάσεις, ας τις συνοψίσουμε και ας δούμε πόσο πιο γρήγορο ήταν το παράδειγμά μας ο Modin. Μπορούμε να δούμε ότι εκτός από τη συνάρτηση merge(), το Modin κερδίζει τα Pandas στις υπόλοιπες 7 συναρτήσεις. Φαίνεται ότι υπάρχουν ορισμένοι περιορισμοί του Modin, ας δούμε αυτούς στη συνέχεια.

Περιορισμός
Επί του παρόντος, το Modin μπορεί να καλύψει το 90,8% των μεθόδων API.

Εντάξει, αλλά γιατί το Merge() ήταν πιο αργό για τον Modin;
Σύμφωνα με αυτό Σύνδεσμος, επί του παρόντος το Modin δεν υποστηρίζει τη συνάρτηση merge(). Σε τέτοιες περιπτώσεις, χρησιμοποιεί την παρακάτω προσέγγιση:

Πρώτα μετατρέπουμε σε pandas DataFrame και μετά λειτουργούμε. Υπάρχει μια ποινή απόδοσης για τη μετάβαση από ένα διαμερισμένο Modin DataFrame σε panda λόγω του κόστους επικοινωνίας και της φύσης ενός νήματος των panda. Μόλις ολοκληρωθεί η λειτουργία των panda, μετατρέπουμε το DataFrame ξανά σε ένα διαμερισμένο Modin DataFrame. Με αυτόν τον τρόπο, οι λειτουργίες που εκτελούνται μετά από προεπιλογή για τα panda θα βελτιστοποιηθούν με το Modin.
Modine vs. Dask DataFrame vs. Κοάλα (Πάντα)


Σε λειτουργίες που υποστηρίζονται από όλα τα συστήματα, το ModDaskDF εκτελεί αποτελεσματικά τις λειτουργίες του χάρη στον βελτιστοποιημένο σχεδιασμό του. Αξίζει να σημειωθεί ότι τα Koalasares συχνά είναι πιο αργά από τα πάντα, λόγω της επιβάρυνσης του Spark.
Συμπέρασμα για την Python
- Ο Modin είναι α πυγμάχος ελαφρού βάρους και φιλική προς τον χρήστη βιβλιοθήκη. Οι κλήσεις API είναι παρόμοιες με τα πάντα. Μπορεί εύκολα να ενσωματωθεί στην python με μερικές γραμμές κώδικα.
- Δεν χρειάζεται να κάνουμε καμία ρύθμιση πριν χρησιμοποιήσουμε το Modin, ακόμη και ένας αρχάριος μπορεί εύκολα να χρησιμοποιήσει τη βιβλιοθήκη.
- Επί του παρόντος, Modin εξώφυλλα 90,8% των μεθόδων API των pandas. Αυτός είναι ο λόγος για τον οποίο ορισμένες συναρτήσεις (όπως η συγχώνευση()) είναι πιο γρήγορες στα panda και πιο αργές στο Modin. Οι προγραμματιστές εργάζονται για την αύξηση αυτής της κάλυψης.
- Είδαμε επίσης την ανύψωση της απόδοσης του Modin πάνω από τα πάντα. Για μια απλή συνάρτηση όπως η fillna(), παρατηρήθηκε ότι ο Modin ήταν 524 φορές πιο γρήγορα παρά τα πάντα
- Το Modin είναι σημαντικά πιο γρήγορο σε σύγκριση με τα Dask, Pandas και Koala.
Αυτή ήταν μια ταπεινή προσπάθεια να εξερευνηθούν τρόποι που μπορούν να κάνουν την εκτέλεση των πάντα πιο γρήγορη.
Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.