Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Hai Habr!

Hari ini kita akan mengusahakan kemahiran menggunakan alatan untuk mengumpulkan dan menggambarkan data dalam Python. Dalam yang disediakan set data pada Github Mari analisa beberapa ciri dan bina satu set visualisasi.

Menurut tradisi, pada mulanya, mari kita tentukan matlamat:

  • Kumpulkan data mengikut jantina dan tahun dan gambarkan dinamik keseluruhan kadar kelahiran kedua-dua jantina;
  • Cari nama paling popular sepanjang masa;
  • Bahagikan keseluruhan tempoh masa dalam data kepada 10 bahagian dan bagi setiap satu, cari nama paling popular bagi setiap jantina. Untuk setiap nama yang ditemui, gambarkan dinamiknya sepanjang masa;
  • Untuk setiap tahun, hitung berapa banyak nama yang meliputi 50% orang dan gambarkan (kita akan melihat pelbagai nama untuk setiap tahun);
  • Pilih 4 tahun daripada keseluruhan selang dan paparkan untuk setiap tahun taburan dengan huruf pertama dalam nama dan dengan huruf terakhir dalam nama;
  • Buat senarai beberapa orang terkenal (presiden, penyanyi, pelakon, watak filem) dan nilai pengaruh mereka terhadap dinamik nama. Bina visualisasi.

Kurang perkataan, lebih banyak kod!

Dan, mari pergi.

Mari kumpulkan data mengikut jantina dan tahun dan gambarkan dinamik keseluruhan kadar kelahiran kedua-dua jantina:

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

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mari cari nama paling popular dalam 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)

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mari bahagikan keseluruhan tempoh masa dalam data kepada 10 bahagian dan untuk setiap satu kita akan mencari nama paling popular bagi setiap jantina. Untuk setiap nama yang ditemui, kami menggambarkan dinamiknya sepanjang masa:

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

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Untuk setiap tahun, kami mengira bilangan nama yang meliputi 50% orang dan menggambarkan data ini:

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

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mari pilih 4 tahun daripada keseluruhan selang dan paparkan untuk setiap tahun taburan mengikut huruf pertama dalam nama dan dengan huruf terakhir dalam nama:

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

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mari kita buat senarai beberapa orang terkenal (presiden, penyanyi, pelakon, watak filem) dan menilai pengaruh mereka terhadap dinamik nama:

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

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Mengusahakan kemahiran menggunakan pengumpulan dan visualisasi data dalam Python

Untuk latihan, anda boleh menambah tempoh hayat selebriti pada visualisasi daripada contoh terakhir untuk menilai dengan jelas pengaruh mereka pada dinamik nama.

Dengan ini, semua matlamat kami tercapai dan tercapai. Kami telah membangunkan kemahiran menggunakan alatan untuk mengumpulkan dan menggambarkan data dalam Python, dan kami akan terus bekerja dengan data. Semua orang boleh membuat kesimpulan berdasarkan data yang telah divisualisasikan sendiri.

Pengetahuan kepada semua orang!

Sumber: www.habr.com

Tambah komen