Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Ehi Habr!

Oggi lavoreremo sulla capacità di utilizzare strumenti per raggruppare e visualizzare i dati in Python. Nel fornito set di dati su Github Analizziamo diverse caratteristiche e costruiamo una serie di visualizzazioni.

Come da tradizione, all’inizio definiamo gli obiettivi:

  • Raggruppare i dati per genere e anno e visualizzare la dinamica complessiva della natalità di entrambi i sessi;
  • Trova i nomi più popolari di tutti i tempi;
  • Dividi l'intero periodo di tempo nei dati in 10 parti e per ciascuna trova il nome più popolare di ciascun genere. Per ogni nome trovato, visualizza la sua dinamica nel tempo;
  • Per ogni anno calcola quanti nomi coprono il 50% delle persone e visualizza (vedremo la varietà di nomi per ogni anno);
  • Selezionare 4 anni dall'intero intervallo e visualizzare per ogni anno la distribuzione per la prima lettera del nome e per l'ultima lettera del nome;
  • Fai un elenco di diversi personaggi famosi (presidenti, cantanti, attori, personaggi del cinema) e valuta la loro influenza sulla dinamica dei nomi. Costruisci una visualizzazione.

Meno parole, più codice!

E andiamo.

Raggruppiamo i dati per sesso e anno e visualizziamo la dinamica complessiva della natalità di entrambi i sessi:

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

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Troviamo i nomi più popolari della storia:

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)

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Dividiamo l'intero periodo di tempo presente nei dati in 10 parti e per ciascuna troveremo il nome più popolare di ciascun genere. Per ogni nome trovato, visualizziamo la sua dinamica nel tempo:

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

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Per ogni anno calcoliamo quanti nomi coprono il 50% delle persone e visualizziamo questi dati:

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

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Selezioniamo 4 anni dall'intero intervallo e visualizziamo per ogni anno la distribuzione per la prima lettera del nome e per l'ultima lettera del nome:

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

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Facciamo un elenco di diversi personaggi famosi (presidenti, cantanti, attori, personaggi del cinema) e valutiamo la loro influenza sulla dinamica dei nomi:

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

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Lavorare sull'abilità di utilizzare il raggruppamento e la visualizzazione dei dati in Python

Per la formazione, puoi aggiungere il periodo di vita della celebrità alla visualizzazione dell'ultimo esempio per valutare chiaramente la loro influenza sulla dinamica dei nomi.

Con questo, tutti i nostri obiettivi sono stati raggiunti e soddisfatti. Abbiamo sviluppato la capacità di utilizzare strumenti per raggruppare e visualizzare i dati in Python e continueremo a lavorare con i dati. Tutti possono trarre conclusioni sulla base di dati visualizzati già pronti.

Conoscenza a tutti!

Fonte: habr.com

Aggiungi un commento