Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Haye Habr!

БСгодня Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π²Ρ‹ΠΊ использования срСдств группирования ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python. Π’ прСдоставлСнном датасСтС Π½Π° Github ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ нСсколько характСристик ΠΈ построим Π½Π°Π±ΠΎΡ€ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.

По Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ, Π² Π½Π°Ρ‡Π°Π»Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ†Π΅Π»ΠΈ:

  • Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΠΎΠ»Ρƒ ΠΈ Π³ΠΎΠ΄Ρƒ ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ роТдаСмости ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ»ΠΎΠ²;
  • Найти самыС популярныС ΠΈΠΌΠ΅Π½Π° Π·Π° всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ;
  • Π Π°Π·Π±ΠΈΡ‚ΡŒ вСсь Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π² Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° 10 частСй ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π°ΠΉΡ‚ΠΈ самоС популярноС имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ Π·Π° всС врСмя;
  • Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сколько ΠΈΠΌΠ΅Π½ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ 50% людСй ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΈΠΌΠ΅Π½ Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π³ΠΎΠ΄);
  • Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ 4 Π³ΠΎΠ΄Π° ΠΈΠ· всСго ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° распрСдСлСниС ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎ послСднСй Π±ΡƒΠΊΠ²Π΅ Π² ΠΈΠΌΠ΅Π½ΠΈ;
  • Π‘ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… извСстных людСй (ΠΏΡ€Π΅Π·ΠΈΠ΄Π΅Π½Ρ‚Ρ‹, ΠΏΠ΅Π²Ρ†Ρ‹, Π°ΠΊΡ‚Π΅Ρ€Ρ‹, ΠΊΠΈΠ½ΠΎΠ³Π΅Ρ€ΠΎΠΈ) ΠΈ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… влияниС Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ ΠΈΠΌΠ΅Π½. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π°Π³Π»ΡΠ΄Π½ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

МСньшС слов, большС кода!

И, ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ.

Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΠΎΠ»Ρƒ ΠΈ Π³ΠΎΠ΄Ρƒ ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Ρ‰ΡƒΡŽ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ роТдаСмости ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ»ΠΎΠ²:

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

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

НайдСм самыС популярныС ΠΈΠΌΠ΅Π½Π° Π·Π° всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ:

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)

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Π Π°Π·ΠΎΠ±ΡŒΡ‘ΠΌ вСсь Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π² Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° 10 частСй ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π°ΠΉΠ΄Π΅ΠΌ самоС популярноС имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ Π·Π° всС врСмя:

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

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° рассчитаСм сколько ΠΈΠΌΠ΅Π½ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ 50% людСй ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅:

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

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ 4 Π³ΠΎΠ΄Π° ΠΈΠ· всСго ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° распрСдСлСниС ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎ послСднСй Π±ΡƒΠΊΠ²Π΅ Π² ΠΈΠΌΠ΅Π½ΠΈ:

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

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Боставим список ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… извСстных людСй (ΠΏΡ€Π΅Π·ΠΈΠ΄Π΅Π½Ρ‚Ρ‹, ΠΏΠ΅Π²Ρ†Ρ‹, Π°ΠΊΡ‚Π΅Ρ€Ρ‹, ΠΊΠΈΠ½ΠΎΠ³Π΅Ρ€ΠΎΠΈ) ΠΈ ΠΎΡ†Π΅Π½ΠΈΠΌ ΠΈΡ… влияниС Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ ΠΈΠΌΠ΅Π½:

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

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Ka shaqaynta xirfada isticmaalka kooxaynta iyo xog ururinta ee Python

Для Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ· послСднСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΆΠΈΠ·Π½ΠΈ знамСнитости, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для наглядности ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… влияниС Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ ΠΈΠΌΠ΅Π½.

На этом всС наши Ρ†Π΅Π»ΠΈ Π±Ρ‹Π»ΠΈ достигнуты ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹. ΠœΡ‹ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π½Π°Π²Ρ‹ΠΊ использования срСдств группирования ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Python, ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ дальшС. Π’Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΏΠΎ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ смоТСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сам.

ВсСм Π·Π½Π°Π½ΠΈΠΉ!

Source: www.habr.com

Add a comment