Τα δεδομένα στο αρχείο αυτό είναι πραγματικά (το αρχείο το κατέβασα από τη σελίδα http://www.tableau.com/public/community/sample-data-sets
όπου μπορείτε να βρείτε και άλλα ενδιαφέροντα δεδομένα). Τα δεδομένα αφορούν τους Ολυμπιακούς αγώνες (από το 2000 έως το 2012) και τους αθλητές που έχουν πάρει μετάλλια σε αυτούς. Μπορείτε να δείτε τα περιεχόμενα του αρχείου κατάλληλα διαμορφωμένα
Το αρχείο αυτό είναι ένα αρχείο κειμένου που περιέχει μια γραμμή κειμένου για κάθε γραμμή στη μορφή του πίνακα που φαίνεται πιο πάνω. Τα διάφορα πεδία στην κάθε γραμμή διαχωρίζονται με το σύμβολο του κόμμα (εξ ου και η κατάληξη csv, comma separated values). Ιδού μερικές πρώτες γραμμές του αρχείου:
Athlete,Age,Country,Year,Closing Ceremony Date,Sport,Gold Medals,Silver Medals,Bronze Medals,Total Medals Michael Phelps,23,United States,2008,8/24/2008,Swimming,8,0,0,8 Michael Phelps,19,United States,2004,8/29/2004,Swimming,6,0,2,8 Michael Phelps,27,United States,2012,8/12/2012,Swimming,4,2,0,6 Natalie Coughlin,25,United States,2008,8/24/2008,Swimming,1,2,3,6 Aleksey Nemov,24,Russia,2000,10/1/2000,Gymnastics,2,1,3,6 Alicia Coutts,24,Australia,2012,8/12/2012,Swimming,1,3,1,5 Missy Franklin,17,United States,2012,8/12/2012,Swimming,4,0,1,5 Ryan Lochte,27,United States,2012,8/12/2012,Swimming,2,2,1,5 Allison Schmitt,22,United States,2012,8/12/2012,Swimming,3,1,1,5
Το πρώτο πράγμα που κάνουμε είναι να μετρήσουμε το πόσες γραμμές περιέχει το αρχείο (χωρίς την πρώτη γραμμή με τις επικεφαλίδες).
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
N = len(L)-1
print("Το αρχείο έχει {} γραμμές".format(N))
Έπειτα στη θέση κάθε γραμμής παίρνουμε μια λίστα από λέξεις, τα περιεχόμενα της κάθε στήλης του αρχείου.
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0] # πετάμε το πρώτο στοιχείο της λίστας που αντιστοιχεί στις επικεφαλίδες των στηλών
N = len(L)
for i in range(len(L)): # πετάμε από κάθε string που επέστρεψε η readlines τους λευκούς χαρακτήρες από το τέλος
L[i] = L[i].rstrip() # και, μεταξύ άλλων, το χαρακτήρα newline (\n)
W = [] # στη λίστα W θα έχουμε σε κάθε θέση μια λίστα από λέξεις, τις λέξεις της γραμμής
for i in range(len(L)): # που τις βρίσκουμε καλώντας την split με διαχωριστικό χαρακτήρα το κόμμα.
W.append( L[i].split(",") )
for i in range(5): # τυπώνουμε τις λίστες από λέξεις που αντιστοιχούν στις 5 πρώτες γραμμές
print(W[i])
Στο επόμενο απαντάμε στο ερώτημα, για πόσα διαφορετικά έτη εμφανίζεται πληροφορία στο αρχείο αυτό.
Παρατηρείστε ότι αντί να αναφερόμαστε στη στήλη του έτους με τον αριθμό 3 αναφερόμαστε σε αυτή με το σύμβολο YEAR
το οποίο προηγουμένως έχουμε ορίσει ως 3. Είναι μεν μεταβλητή το YEAR
αλλά το μεταχειριζόμαστε σα σταθερά, δεν του αλλάζουμε δηλ. την τιμή (γι' αυτό και το γράφουμε με κεφαλαία, ώστε να ξεχωρίζει από τις άλλες μας μεταβλητές).
# Για πόσα διαφορετικά έτη υπάρχει πληροφορία
YEAR=3
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # Το κομμάτι μέχρι εδώ δεν έχει αλλάξει από πριν
years = [] # ποια έτη εμφανίζονται (σε μια λίστα)
for x in W:
if x[YEAR] not in years:
years.append(x[YEAR])
print("Αριθμός ετών: {}".format(len(years)))
Μπορούμε φυσικά να δούμε και τα έτη αυτά. Προσέξτε ότι είναι σε μορφή string, όχι ακεραίου. Αυτό ισχύει για όλα τα περιεχόμενα της λίστας W
. Είναι κατ' αρχήν strings και να θέλουμε να τα δούμε ως αριθμούς θα πρέπει να τα μετατρέψουμε.
sorted(years)
Για πόσους διαφορετικούς αθλητές υπάρχει πληροφορία. Παρατηρείστε ότι τώρα εισάγουμε μια νέα σταθερά την ATHLETE
για να αναφερόμαστε στην πρώτη στήλη του αρχείου.
# Για πόσους διαφορετικούς αθλητές υπάρχει πληροφορία
YEAR=3
ATHLETE=0
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # Καμία αλλαγή ως εδώ
athletes = []
for x in W:
if x[ATHLETE] not in athletes:
athletes.append(x[ATHLETE])
print("Αριθμός αθλητών: {}".format(len(athletes)))
Ποιοι είναι οι αθλητές με τα περισσότερα συνολικά μετάλλια;
# Ποιοι είναι οι αθλητές με τα περισσότερα συνολικά μετάλλια;
YEAR=3
ATHLETE=0
TOTAL=9
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # Καμιά αλλαγή ως εδώ
medals = {} # Σε ένα λεξικό με κλειδί το όνομα του αθλητή κρατάμε ως τιμή το συνολικό αριθμό των μεταλλίων του
def rank(name): # Συνάρτηση με την οποία ταξινομούμε κατά τον αριθμό μεταλλίων τους αθλητές
return medals[name]
for x in W:
name = x[ATHLETE]
total = int(x[TOTAL])
if name in medals.keys():
medals[name] += total
else:
medals[name] = total
count = 0 # τυπώνουμε 20 γραμμές με τους αθλητές με τα περισσότερα μετάλλια
for n in sorted(list(medals.keys()), key=rank, reverse=True): # διατρέχει τα ονόματα των αθλητών
count += 1 # κατά φθίνουσα σειρά μεταλλίων
if count == 21:
break
print("{}: {}".format(n, medals[n]))
Ποιοι αθλητές έχουν πάρει μετάλλιο με διαφορετικές χώρες; Υπολογίζουμε για κάθε αθλητή τις χώρες με τις οποίες έχει αγωνιστεί και τυπώνουμε όλους όσους έχουν αγωνιστεί με τουλάχιστον δύο χώρες.
# Ποιοι αθλητές έχουν πάρει μετάλλιο με διαφορετικές χώρες;
YEAR=3
ATHLETE=0
TOTAL=9
COUNTRY=2
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # καμία αλλαγή ως εδώ
countries={}
# countries θα είναι ένα λεξικό με κλειδιά τα ονόματα των
# αθλητών και τιμή τη λίστα των χωρών του αθλητή
for x in W:
name = x[ATHLETE]
country = x[COUNTRY]
if name in countries.keys():
if country not in countries[name]:
countries[name].append(country)
else:
countries[name] = [ country ]
for n in countries.keys():
if len(countries[n]) >= 2:
print("{} {}".format(n, countries[n]))
Ποιες χώρες έχουν πάρει τα πιο πολλά χρυσά μετάλλια;
# Ποιες χώρες έχουν πάρει τα πιο πολλά χρυσά μετάλλια;
YEAR=3
ATHLETE=0
TOTAL=9
COUNTRY=2
GOLD=6
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # καμιά αλλαγή ως εδώ
gold={} # στο λεξικό αυτό οι χώρες είναι τα κλειδιά και οι τιμές το πόσα χρυσά έχουν πάρει
def rank(c):
return gold[c]
for x in W:
gcount = int(x[GOLD])
country = x[COUNTRY]
if country in gold.keys():
gold[country] += gcount
else:
gold[country] = gcount
for c in sorted(list(gold.keys()), key=rank, reverse=True):
print("{}: {}".format(c, gold[c]))
Για κάθε χώρα βρίσκουμε όλα της τα μετάλλια ανά άθλημα.
# Για κάθε χώρα βρίσκουμε όλα της τα μετάλλια *ανά άθλημα*.
YEAR=3
ATHLETE=0
TOTAL=9
COUNTRY=2
GOLD=6
SPORT=5
f = open("olympics.csv", "r")
L = f.readlines()
f.close()
del L[0]
N = len(L)
for i in range(len(L)):
L[i] = L[i].rstrip()
W = []
for i in range(len(L)):
W.append( L[i].split(",") ) # καμιά αλλαγή ως εδώ
wins={} # κλειδιά οι χώρες με τιμές ένα λεξικό όπου κλειδιά είναι τα αθλήματα και τιμές τα συνολικά μετάλλια σε αυτά
for x in W:
medals = int(x[TOTAL])
country = x[COUNTRY]
sport = x[SPORT]
if country in wins.keys():
if sport in wins[country]:
wins[country][sport] += medals
else:
wins[country][sport] = medals
else:
wins[country] = {sport: medals}
for c in wins:
print("{}: {}".format(c, wins[c]))