Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Hey Habr!

Îro em ê li ser jêhatiya karanîna amûrên ji bo komkirin û dîtina daneyan li Python bixebitin. Di pêşkêşkirî de daneyên li ser Github Ka em çend taybetmendiyan analîz bikin û komek dîtbarî ava bikin.

Li gorî kevneşopiyê, di destpêkê de, em armancan diyar bikin:

  • Daneyên li gorî zayend û sal kom bikin û dînamîkên giştî yên rêjeya jidayikbûnê ya her du zayendan bibînin;
  • Navên herî populer ên her dem bibînin;
  • Tevahiya dema daneyê li 10 beşan dabeş bikin û ji bo her yekê, navê herî populer ê her zayendê bibînin. Ji bo her navek hatî dîtin, dînamîkên wê di her demê de xuya bikin;
  • Ji bo her sal, hesab bikin ka çend nav ji% 50 ji mirovan vedigirin û xuyang bikin (em ê cûrbecûr navan ji bo her sal bibînin);
  • Ji tevahiya navberê 4 salan hilbijêrin û ji bo her sal dabeşkirinê bi tîpa yekem a nav û bi tîpa paşîn a nav nîşan bidin;
  • Navnîşek ji çend kesên navdar (serok, stranbêj, lîstikvan, karakterên fîlimê) çêbikin û bandora wan li ser dînamîkên navan binirxînin. Dîmenek çêbikin.

Peyvên kêm, bêtir kod!

Û, em herin.

Werin em daneyan li gorî zayend û sal kom bikin û dînamîka giştî ya rêjeya jidayikbûnê ya her du zayendan bibînin:

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

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Ka em di dîrokê de navên herî populer bibînin:

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)

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Werin em tevahiya serdema di daneyan de li 10 beşan dabeş bikin û ji bo her yekê em ê navê herî populer ê her zayendê bibînin. Ji bo her navek hatî dîtin, em dînamîkên wê di her demê de xuya dikin:

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

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Ji bo her sal, em hesab dikin ku çend navên 50% ji mirovan digire û vê daneyê xuya dikin:

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

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Werin em 4 salan ji tevahiya navberê hilbijêrin û ji bo her sal dabeşkirinê bi tîpa yekem a nav û bi tîpa paşîn a nav nîşan bidin:

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

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Werin em navnîşek çend kesên navdar (serok, stranbêj, lîstikvan, karakterên fîlimê) çêbikin û bandora wan li ser dînamîkên navan binirxînin:

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

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Li ser jêhatîbûna karanîna komkirin û dîtina daneyê li Python dixebitin

Ji bo perwerdehiyê, hûn dikarin heyama jiyana navdar li dîmena ji mînaka paşîn zêde bikin da ku bi zelalî bandora wan li ser dînamîkên navan binirxînin.

Bi vê yekê hemû armancên me pêk hatin û pêk hatin. Me jêhatîbûna karanîna amûrên ji bo komkirin û dîtina daneyan di Python de pêşxistiye, û em ê xebata bi daneyan re bidomînin. Her kes dikare li ser bingeha daneyên amade, dîtbar bixwe encaman derxe.

Ji her kesî re zanîn!

Source: www.habr.com

Add a comment