ارے حبر!
آج ہم Python میں ڈیٹا گروپنگ اور ویژولائزیشن ٹولز استعمال کرنے کی مہارت پر کام کریں گے۔ فراہم کردہ میں
روایت کے مطابق، شروع میں، ہم اہداف کی وضاحت کرتے ہیں:
- جنس اور سال کے لحاظ سے ڈیٹا کو گروپ کریں اور دونوں جنسوں کی شرح پیدائش کی مجموعی حرکیات کا تصور کریں۔
- تاریخ میں سب سے زیادہ مقبول نام تلاش کریں؛
- ڈیٹا میں پورے وقت کی مدت کو 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()
آئیے تاریخ کے سب سے مشہور نام تلاش کرتے ہیں:
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)
آئیے ڈیٹا میں پورے وقت کو 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()
ہر سال کے لیے، ہم حساب لگاتے ہیں کہ 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()
آئیے پورے وقفے سے 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()
آئیے کئی مشہور لوگوں (صدر، گلوکار، اداکار، فلمی ہیرو) کی فہرست بناتے ہیں اور ناموں کی حرکیات پر ان کے اثرات کا جائزہ لیتے ہیں:
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 میں ڈیٹا گروپنگ اور ویژولائزیشن ٹولز کے استعمال میں مہارت حاصل کر لی ہے، اور ہم ڈیٹا کے ساتھ مزید کام کریں گے۔ ہر کوئی ریڈی میڈ، تصوراتی ڈیٹا پر نتیجہ اخذ کر سکتا ہے۔
تمام علم!
ماخذ: www.habr.com