Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Hoy Habr!

Ngayon ay gagawin namin ang kasanayan sa paggamit ng data grouping at visualization tool sa Python. Sa ibinigay dataset sa Github Suriin natin ang ilang katangian at bumuo ng isang hanay ng mga visualization.

Sa pamamagitan ng tradisyon, sa simula, tinukoy namin ang mga layunin:

  • Igrupo ang data ayon sa kasarian at taon at ilarawan ang pangkalahatang dinamika ng rate ng kapanganakan ng parehong kasarian;
  • Hanapin ang pinakasikat na mga pangalan sa kasaysayan;
  • Hatiin ang buong yugto ng panahon sa data sa 10 bahagi at para sa bawat hanapin ang pinakasikat na pangalan ng bawat kasarian. Para sa bawat pangalang natagpuan, ilarawan ang dynamics nito sa paglipas ng panahon;
  • Para sa bawat taon, kalkulahin kung gaano karaming mga pangalan ang sakop ng 50% ng mga tao at ilarawan sa isip (makikita natin ang iba't ibang mga pangalan para sa bawat taon);
  • Pumili ng 4 na taon mula sa kabuuang pagitan at ipinapakita para sa bawat taon ang pamamahagi sa pamamagitan ng unang titik sa pangalan at sa huling titik sa pangalan;
  • Gumawa ng listahan ng ilang sikat na tao (mga presidente, mang-aawit, aktor, bayani sa pelikula) at suriin ang kanilang impluwensya sa dynamics ng mga pangalan. Bumuo ng visualization.

Mas kaunting mga salita, mas maraming code!

At tayo na.

Ipangkat natin ang data ayon sa kasarian at taon at ilarawan sa isip ang pangkalahatang dinamika ng rate ng kapanganakan ng parehong kasarian:

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

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Hanapin natin ang pinakasikat na mga pangalan sa kasaysayan:

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)

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Hatiin natin ang buong yugto ng panahon sa data sa 10 bahagi at para sa bawat isa ay makikita natin ang pinakasikat na pangalan ng bawat kasarian. Para sa bawat nahanap na pangalan, nakikita namin ang dynamics nito sa buong panahon:

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

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Para sa bawat taon, kinakalkula namin kung gaano karaming mga pangalan ang sakop ng 50% ng mga tao at nakikita namin ang data na ito:

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

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Pumili tayo ng 4 na taon mula sa buong agwat at ipakita para sa bawat taon ang pamamahagi sa pamamagitan ng unang titik sa pangalan at sa huling titik sa pangalan:

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

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Gumawa tayo ng isang listahan ng ilang sikat na tao (mga presidente, mang-aawit, aktor, bayani sa pelikula) at suriin ang kanilang impluwensya sa dinamika ng mga pangalan:

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

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Paggawa sa kasanayan ng paggamit ng pagpapangkat at data visualization sa Python

Para sa pagsasanay, maaari mong idagdag ang panahon ng buhay ng isang celebrity sa visualization mula sa huling halimbawa upang biswal na masuri ang kanilang impluwensya sa dynamics ng mga pangalan.

Dito, lahat ng aming mga layunin ay nakamit at natupad. Pinagkadalubhasaan namin ang paggamit ng mga tool sa pagpapangkat ng data at visualization sa Python, at gagana pa kami sa data. Ang bawat tao'y maaaring gumawa ng mga konklusyon sa handa na, na-visualize na data.

Lahat ng kaalaman!

Pinagmulan: www.habr.com

Magdagdag ng komento