Επιταχύνετε τα Pandas στην Python με το Modin

Επιταχύνετε τα Pandas στην Python με το Modin

September 30, 2022 0 Von admin

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

Εισαγωγή στην επιτάχυνση των Pandas στην Python

Επεξεργασία για γνώση. Αυτός ο σύνδεσμος παρέχει πολλούς τρόπους χρήσης της βιβλιοθήκης. Ωστόσο, έχει ένα μειονέκτημα όταν ασχολείται με μεγάλα δεδομένα, δηλαδή όταν το μέγεθος των δεδομένων αυξάνεται πέρα ​​από αρκετά GB, ακόμη και απλές λειτουργίες όπως η concat() καταλαμβάνουν πολύ χρόνο υπολογισμού. Επομένως, δεν είναι η πιο βιώσιμη επιλογή όταν κλιμακώνουμε.

Το Apache Spark χρησιμοποιεί συστάδες για να διανείμει οποιαδήποτε λειτουργία των panda και επιταχύνει τον υπολογισμό.

Ωστόσο, είμαι αρχάριος και δεν έχω τους κατάλληλους πόρους και γνώσεις για να στήσω το Apache Spark. Υπάρχουν άλλες ευκολότερες εναλλακτικές που μπορούν να τρέξουν από την εγγενή Python;

Modin|Python

Τι είναι το Modin;

Τι είναι το Modin;  Πύθων

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

Τι δίνει στον Modin The Edge;

Τι δίνει στον Modin το Edge; Python
  • Επιτρέπει τη χρήση μόνο ενός πυρήνα τη φορά.

  • Το Modin, από την άλλη πλευρά, μας δίνει τη δυνατότητα να χρησιμοποιούμε όλους τους πυρήνες της CPU.

  • Επίσης, το Modin είναι ελαφρύ και απλό στην ενσωμάτωση και χρήση.

Αρχιτεκτονική άποψη υψηλού επιπέδου

Αρχιτεκτονική άποψη υψηλού επιπέδου|  Πύθων
Προς το παρόν, υποστηρίζει pandas API και το SQLite είναι κάτι πειραματικό. Η ομάδα Modin εργάζεται επίσης στο API της. Ο μεταγλωττιστής Modin Query λαμβάνει δεδομένα από αυτό το API και μετατρέπει το αποτέλεσμα σε πλαίσιο δεδομένων modin. Ωστόσο, χρειάζεται Ray ή Dask για να εκτελεστεί στο backend για να υποστηρίζει παράλληλες λειτουργίες. Πηγή

Προβολή συστήματος

Προβολή συστήματος|PythonΤο 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(). Σε τέτοιες περιπτώσεις, χρησιμοποιεί την παρακάτω προσέγγιση:

Modin Merge|  Πύθων

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

Modine vs. Dask DataFrame vs. Κοάλα (Πάντα)

Modine vs.  Dask DataFrame vs.  Κοάλα
Modine vs.  Dask DataFrame vs.  Koala's Bar|  Πύθων

Σε λειτουργίες που υποστηρίζονται από όλα τα συστήματα, το 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 και χρησιμοποιούνται κατά την κρίση του συγγραφέα.