Γεια σου Χαμπρ!
Σήμερα θα εργαστούμε για την ικανότητα χρήσης εργαλείων για ομαδοποίηση και οπτικοποίηση δεδομένων στην Python. Στα προβλεπόμενα
Σύμφωνα με την παράδοση, στην αρχή, ας ορίσουμε τους στόχους:
- Ομαδοποιήστε δεδομένα ανά φύλο και έτος και οπτικοποιήστε τη συνολική δυναμική του ποσοστού γεννήσεων και των δύο φύλων.
- Βρείτε τα πιο δημοφιλή ονόματα όλων των εποχών.
- Διαχωρίστε ολόκληρη τη χρονική περίοδο στα δεδομένα σε 10 μέρη και για το καθένα, βρείτε το πιο δημοφιλές όνομα κάθε φύλου. Για κάθε όνομα που βρέθηκε, οραματιστείτε τη δυναμική του ανά πάσα στιγμή.
- Για κάθε έτος, υπολογίστε πόσα ονόματα καλύπτουν το 50% των ανθρώπων και οραματιστείτε (θα δούμε την ποικιλία των ονομάτων για κάθε έτος).
- Επιλέξτε 4 έτη από ολόκληρο το διάστημα και εμφανίστε για κάθε έτος την κατανομή με το πρώτο γράμμα στο όνομα και με το τελευταίο γράμμα στο όνομα.
- Κάντε μια λίστα με πολλά διάσημα πρόσωπα (πρόεδροι, τραγουδιστές, ηθοποιοί, χαρακτήρες ταινιών) και αξιολογήστε την επιρροή τους στη δυναμική των ονομάτων. Δημιουργήστε μια οπτικοποίηση.
Λιγότερα λόγια, περισσότερος κώδικας!
Ας ομαδοποιήσουμε τα δεδομένα ανά φύλο και έτος και ας οπτικοποιήσουμε τη συνολική δυναμική του ποσοστού γεννήσεων και των δύο φύλων:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
years = np.arange(1880, 2011, 3)
datalist = 'https://raw.githubusercontent.com/wesm/pydata-book/2nd-edition/datasets/babynames/yob{year}.txt'
dataframes = []
for year in years:
dataset = datalist.format(year=year)
dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
dataframes.append(dataframe.assign(year=year))
result = pd.concat(dataframes)
sex = result.groupby('sex')
births_men = sex.get_group('M').groupby('year', as_index=False)
births_women = sex.get_group('F').groupby('year', as_index=False)
births_men_list = births_men.aggregate(np.sum)['count'].tolist()
births_women_list = births_women.aggregate(np.sum)['count'].tolist()
fig, ax = plt.subplots()
fig.set_size_inches(25,15)
index = np.arange(len(years))
stolb1 = ax.bar(index, births_men_list, 0.4, color='c', label='Мужчины')
stolb2 = ax.bar(index + 0.4, births_women_list, 0.4, alpha=0.8, color='r', label='Женщины')
ax.set_title('Рождаемость по полу и годам')
ax.set_xlabel('Года')
ax.set_ylabel('Рождаемость')
ax.set_xticklabels(years)
ax.set_xticks(index + 0.4)
ax.legend(loc=9)
fig.tight_layout()
plt.show()
Ας βρούμε τα πιο δημοφιλή ονόματα στην ιστορία:
years = np.arange(1880, 2011)
dataframes = []
for year in years:
dataset = datalist.format(year=year)
dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
dataframes.append(dataframe)
result = pd.concat(dataframes)
names = result.groupby('name', as_index=False).sum().sort_values('count', ascending=False)
names.head(10)
Ας χωρίσουμε ολόκληρη τη χρονική περίοδο στα δεδομένα σε 10 μέρη και για το καθένα θα βρούμε το πιο δημοφιλές όνομα κάθε φύλου. Για κάθε όνομα που βρέθηκε, απεικονίζουμε τη δυναμική του ανά πάσα στιγμή:
years = np.arange(1880, 2011)
part_size = int((years[years.size - 1] - years[0]) / 10) + 1
parts = {}
def GetPart(year):
return int((year - years[0]) / part_size)
for year in years:
index = GetPart(year)
r = years[0] + part_size * index, min(years[years.size - 1], years[0] + part_size * (index + 1))
parts[index] = str(r[0]) + '-' + str(r[1])
dataframe_parts = []
dataframes = []
for year in years:
dataset = datalist.format(year=year)
dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
dataframe_parts.append(dataframe.assign(years=parts[GetPart(year)]))
dataframes.append(dataframe.assign(year=year))
result_parts = pd.concat(dataframe_parts)
result = pd.concat(dataframes)
result_parts_sums = result_parts.groupby(['years', 'sex', 'name'], as_index=False).sum()
result_parts_names = result_parts_sums.iloc[result_parts_sums.groupby(['years', 'sex'], as_index=False).apply(lambda x: x['count'].idxmax())]
result_sums = result.groupby(['year', 'sex', 'name'], as_index=False).sum()
for groupName, groupLabels in result_parts_names.groupby(['name', 'sex']).groups.items():
group = result_sums.groupby(['name', 'sex']).get_group(groupName)
fig, ax = plt.subplots(1, 1, figsize=(18,10))
ax.set_xlabel('Года')
ax.set_ylabel('Рождаемость')
label = group['name']
ax.plot(group['year'], group['count'], label=label.aggregate(np.max), color='b', ls='-')
ax.legend(loc=9, fontsize=11)
plt.show()
Για κάθε χρόνο, υπολογίζουμε πόσα ονόματα καλύπτουν το 50% των ανθρώπων και οπτικοποιούμε αυτά τα δεδομένα:
dataframe = pd.DataFrame({'year': [], 'count': []})
years = np.arange(1880, 2011)
for year in years:
dataset = datalist.format(year=year)
csv = pd.read_csv(dataset, names=['name', 'sex', 'count'])
names = csv.groupby('name', as_index=False).aggregate(np.sum)
names['sum'] = names.sum()['count']
names['percent'] = names['count'] / names['sum'] * 100
names = names.sort_values(['percent'], ascending=False)
names['cum_perc'] = names['percent'].cumsum()
names_filtered = names[names['cum_perc'] <= 50]
dataframe = dataframe.append(pd.DataFrame({'year': [year], 'count': [names_filtered.shape[0]]}))
fig, ax1 = plt.subplots(1, 1, figsize=(22,13))
ax1.set_xlabel('Года', fontsize = 12)
ax1.set_ylabel('Разнообразие имен', fontsize = 12)
ax1.plot(dataframe['year'], dataframe['count'], color='r', ls='-')
ax1.legend(loc=9, fontsize=12)
plt.show()
Ας επιλέξουμε 4 έτη από ολόκληρο το διάστημα και ας εμφανίσουμε για κάθε έτος την κατανομή με το πρώτο γράμμα στο όνομα και με το τελευταίο γράμμα στο όνομα:
from string import ascii_lowercase, ascii_uppercase
fig_first, ax_first = plt.subplots(1, 1, figsize=(14,10))
fig_last, ax_last = plt.subplots(1, 1, figsize=(14,10))
index = np.arange(len(ascii_uppercase))
years = [1944, 1978, 1991, 2003]
colors = ['r', 'g', 'b', 'y']
n = 0
for year in years:
dataset = datalist.format(year=year)
csv = pd.read_csv(dataset, names=['name', 'sex', 'count'])
names = csv.groupby('name', as_index=False).aggregate(np.sum)
count = names.shape[0]
dataframe = pd.DataFrame({'letter': [], 'frequency_first': [], 'frequency_last': []})
for letter in ascii_uppercase:
countFirst = (names[names.name.str.startswith(letter)].count()['count'])
countLast = (names[names.name.str.endswith(letter.lower())].count()['count'])
dataframe = dataframe.append(pd.DataFrame({
'letter': [letter],
'frequency_first': [countFirst / count * 100],
'frequency_last': [countLast / count * 100]}))
ax_first.bar(index + 0.3 * n, dataframe['frequency_first'], 0.3, alpha=0.5, color=colors[n], label=year)
ax_last.bar(index + bar_width * n, dataframe['frequency_last'], 0.3, alpha=0.5, color=colors[n], label=year)
n += 1
ax_first.set_xlabel('Буква алфавита')
ax_first.set_ylabel('Частота, %')
ax_first.set_title('Первая буква в имени')
ax_first.set_xticks(index)
ax_first.set_xticklabels(ascii_uppercase)
ax_first.legend()
ax_last.set_xlabel('Буква алфавита')
ax_last.set_ylabel('Частота, %')
ax_last.set_title('Последняя буква в имени')
ax_last.set_xticks(index)
ax_last.set_xticklabels(ascii_uppercase)
ax_last.legend()
fig_first.tight_layout()
fig_last.tight_layout()
plt.show()
Ας κάνουμε μια λίστα με πολλά διάσημα πρόσωπα (πρόεδροι, τραγουδιστές, ηθοποιοί, χαρακτήρες ταινιών) και ας αξιολογήσουμε την επιρροή τους στη δυναμική των ονομάτων:
celebrities = {'Frank': 'M', 'Britney': 'F', 'Madonna': 'F', 'Bob': 'M'}
dataframes = []
for year in years:
dataset = datalist.format(year=year)
dataframe = pd.read_csv(dataset, names=['name', 'sex', 'count'])
dataframes.append(dataframe.assign(year=year))
result = pd.concat(dataframes)
for celebrity, sex in celebrities.items():
names = result[result.name == celebrity]
dataframe = names[names.sex == sex]
fig, ax = plt.subplots(1, 1, figsize=(16,8))
ax.set_xlabel('Года', fontsize = 10)
ax.set_ylabel('Рождаемость', fontsize = 10)
ax.plot(dataframe['year'], dataframe['count'], label=celebrity, color='r', ls='-')
ax.legend(loc=9, fontsize=12)
plt.show()
Για εκπαίδευση, μπορείτε να προσθέσετε την περίοδο ζωής της διασημότητας στην οπτικοποίηση από το τελευταίο παράδειγμα, προκειμένου να αξιολογήσετε με σαφήνεια την επιρροή τους στη δυναμική των ονομάτων.
Με αυτό, όλοι οι στόχοι μας επιτεύχθηκαν και εκπληρώθηκαν. Έχουμε αναπτύξει την ικανότητα χρήσης εργαλείων για ομαδοποίηση και οπτικοποίηση δεδομένων στην Python και θα συνεχίσουμε να εργαζόμαστε με δεδομένα. Ο καθένας μπορεί να βγάλει συμπεράσματα με βάση έτοιμα, οπτικοποιημένα δεδομένα.
Γνώση σε όλους!
Πηγή: www.habr.com