Προγραμματισμός για Επιχειρηματική Αναλυτική · Εβδομάδα 5 · φόρτωση Python…

pandas: πίνακες δεδομένων με ονόματα

Ένας διαδραστικός οδηγός για την τάξη και το σπίτι, σε 8 βήματα. Το pandas είναι η βιβλιοθήκη που κάνει την Python «Excel με κώδικα»: πίνακες με ονόματα στηλών, διαφορετικό τύπο ανά στήλη, φόρτωση από αρχείο με μία γραμμή. Ο κώδικας τρέχει μέσα στον browser σου, μαζί με το αρχείο store_orders.csv (60 παραγγελίες του καταστήματος της εβδομάδας 3). Την πρώτη φορά η φόρτωση του pandas θέλει 10–20 δευτερόλεπτα.

ΤΟ ΑΡΧΕΙΟ ΤΗΣ ΕΒΔΟΜΑΔΑΣstore_orders.csv: 60 παραγγελίες, 8 στήλες (order_id, date, item, category, unit_price, quantity, channel, city). Κατέβασέ το για να δουλέψεις και σε Colab ή Jupyter: ο ίδιος κώδικας τρέχει αυτούσιος.

1. Από το λεξικό στο DataFrame

Ένα λεξικό (dictionary) κρατά ζεύγη κλειδί → τιμή μέσα σε άγκιστρα: {"laptop": 899.0, "mouse": 19.9}. Αντί για θέση (όπως στη λίστα) ζητάς την τιμή με το κλειδί της. Θα το δεις συνέχεια στο pandas, γι' αυτό μαθαίνουμε μόνο τα βασικά.

Ένα DataFrame είναι ένας πίνακας με ονόματα στηλών, όπου κάθε στήλη μπορεί να έχει διαφορετικό τύπο: ακριβώς αυτό που δεν μπορούσε η NumPy. Ο πιο απλός τρόπος να φτιάξεις ένα: ένα λεξικό όπου κάθε κλειδί είναι όνομα στήλης και κάθε τιμή μια λίστα με τα περιεχόμενά της.

ΠΑΡΑΤΗΡΗΣΕΗ αριστερή στήλη με τα 0, 1, 2… δεν είναι δική σου: είναι το ευρετήριο (index), η ετικέτα κάθε γραμμής. Το import pandas as pd είναι η σύμβαση, όπως το np.
Άσκηση 1

Λεξικό με τρία κλειδιά (τα ονόματα των στηλών) και τρεις λίστες ίδιου μήκους, μέσα σε pd.DataFrame().

2. Φόρτωση από αρχείο και πρώτη ματιά

Στην πράξη τα δεδομένα έρχονται από αρχεία. Το CSV (comma-separated values) είναι ένα απλό αρχείο κειμένου: μία γραμμή ανά εγγραφή, τιμές χωρισμένες με κόμμα, πρώτη γραμμή τα ονόματα των στηλών. Το pd.read_csv() το διαβάζει σε DataFrame με μία γραμμή. Μετά, οι πρώτες τέσσερις ερωτήσεις είναι πάντα οι ίδιες: πώς μοιάζει, πόσο είναι, τι τύπους έχει, τι τιμές παίρνει.

info(): τι τύπους έχει, πού λείπουν τιμές

Το info() δείχνει για κάθε στήλη τον τύπο (dtype) και πόσες τιμές δεν είναι κενές (non-null). Τα object είναι κείμενο. Πρόσεξε τη στήλη city: 56 από 60.

describe(): περιγραφικά στατιστικά με μία γραμμή

Για τις αριθμητικές στήλες: πλήθος, μέσος όρος, τυπική απόκλιση, ελάχιστο, τεταρτημόρια, μέγιστο. Το columns και το dtypes δίνουν τα ονόματα και τους τύπους σκέτους.

ΠΡΟΣΟΧΗΤο order_id είναι αριθμός, άρα το describe() του βγάζει μέσο όρο (1030.5) που δεν σημαίνει τίποτα. Η στατιστική δεν ξέρει τι είναι «ταυτότητα» και τι «μέγεθος»· εσύ ξέρεις.
Άσκηση 2

Φόρτωσε το αρχείο και απάντησε στις τρεις ερωτήσεις. Για τον μέγιστο μπορείς να διαβάσεις το describe() ή να κάνεις orders["quantity"].max() (το επόμενο βήμα εξηγεί γιατί δουλεύει).

3. Στήλες: Series και DataFrame

Με μονές αγκύλες και ένα όνομα παίρνεις μία στήλη, που είναι ένα Series (ένας πίνακας NumPy με ετικέτες και όνομα). Με διπλές αγκύλες και μια λίστα ονομάτων παίρνεις ένα μικρότερο DataFrame. Η διαφορά έχει σημασία: το Series έχει μεθόδους στατιστικής, το DataFrame είναι πίνακας.

Ό,τι ήξερες από τη NumPy, και λίγα ακόμη

Ένα Series έχει sum(), mean(), max() όπως ο πίνακας NumPy, και δύο νέα που θα χρησιμοποιείς συνέχεια σε στήλες κειμένου: unique() (ποιες διαφορετικές τιμές υπάρχουν) και value_counts() (πόσες φορές η καθεμία, ταξινομημένες).

ΔΥΟ ΓΡΑΦΕΣΤο orders.quantity κάνει το ίδιο με το orders["quantity"], και το βλέπεις συχνά. Οι αγκύλες όμως δουλεύουν πάντα (και με κενά στο όνομα, και όταν το όνομα συμπίπτει με μέθοδο, και για νέες στήλες), γι' αυτό στο μάθημα κρατάμε τις αγκύλες.
Άσκηση 3

Τρεις στήλες, τρεις μέθοδοι. Παρατήρησε το nan ανάμεσα στις πόλεις: οι κενές τιμές μετρούν ως «τιμή» στο unique (το βήμα 7 ασχολείται μαζί τους).

4. Γραμμές: iloc με θέση, loc με ετικέτα

Για γραμμές υπάρχουν δύο εργαλεία. Το iloc[] δουλεύει με θέσεις (0, 1, 2… όπως η NumPy: [γραμμή, στήλη], slicing, αρνητικοί δείκτες). Το loc[] δουλεύει με ετικέτες: την ετικέτα του ευρετηρίου για τη γραμμή και το όνομα της στήλης. Όσο το ευρετήριο είναι 0, 1, 2… τα δύο μοιάζουν· η διαφορά φαίνεται μόλις αλλάξεις ευρετήριο.

ΜΝΗΜΟΝΙΚΟiloc = integer (θέση). loc = label (ετικέτα, όνομα). Και μια παγίδα: το slicing στο loc περιλαμβάνει και το τελευταίο (loc[:2] δίνει 3 γραμμές), στο iloc όχι (iloc[:2] δίνει 2), όπως στις λίστες.
Άσκηση 4

Μία φορά με θέση, μία με ετικέτα, μία με αρνητικό δείκτη. Τρεις γραμμές εξόδου: Athens, 3, mouse.

5. Φίλτρα: οι γραμμές όπου…

Το boolean filtering της NumPy, αυτούσιο: μια σύγκριση σε στήλη δίνει Series από True/False, και μέσα στις αγκύλες του DataFrame κρατά τις γραμμές όπου είναι True. Δύο συνθήκες με & / | και παρενθέσεις, όπως πριν. Νέο: το isin() για «μία από αυτές τις τιμές».

Γράψε μια συνθήκη και δες ποιες γραμμές «περνούν». Δοκίμασε quantity > 5, item == "laptop", (category == "accessories") & (channel == "store"), (unit_price > 200) | (quantity >= 8):

ΙΔΙΑ ΠΑΓΙΔΑ, ΝΕΟ ΜΗΝΥΜΑorders[orders["quantity"] > 5 and orders["channel"] == "online"] δίνει ValueError: The truth value of a Series is ambiguous. Όπως και στη NumPy: & με παρενθέσεις.
Άσκηση 5

Τρία φίλτρα, δύο από αυτά με δύο συνθήκες. Τύπωσε 5, 12 και μετά τον πίνακα με τις παραγγελίες από Larisa.

6. Ταξινόμηση και νέες στήλες

Το sort_values("στήλη") επιστρέφει νέο DataFrame ταξινομημένο (αύξουσα· ascending=False για φθίνουσα). Με λίστα στηλών ταξινομεί πρώτα κατά την πρώτη, μετά κατά τη δεύτερη. Το «top 3» είναι απλώς ταξινόμηση + head(3).

Νέα στήλη από υπολογισμό

Ανάθεση σε όνομα που δεν υπάρχει ακόμη δημιουργεί στήλη. Ο υπολογισμός γίνεται στοιχείο προς στοιχείο, όπως στη NumPy: orders["revenue"] = orders["unit_price"] * orders["quantity"]. Από εκεί και πέρα η νέα στήλη είναι σαν όλες τις άλλες: φίλτρα, ταξινόμηση, στατιστικά.

Άσκηση 6

Νέα στήλη, φίλτρο πάνω της, ταξινόμηση κατά αυτήν. Η δεύτερη ερώτηση συνδυάζει φίλτρο σε μία στήλη και άθροισμα σε άλλη: orders[φίλτρο]["revenue"].sum().

7. Κενές τιμές (missing values) και σφάλματα

Στα πραγματικά δεδομένα λείπουν τιμές, και το pandas τις δείχνει ως NaN (Not a Number). Τρία εργαλεία: isna() (πού λείπουν), fillna(τιμή) (γέμισέ τες) και dropna() (πέτα τις γραμμές). Οι στατιστικές μέθοδοι τις αγνοούν σιωπηλά, γι' αυτό πρέπει να ξέρεις ότι υπάρχουν.

Τα σφάλματα του pandas που θα δεις πρώτα

ΜήνυμαΤι σημαίνειΔιόρθωση
KeyError: 'Item'Δεν υπάρχει στήλη με αυτό το όνομα (κεφαλαία/πεζά, κενά)Δες τα ονόματα: orders.columns
ValueError: The truth value of a Series is ambiguousand / or ανάμεσα σε συνθήκες& / | με παρενθέσεις
FileNotFoundError: store_orders.csvΤο αρχείο δεν είναι εκεί που τρέχει ο κώδικαςΑνέβασέ το (Colab) ή δώσε τη σωστή διαδρομή
AttributeError: 'DataFrame' object has no attribute 'Quantity'Η γραφή με τελεία με λάθος όνομα στήληςΑγκύλες και σωστό όνομα: orders["quantity"]

Τρέξε, διάβασε, διόρθωσε ένα σφάλμα τη φορά:

Άσκηση 7

Ένα SyntaxError, ένα KeyError και ένα ValueError. Πάτησε «Έλεγξε», διάβασε το μήνυμα, διόρθωσε, ξαναπάτησε.

8. Τελικό κουίζ

Δώδεκα ερωτήσεις από όλη την εβδομάδα. Σκέψου πρώτα, μετά απάντησε· αν αμφιβάλλεις, άνοιξε το παράθυρο κώδικα στο τέλος και δοκίμασέ το.

Δοκιμαστήριο

ΓΙΑ ΤΟ ΣΠΙΤΙΕργασία: ολοκλήρωσε και τα 8 βήματα αυτής της σελίδας (κουίζ και ασκήσεις) και ξανατρέξε τον κώδικα του βήματος 6 σε Google Colab με το store_orders.csv. DataCamp: Data Manipulation with pandas, κεφάλαιο 1 (Transforming DataFrames). Επόμενη εβδομάδα: ομαδοποίηση και συγκεντρωτικά με groupby.