Hey Habr!
Dina iki kita bakal nggarap katrampilan nggunakake alat kanggo nglumpukake lan nggambarake data ing Python. Ing kasedhiya
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!
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()
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)
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()
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()
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()
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()
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