Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Hey Habr!

Dina iki kita bakal nggarap katrampilan nggunakake alat kanggo nglumpukake lan nggambarake data ing Python. Ing kasedhiya dataset ing Github Ayo analisa sawetara karakteristik lan nggawe set visualisasi.

Miturut tradisi, ing wiwitan, ayo nemtokake tujuan:

  • Kelompok data miturut jender lan taun lan nggambarake dinamika sakabΓ¨hΓ© saka tingkat lair saka loro jinis;
  • Temokake jeneng sing paling populer ing kabeh wektu;
  • Dibagi kabeh periode wektu ing data dadi 10 bagean lan kanggo saben, temokake jeneng sing paling populer kanggo saben jender. Kanggo saben jeneng sing ditemokake, gambarake dinamika ing kabeh wektu;
  • Kanggo saben taun, ngitung jumlah jeneng sing nutupi 50% wong lan nggambarake (kita bakal weruh macem-macem jeneng kanggo saben taun);
  • Pilih 4 taun saka kabeh interval lan nampilake distribusi saben taun kanthi huruf pisanan ing jeneng lan huruf pungkasan ing jeneng;
  • Nggawe dhaptar sawetara wong sing misuwur (presiden, penyanyi, aktor, karakter film) lan evaluasi pengaruhe ing dinamika jeneng. Mbangun visualisasi.

Kurang tembung, luwih kode!

Lan, ayo padha lunga.

Ayo klompok data miturut jender lan taun lan gambaran dinamika sakabèhé saka tingkat lair saka loro jinis:

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

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Ayo goleki jeneng sing paling populer ing sejarah:

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)

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Ayo dibagi kabeh periode wektu ing data dadi 10 bagean lan kanggo saben kita bakal nemokake jeneng sing paling populer saben jender. Kanggo saben jeneng sing ditemokake, kita nggambarake dinamika ing kabeh wektu:

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

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Kanggo saben taun, kita ngitung jumlah jeneng sing nutupi 50% wong lan nggambarake data iki:

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

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Ayo pilih 4 taun saka kabeh interval lan nampilake distribusi saben taun miturut huruf pisanan ing jeneng lan huruf pungkasan ing jeneng:

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

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Ayo nggawe dhaptar sawetara wong sing misuwur (presiden, penyanyi, aktor, karakter film) lan ngevaluasi pengaruhe ing dinamika jeneng:

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

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Nggarap skill nggunakake klompok lan visualisasi data ing Python

Kanggo latihan, sampeyan bisa nambah wektu urip selebriti menyang visualisasi saka conto pungkasan supaya bisa netepake kanthi jelas pengaruhe babagan dinamika jeneng.

Kanthi iki, kabeh tujuan kita bisa digayuh lan kawujud. Kita wis dikembangakΓ© skill nggunakake alat kanggo klompok lan visualizing data ing Python, lan kita bakal terus bisa karo data. Saben uwong bisa nggawe kesimpulan adhedhasar data sing wis digambarake dhewe.

Kawruh kanggo kabeh wong!

Source: www.habr.com

Add a comment