Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Ciao, Habr!

Oggi elaboreremo la competenza nell'uso degli strumenti di raggruppamento e visualizzazione dei dati in Python. Nel dataset fornito su Github analizzeremo diverse caratteristiche e costruiremo un insieme di visualizzazioni.

Come tradizione, all'inizio definiremo gli obiettivi:

  • Raggruppare i dati per genere e anno e visualizzare la dinamica complessiva della natalità di entrambi i generi;
  • Trovare i nomi più popolari di tutta la storia;
  • Dividere l'intero intervallo di tempo nei dati in 10 parti e per ciascuna trovare il nome più popolare di ogni genere. Per ciascun nome trovato visualizzare la sua dinamica nel tempo;
  • Per ogni anno calcolare quanti nomi coprono il 50% delle persone e visualizzare (vedremo la varietà dei nomi per ogni anno);
  • Selezionare 4 anni dall'intero intervallo e mostrare per ciascun anno la distribuzione in base alla prima lettera del nome e all'ultima lettera del nome;
  • Compilare un elenco di diverse persone famose (presidenti, cantanti, attori, personaggi di film) e valutare la loro influenza sulla dinamica dei nomi. Creare una visualizzazione chiara.

Meno parole, più codice!

E, via.

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

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='Uomini')
stolb2 = ax.bar(index + 0.4, births_women_list, 0.4, alpha=0.8, color='r', label='Donne')

ax.set_title('Natalità per genere e anni')
ax.set_xlabel('Anni')
ax.set_ylabel('Natalità')
ax.set_xticklabels(years)
ax.set_xticks(index + 0.4)
ax.legend(loc=9)

fig.tight_layout()
plt.show()

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Troviamo i nomi più popolari di tutta la 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)

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Dividiamo l'intero intervallo temporale dei dati in 10 parti e per ciascuna troviamo il nome più popolare di ogni sesso. Per ogni nome trovato, visualizzeremo 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('Anni')
    ax.set_ylabel('Fertilità')
    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()

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e 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('Anni', fontsize = 12)
ax1.set_ylabel('Diversità dei nomi', fontsize = 12)
ax1.plot(dataframe['year'], dataframe['count'], color='r', ls='-')
ax1.legend(loc=9, fontsize=12)

plt.show()

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Selezioniamo 4 anni dall'intero intervallo e mostriamo per ogni anno la distribuzione in base alla prima e all'ultima lettera del nome:

dalla stringa importare 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('Lettera dell'alfabeto')
ax_first.set_ylabel('Frequenza, %')
ax_first.set_title('Prima lettera del nome')
ax_first.set_xticks(index)
ax_first.set_xticklabels(ascii_uppercase)
ax_first.legend()

ax_last.set_xlabel('Lettera dell'alfabeto')
ax_last.set_ylabel('Frequenza, %')
ax_last.set_title('Ultima lettera del nome')
ax_last.set_xticks(index)
ax_last.set_xticklabels(ascii_uppercase)
ax_last.legend()

fig_first.tight_layout()
fig_last.tight_layout()

plt.show()

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Compiliamo un elenco di alcune persone famose (presidenti, cantanti, attori, personaggi cinematografici) 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('Anno', fontsize = 10)
    ax.set_ylabel('Nascite', fontsize = 10)
    ax.plot(dataframe['year'], dataframe['count'], label=celebrity, color='r', ls='-')
    ax.legend(loc=9, fontsize=12)
        
    plt.show()

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Stiamo sviluppando la competenza nell'uso della raggruppamento e visualizzazione dei dati in Python.

Per esercitarti, puoi aggiungere alla visualizzazione del periodo di vita della celebrità nell'ultimo esempio, per valutare la loro influenza sulla dinamica dei nomi.

Con questo, tutti i nostri obiettivi sono stati raggiunti e completati. Abbiamo lavorato sull'abilità di utilizzo degli strumenti di raggruppamento e visualizzazione dei dati in Python, e continueremo a lavorare con i dati. Ognuno potrà trarre le proprie conclusioni sui dati già pronti e visualizzati.

A tutti, buon apprendimento!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster