Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Hej Habr!

I dag vil vi arbejde med evnen til at bruge værktøjer til at gruppere og visualisere data i Python. I det medfølgende datasæt på Github Lad os analysere flere karakteristika og bygge et sæt visualiseringer.

Ifølge traditionen, lad os i begyndelsen definere målene:

  • Grupper data efter køn og år og visualiser den overordnede dynamik i fødselsraten for begge køn;
  • Find de mest populære navne nogensinde;
  • Opdel hele tidsperioden i dataene i 10 dele, og find det mest populære navn for hvert køn for hver. For hvert navn fundet, visualiser dets dynamik gennem hele tiden;
  • Beregn for hvert år, hvor mange navne der dækker 50 % af mennesker og visualiser (vi vil se de forskellige navne for hvert år);
  • Vælg 4 år fra hele intervallet og vis fordelingen for hvert år med det første bogstav i navnet og det sidste bogstav i navnet;
  • Lav en liste over flere kendte personer (præsidenter, sangere, skuespillere, filmkarakterer) og vurder deres indflydelse på navnenes dynamik. Byg en visualisering.

Færre ord, mere kode!

Og lad os gå.

Lad os gruppere dataene efter køn og år og visualisere den overordnede dynamik i fødselsraten for begge køn:

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

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Lad os finde de mest populære navne i historien:

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)

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Lad os opdele hele tidsperioden i dataene i 10 dele, og for hver vil vi finde det mest populære navn for hvert køn. For hvert fundet navn visualiserer vi dets dynamik gennem tiden:

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

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

For hvert år beregner vi, hvor mange navne der dækker 50 % af mennesker og visualiserer disse data:

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

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Lad os vælge 4 år fra hele intervallet og vise fordelingen for hvert år med det første bogstav i navnet og det sidste bogstav i navnet:

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

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Lad os lave en liste over flere kendte personer (præsidenter, sangere, skuespillere, filmkarakterer) og evaluere deres indflydelse på navnenes dynamik:

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

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Arbejder med evnen til at bruge gruppering og datavisualisering i Python

Til træning kan du tilføje berømthedens livsperiode til visualiseringen fra det sidste eksempel for klart at vurdere deres indflydelse på navnenes dynamik.

Hermed blev alle vores mål nået og opfyldt. Vi har udviklet evnen til at bruge værktøjer til at gruppere og visualisere data i Python, og vi vil fortsætte med at arbejde med data. Alle kan selv drage konklusioner baseret på færdige, visualiserede data.

Viden til alle!

Kilde: www.habr.com

Tilføj en kommentar