Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Hei Habr!

Astăzi vom lucra la abilitatea de a folosi instrumente pentru gruparea și vizualizarea datelor în Python. In prevazut set de date pe Github Să analizăm mai multe caracteristici și să construim un set de vizualizări.

Conform tradiției, la început, să definim obiectivele:

  • Grupați datele după sex și an și vizualizați dinamica generală a natalității de ambele sexe;
  • Găsiți cele mai populare nume din toate timpurile;
  • Împărțiți întreaga perioadă de timp în date în 10 părți și pentru fiecare, găsiți cel mai popular nume al fiecărui gen. Pentru fiecare nume găsit, vizualizați-i dinamica de-a lungul timpului;
  • Pentru fiecare an, calculați câte nume acoperă 50% din oameni și vizualizați (vom vedea varietatea de nume pentru fiecare an);
  • Selectați 4 ani din întregul interval și afișați pentru fiecare an distribuția după prima literă din nume și după ultima literă din nume;
  • Faceți o listă cu mai multe persoane celebre (președinți, cântăreți, actori, personaje de film) și evaluați influența acestora asupra dinamicii numelor. Construiți o vizualizare.

Mai puține cuvinte, mai mult cod!

Și, hai să mergem.

Să grupăm datele după sex și an și să vizualizăm dinamica generală a natalității de ambele sexe:

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()

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Să găsim cele mai populare nume din istorie:

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)

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Să împărțim întreaga perioadă de timp în date în 10 părți și pentru fiecare vom găsi cel mai popular nume al fiecărui gen. Pentru fiecare nume găsit, vizualizăm dinamica acestuia de-a lungul timpului:

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()

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Pentru fiecare an, calculăm câte nume acoperă 50% din oameni și vizualizăm aceste date:

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()

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Să selectăm 4 ani din întregul interval și să afișăm pentru fiecare an distribuția după prima literă din nume și după ultima literă din nume:

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()

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Să facem o listă cu mai multe persoane celebre (președinți, cântăreți, actori, personaje de film) și să evaluăm influența acestora asupra dinamicii numelor:

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()

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Lucrul la abilitatea de a utiliza gruparea și vizualizarea datelor în Python

Pentru antrenament, puteți adăuga perioada de viață a celebrității la vizualizarea din ultimul exemplu pentru a evalua clar influența acestora asupra dinamicii numelor.

Cu aceasta, toate obiectivele noastre au fost atinse și îndeplinite. Am dezvoltat abilitățile de a folosi instrumente pentru gruparea și vizualizarea datelor în Python și vom continua să lucrăm cu date. Toată lumea poate trage concluzii pe baza datelor gata făcute, vizualizate.

Cunoștințe tuturor!

Sursa: www.habr.com

Adauga un comentariu