Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Hey Habr!

Bu gün biz Python-da məlumatların qruplaşdırılması və vizuallaşdırılması üçün alətlərdən istifadə bacarığı üzərində işləyəcəyik. Təqdim olunanda Github-da verilənlər toplusu Gəlin bir neçə xüsusiyyəti təhlil edək və bir sıra vizuallaşdırmalar yaradaq.

Ənənəyə uyğun olaraq, əvvəlcə məqsədləri müəyyən edək:

  • Məlumatları cins və il üzrə qruplaşdırmaq və hər iki cinsin doğum nisbətinin ümumi dinamikasını vizuallaşdırmaq;
  • Bütün zamanların ən məşhur adlarını tapın;
  • Məlumatlardakı bütün vaxt müddətini 10 hissəyə bölün və hər biri üçün hər cinsin ən məşhur adını tapın. Tapılan hər bir ad üçün onun dinamikasını bütün dövrlərdə görüntüləyin;
  • Hər il üçün insanların 50%-ni neçə ad əhatə etdiyini hesablayın və vizuallaşdırın (hər il üçün adların müxtəlifliyini görəcəyik);
  • Bütün intervaldan 4 il seçin və hər il üçün addakı ilk hərflə və addakı son hərflə paylanmanı göstərin;
  • Bir neçə məşhur insanın (prezidentlər, müğənnilər, aktyorlar, film personajları) siyahısını tərtib edin və onların adların dinamikasına təsirini qiymətləndirin. Vizuallaşdırma qurun.

Daha az söz, daha çox kod!

Və, gedək.

Gəlin məlumatları cins və il üzrə qruplaşdıraq və hər iki cinsin doğum nisbətinin ümumi dinamikasını vizuallaşdıraq:

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

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Tarixdəki ən məşhur adları tapaq:

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)

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Gəlin məlumatdakı bütün vaxt müddətini 10 hissəyə bölək və hər biri üçün hər cinsin ən məşhur adını tapacağıq. Tapılan hər bir ad üçün biz onun dinamikasını bütün zamanlar üzrə vizuallaşdırırıq:

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

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Hər il üçün biz insanların 50%-ni neçə ad əhatə etdiyini hesablayırıq və bu məlumatları vizuallaşdırırıq:

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

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Gəlin bütün intervaldan 4 ili seçək və hər il üçün addakı ilk hərflə və addakı son hərflə paylanmanı göstərək:

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

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Gəlin bir neçə məşhur şəxsin (prezidentlər, müğənnilər, aktyorlar, film personajları) siyahısını tərtib edək və onların adların dinamikasına təsirini qiymətləndirək:

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

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Python-da qruplaşdırma və məlumatların vizuallaşdırılmasından istifadə bacarığı üzərində işləmək

Təlim üçün, adların dinamikasına təsirini aydın qiymətləndirmək üçün məşhurun ​​həyat dövrünü son nümunədən vizuallaşdırmaya əlavə edə bilərsiniz.

Bununla da bütün məqsədlərimizə nail olundu və həyata keçdi. Biz Python-da məlumatların qruplaşdırılması və vizuallaşdırılması üçün alətlərdən istifadə bacarığını inkişaf etdirmişik və verilənlərlə işləməyə davam edəcəyik. Hər kəs özü hazır, vizuallaşdırılmış məlumatlara əsaslanaraq nəticə çıxara bilər.

Hər kəsə bilik!

Mənbə: www.habr.com

Добавить комментарий