Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Hoi Habr!

Hjoed sille wy wurkje oan 'e feardigens fan it brûken fan ark foar it groepearjen en visualisearjen fan gegevens yn Python. Yn de foarsjoen dataset op Github Litte wy ferskate skaaimerken analysearje en in set fisualisaasjes bouwe.

Neffens de tradysje litte wy oan it begjin de doelen definiearje:

  • Groepearje gegevens troch geslacht en jier en visualisearje de algemiene dynamyk fan 'e bertepersintaazje fan beide seksen;
  • Fyn de populêrste nammen fan alle tiden;
  • Diel de hiele tiidperioade yn 'e gegevens yn 10 dielen en fyn foar elk de populêrste namme fan elk geslacht. Foar eltse namme fûn, fisualisearjen syn dynamyk oer alle tiid;
  • Foar elk jier, berekkenje hoefolle nammen cover 50% fan minsken en fisualisearjen (wy sille sjen de ferskaat oan nammen foar elk jier);
  • Selektearje 4 jier út it hiele ynterval en werjaan foar elk jier de ferdieling troch de earste letter yn de namme en troch de lêste letter yn de namme;
  • Meitsje in list mei ferskate ferneamde minsken (presidinten, sjongers, akteurs, filmkarakteren) en evaluearje har ynfloed op 'e dynamyk fan nammen. Bouwe in fisualisaasje.

Minder wurden, mear koade!

En, lit ús gean.

Litte wy de gegevens groepearje op geslacht en jier en de algemiene dynamyk fan it bertepersintaazje fan beide seksen fisualisearje:

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

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Litte wy de populêrste nammen yn 'e skiednis fine:

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)

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Litte wy de hiele tiidperioade yn 'e gegevens ferdiele yn 10 dielen en foar elk sille wy de populêrste namme fan elk geslacht fine. Foar elke fûn namme visualisearje wy de dynamyk oer de hiele tiid:

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

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Foar elk jier berekkenje wy hoefolle nammen 50% fan minsken dekke en visualisearje dizze gegevens:

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

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Litte wy 4 jier selektearje út it heule ynterval en foar elk jier de ferdieling sjen litte troch de earste letter yn 'e namme en troch de lêste letter yn' e namme:

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

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Litte wy in list meitsje fan ferskate ferneamde minsken (presidinten, sjongers, akteurs, filmkarakteren) en evaluearje har ynfloed op 'e dynamyk fan nammen:

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

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Wurkje oan 'e feardigens fan it brûken fan groepearring en datafisualisaasje yn Python

Foar training kinne jo de libbensperioade fan 'e ferneamdens tafoegje oan' e fisualisaasje fan it lêste foarbyld om har ynfloed dúdlik te beoardieljen op 'e dynamyk fan nammen.

Hjirmei binne al ús doelen berikt en ferfolle. Wy hawwe de feardigens ûntwikkele om ark te brûken foar it groepearjen en visualisearjen fan gegevens yn Python, en wy sille fierder wurkje mei gegevens. Elkenien kin konklúzjes lûke op basis fan klearmakke, visualisearre gegevens sels.

Kennis foar elkenien!

Boarne: www.habr.com

Add a comment