Πώς φτιάχνουμε γραφήματα στο Microsoft Excel με τη χρήση Python
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Στο Microsoft Excel πέρα από την χρήση functions και pivoting έχουμε τη δυνατότητα να προσθέσουμε γραφήματα που βασίζονται στα δεδομένα αυτά.
Γνωρίζουμε όμως ότι γραφήματα μπορούμε να φτιάξουμε και με τη χρήση Python με βιβλιοθήκες όπως matplotlib και seaborn.
Σε αυτό το άρθρο θα κάνουμε μια ανασκόπηση πως γίνεται να συνδυάσουμε δεδομένα από διάφορα Excel προς ένα dataframe με pivoting δεδομένων. Ο σκοπός μας είναι να έχουμε τα δεδομένα σε μια μορφή που θα μπορούσαμε να βγάλουμε ένα χρήσιμο συμπέρασμα με τη χρήση γραφήματος.
Το παράδειγμα
Έχουμε ένα αρχείο Excel με το σύνολο πωλήσεων με όνομα sales.xlsx:
Υπάρχει ένα δεύτερο αρχείο Excel με τα ονόματα των πελατών που ονομάζεται pelates.xlsx:
Θα θέλαμε στο αρχείο sales.xlsx να έχουμε και τα ονόματα των πελάτων, ας δούμε πως γίνεται αυτό.
Πέρα από το να έχουμε εγκαταστήσει την Python, θα χρειαστούμε τις κάτωθι βιβλιοθήκες, που γίνονται εύκολα εγκατάσταση με μια εκτέλεση των κάτωθι εντολών στο command prompt:
pip install xlrd pip install pandas pip install numpy pip install openpyxl pip install matplotlib pip install seaborn
Κάνουμε import τις βιβλιοθήκες:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns
Γεμίζουμε 2 μεταβλητές dataframe με τις εγγραφές του κάθε Excel. Με τη παράμετρο sheet_name μπορούμε να διαλέξουμε και το φύλο που βρίσκονται τα δεδομένα:
df_pelates = pd.read_excel('pelates.xlsx',sheet_name='Sheet1′) df_sales = pd.read_excel('sales.xlsx',sheet_name='Sheet1′)
Θα πρέπει να κάνουμε μετονομασία το πεδίο id σε customer_id, ώστε να έχει το ίδιο όνομα που έχει και στο dataframe των sales:
df_pelates.rename(columns={'id':'customer_id'}, inplace=True)
Σε αυτό το βήμα γίνεται ουσιαστικά το vlookup.
Ενώνουμε και τα 2 dataframes σε ένα καινούργιο (df_final) στο πεδίο customer_id. Στη παράμετρο how δηλώνουμε το τρόπο που θα γίνει join.
Όπως ισχύει και στην SQL έχουμε επιλογές left,right,outer,inner. Δηλώνοντας την επιλογή right δηλώνουμε ότι θέλουμε όλες τις εγγραφές από το δεύτερο dataframe συνδέοντας με όσα συνδέονται με το πρώτο. Αν δεν υπάρχει κοινό customer_id θα έχει την τιμή NaN/Null ή αλλιώς το κενό:
df_final = pd.merge(df_pelates, df_sales, on='customer_id', how='right')
Για να δούμε τα πεδία που έχει τώρα το ενωμένο dataframe:
print(df_final.columns)
Αν θέλουμε να δούμε το μέχρι στιγμής αποτέλεσμα:
print(df_final)
Τώρα να υπολογίσουμε το πραγματικό κόστος που δαπανήθηκε με την κάθε αγορά πολλαπλασιάζοντας την ποσότητα με το κόστος:
df_final['kostos_agoras'] = df_final['posotita']*df_final['kostos']
Κάνουμε ένα group by ανά πελάτη ώστε να βρούμε το συνολικό ποσό για τον καθένα:
df_final_pelatis = df_final.groupby(['customer_id','epitheto','onoma'],as_index=False).sum()
df_final_pelatis = df_final_pelatis[['onoma','epitheto','kostos_agoras']]
Σε αυτό το σημείο καλούμε από τη βιβλιοθήκη seaborn το barplot με μία γραμμή κώδικα. (ο κώδικας του for δεν χρειάζεται εκτός αν θέλουμε να εμφανίζεται στην κάθε μπάρα το ακριβές ποσό όπως στο παράδειγμα):
plt.figure(figsize=(6, 6)) ax = sns.barplot(x="epitheto",y="kostos_agoras", data=df_final_pelatis, palette='Blues_d') for p in ax.patches: ax.annotate(np.round(p.get_height(),decimals=2), (p.get_x()+p.get_width()/2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points', fontsize = 12 ) #ax.legend(loc='top') plt.savefig('plot1.png', dpi = 80) plt.show()
Σώζεται το bar chart με όνομα plot1.png.
To function plt.show() θα μας εμφανίσει το γράφημα και στην οθόνη:
Μπορούμε να κάνουμε και subcategory barplot
Η χρήση του θα μας επιτρέψει στο άξονα x που περιέχει το επίθετο του κάθε πελάτη να διαχωρίζονται τα δεδομένα και ως προς το είδος των προϊόντων:
Ας δούμε το παράδειγμα.
df_final_eidos = df_final.groupby(['customer_id','epitheto','onoma','eidos'],as_index=False).sum() df_final_eidos = df_final_eidos[['epitheto','onoma','eidos','kostos_agoras']]
Καλώντας πάλι seaborn barplot θα προσθέσουμε το πεδίο hue ως subcategory και θα βάλουμε στη θέση του data το καινούργιο dataframe(df_final_eidos). Επίσης θα χρησιμοποιήσουμε άλλα χρώματα παλέτας:
plt.figure(figsize=(6, 6)) ax = sns.barplot(x="epitheto", hue="eidos",y="kostos_agoras", data=df_final_eidos, palette='magma') for p in ax.patches: ax.annotate(np.round(p.get_height(),decimals=2), (p.get_x()+p.get_width()/2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points', fontsize = 12 ) #ax.legend(loc='top') plt.savefig('plot2.png', dpi = 80) plt.show()
Θα αποθηκευτεί με το όνομα plot2.png.
Ιδού το αποτέλεσμα:
Για να σώσουμε και τα dataframes και τα bar charts στο ίδιο excel
Σώζουμε τα dataframes/πίνακες πρώτα στις γραμμές/στήλες που θέλουμε.(μπορούσαμε να βάλουμε loop και όταν τελειώνει να ξεκινάει το επόμενο):
writer = pd.ExcelWriter('charts_with_python.xlsx', engine='openpyxl') df_final_pelatis.to_excel(writer, index=False,startcol=0,startrow=0) df_final_eidos.to_excel(writer, index=False,startcol=0,startrow=28) writer.save()
Για να σώσουμε και τα bar plots στο Excel θα πρέπει να το ξανακάνουμε load.
Με την εντολή openpyxl.drawing.image.Image θα ορίσουμε τις 2 εικόνες που φτιάξαμε πριν και με την εντολή anchor θα θέσουμε σε ποιο κελί να τοποθετηθεί η κάθε εικόνα:
wb = openpyxl.load_workbook('charts_with_python.xlsx') ws = wb.worksheets[0] img = openpyxl.drawing.image.Image('plot1.png') img.anchor = 'F1' ws.add_image(img) img2= openpyxl.drawing.image.Image('plot2.png') img2.anchor = 'F28' ws.add_image(img2) wb.save('charts_with_python.xlsx')