ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಹಲೋ, ಹಬ್ರ್!

ಇಂದು ನಾವು ಪೈಥಾನ್‌ನಲ್ಲಿ ಡೇಟಾವನ್ನು ಗುಂಪು ಮಾಡಲು ಮತ್ತು ದೃಶ್ಯೀಕರಿಸಲು ಪರಿಕರಗಳನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುತ್ತೇವೆ. ಒದಗಿಸಿದ ರಲ್ಲಿ 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()

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಇತಿಹಾಸದಲ್ಲಿ ಅತ್ಯಂತ ಜನಪ್ರಿಯ ಹೆಸರುಗಳನ್ನು ಕಂಡುಹಿಡಿಯೋಣ:

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

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ಪೈಥಾನ್‌ನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಮತ್ತು ಡೇಟಾ ದೃಶ್ಯೀಕರಣವನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯದ ಮೇಲೆ ಕೆಲಸ ಮಾಡುವುದು

ತರಬೇತಿಗಾಗಿ, ಹೆಸರುಗಳ ಡೈನಾಮಿಕ್ಸ್ ಮೇಲೆ ಅವರ ಪ್ರಭಾವವನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ನಿರ್ಣಯಿಸಲು ನೀವು ಕೊನೆಯ ಉದಾಹರಣೆಯಿಂದ ದೃಶ್ಯೀಕರಣಕ್ಕೆ ಸೆಲೆಬ್ರಿಟಿಗಳ ಜೀವಿತಾವಧಿಯನ್ನು ಸೇರಿಸಬಹುದು.

ಇದರೊಂದಿಗೆ, ನಮ್ಮ ಎಲ್ಲಾ ಗುರಿಗಳನ್ನು ಸಾಧಿಸಲಾಯಿತು ಮತ್ತು ಪೂರೈಸಲಾಯಿತು. ಪೈಥಾನ್‌ನಲ್ಲಿ ಡೇಟಾವನ್ನು ಗುಂಪು ಮಾಡಲು ಮತ್ತು ದೃಶ್ಯೀಕರಿಸಲು ಪರಿಕರಗಳನ್ನು ಬಳಸುವ ಕೌಶಲ್ಯವನ್ನು ನಾವು ಅಭಿವೃದ್ಧಿಪಡಿಸಿದ್ದೇವೆ ಮತ್ತು ನಾವು ಡೇಟಾದೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತೇವೆ. ಪ್ರತಿಯೊಬ್ಬರೂ ಸಿದ್ಧಪಡಿಸಿದ, ದೃಶ್ಯೀಕರಿಸಿದ ಡೇಟಾವನ್ನು ಆಧರಿಸಿ ತೀರ್ಮಾನಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು.

ಎಲ್ಲರಿಗೂ ಜ್ಞಾನ!

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ