Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

ارے حبر۔

В پچھلے حصہ Habr کی ٹریفک کا تجزیہ مرکزی پیرامیٹرز کے مطابق کیا گیا - مضامین کی تعداد، ان کے خیالات اور درجہ بندی۔ تاہم، سائٹ کے حصوں کی مقبولیت کا مسئلہ غیر جانچا رہا۔ اس کو مزید تفصیل سے دیکھنا اور سب سے زیادہ مقبول اور سب سے زیادہ غیر مقبول مرکز تلاش کرنا دلچسپ ہو گیا۔ آخر میں، میں geektimes اثر کو مزید تفصیل سے دیکھوں گا، جس کا اختتام نئی درجہ بندی کی بنیاد پر بہترین مضامین کے نئے انتخاب کے ساتھ ہوگا۔

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

ان لوگوں کے لئے جو اس میں دلچسپی رکھتے ہیں کہ کیا ہوا، تسلسل کٹ کے نیچے ہے۔

میں آپ کو ایک بار پھر یاد دلاتا ہوں کہ اعداد و شمار اور درجہ بندی سرکاری نہیں ہیں، میرے پاس کوئی اندرونی معلومات نہیں ہے۔ یہ بھی گارنٹی نہیں ہے کہ میں نے کہیں غلطی تو نہیں کی یا کچھ چھوٹ گیا۔ لیکن پھر بھی، مجھے لگتا ہے کہ یہ دلچسپ نکلا۔ ہم پہلے کوڈ کے ساتھ شروع کریں گے؛ جو لوگ اس میں دلچسپی نہیں رکھتے وہ پہلے حصے کو چھوڑ سکتے ہیں۔

ڈیٹا اکٹھا کرنا

تجزیہ کار کے پہلے ورژن میں، صرف ملاحظات، تبصروں اور مضمون کی درجہ بندی کو مدنظر رکھا گیا تھا۔ یہ پہلے سے ہی اچھا ہے، لیکن یہ آپ کو زیادہ پیچیدہ سوالات کرنے کی اجازت نہیں دیتا ہے۔ یہ سائٹ کے موضوعاتی حصوں کا تجزیہ کرنے کا وقت ہے؛ یہ آپ کو کافی دلچسپ تحقیق کرنے کی اجازت دے گا، مثال کے طور پر، دیکھیں کہ "C++" سیکشن کی مقبولیت کئی سالوں میں کیسے بدلی ہے۔

مضمون کے تجزیہ کار کو بہتر کر دیا گیا ہے، اب یہ وہ حب واپس کرتا ہے جس سے مضمون کا تعلق ہے، ساتھ ہی مصنف کا عرفی نام اور اس کی درجہ بندی (یہاں بھی بہت سی دلچسپ چیزیں کی جا سکتی ہیں، لیکن یہ بعد میں آئے گی)۔ ڈیٹا کو csv فائل میں محفوظ کیا جاتا ہے جو کچھ اس طرح نظر آتا ہے:

2018-12-18T12:43Z,https://habr.com/ru/post/433550/,"Мессенджер Slack — причины выбора, косяки при внедрении и особенности сервиса, облегчающие жизнь",votes:7,votesplus:8,votesmin:1,bookmarks:32,
views:8300,comments:10,user:ReDisque,karma:5,subscribers:2,hubs:productpm+soft
...

ہمیں سائٹ کے مرکزی موضوعاتی مرکزوں کی فہرست موصول ہوگی۔

def get_as_str(link: str) -> Str:
    try:
        r = requests.get(link)
        return Str(r.text)
    except Exception as e:
        return Str("")

def get_hubs():
    hubs = []
    for p in range(1, 12):
        page_html = get_as_str("https://habr.com/ru/hubs/page%d/" % p)
        # page_html = get_as_str("https://habr.com/ru/hubs/geektimes/page%d/" % p)  # Geektimes
        # page_html = get_as_str("https://habr.com/ru/hubs/develop/page%d/" % p)  # Develop
        # page_html = get_as_str("https://habr.com/ru/hubs/admin/page%d" % p)  # Admin
        for hub in page_html.split("media-obj media-obj_hub"):
            info = Str(hub).find_between('"https://habr.com/ru/hub', 'list-snippet__tags') 
            if "*</span>" in info:
                hub_name = info.find_between('/', '/"')
                if len(hub_name) > 0 and len(hub_name) < 32:
                    hubs.append(hub_name)
    print(hubs)

find_between فنکشن اور Str کلاس دو ٹیگز کے درمیان ایک سٹرنگ منتخب کرتا ہے، میں نے انہیں استعمال کیا۔ پہلے. موضوعاتی حب کو "*" کے ساتھ نشان زد کیا گیا ہے تاکہ وہ آسانی سے نمایاں ہو سکیں، اور آپ دیگر زمروں کے حصے حاصل کرنے کے لیے متعلقہ لائنوں کو غیر تبصرہ بھی کر سکتے ہیں۔

get_hubs فنکشن کا آؤٹ پٹ کافی متاثر کن فہرست ہے، جسے ہم لغت کے طور پر محفوظ کرتے ہیں۔ میں خاص طور پر اس فہرست کو مکمل طور پر پیش کر رہا ہوں تاکہ آپ اس کے حجم کا اندازہ لگا سکیں۔

hubs_profile = {'infosecurity', 'programming', 'webdev', 'python', 'sys_admin', 'it-infrastructure', 'devops', 'javascript', 'open_source', 'network_technologies', 'gamedev', 'cpp', 'machine_learning', 'pm', 'hr_management', 'linux', 'analysis_design', 'ui', 'net', 'hi', 'maths', 'mobile_dev', 'productpm', 'win_dev', 'it_testing', 'dev_management', 'algorithms', 'go', 'php', 'csharp', 'nix', 'data_visualization', 'web_testing', 's_admin', 'crazydev', 'data_mining', 'bigdata', 'c', 'java', 'usability', 'instant_messaging', 'gtd', 'system_programming', 'ios_dev', 'oop', 'nginx', 'kubernetes', 'sql', '3d_graphics', 'css', 'geo', 'image_processing', 'controllers', 'game_design', 'html5', 'community_management', 'electronics', 'android_dev', 'crypto', 'netdev', 'cisconetworks', 'db_admins', 'funcprog', 'wireless', 'dwh', 'linux_dev', 'assembler', 'reactjs', 'sales', 'microservices', 'search_technologies', 'compilers', 'virtualization', 'client_side_optimization', 'distributed_systems', 'api', 'media_management', 'complete_code', 'typescript', 'postgresql', 'rust', 'agile', 'refactoring', 'parallel_programming', 'mssql', 'game_promotion', 'robo_dev', 'reverse-engineering', 'web_analytics', 'unity', 'symfony', 'build_automation', 'swift', 'raspberrypi', 'web_design', 'kotlin', 'debug', 'pay_system', 'apps_design', 'git', 'shells', 'laravel', 'mobile_testing', 'openstreetmap', 'lua', 'vs', 'yii', 'sport_programming', 'service_desk', 'itstandarts', 'nodejs', 'data_warehouse', 'ctf', 'erp', 'video', 'mobileanalytics', 'ipv6', 'virus', 'crm', 'backup', 'mesh_networking', 'cad_cam', 'patents', 'cloud_computing', 'growthhacking', 'iot_dev', 'server_side_optimization', 'latex', 'natural_language_processing', 'scala', 'unreal_engine', 'mongodb', 'delphi',  'industrial_control_system', 'r', 'fpga', 'oracle', 'arduino', 'magento', 'ruby', 'nosql', 'flutter', 'xml', 'apache', 'sveltejs', 'devmail', 'ecommerce_development', 'opendata', 'Hadoop', 'yandex_api', 'game_monetization', 'ror', 'graph_design', 'scada', 'mobile_monetization', 'sqlite', 'accessibility', 'saas', 'helpdesk', 'matlab', 'julia', 'aws', 'data_recovery', 'erlang', 'angular', 'osx_dev', 'dns', 'dart', 'vector_graphics', 'asp', 'domains', 'cvs', 'asterisk', 'iis', 'it_monetization', 'localization', 'objectivec', 'IPFS', 'jquery', 'lisp', 'arvrdev', 'powershell', 'd', 'conversion', 'animation', 'webgl', 'wordpress', 'elm', 'qt_software', 'google_api', 'groovy_grails', 'Sailfish_dev', 'Atlassian', 'desktop_environment', 'game_testing', 'mysql', 'ecm', 'cms', 'Xamarin', 'haskell', 'prototyping', 'sw', 'django', 'gradle', 'billing', 'tdd', 'openshift', 'canvas', 'map_api', 'vuejs', 'data_compression', 'tizen_dev', 'iptv', 'mono', 'labview', 'perl', 'AJAX', 'ms_access', 'gpgpu', 'infolust', 'microformats', 'facebook_api', 'vba', 'twitter_api', 'twisted', 'phalcon', 'joomla', 'action_script', 'flex', 'gtk', 'meteorjs', 'iconoskaz', 'cobol', 'cocoa', 'fortran', 'uml', 'codeigniter', 'prolog', 'mercurial', 'drupal', 'wp_dev', 'smallbasic', 'webassembly', 'cubrid', 'fido', 'bada_dev', 'cgi', 'extjs', 'zend_framework', 'typography', 'UEFI', 'geo_systems', 'vim', 'creative_commons', 'modx', 'derbyjs', 'xcode', 'greasemonkey', 'i2p', 'flash_platform', 'coffeescript', 'fsharp', 'clojure', 'puppet', 'forth', 'processing_lang', 'firebird', 'javame_dev', 'cakephp', 'google_cloud_vision_api', 'kohanaphp', 'elixirphoenix', 'eclipse', 'xslt', 'smalltalk', 'googlecloud', 'gae', 'mootools', 'emacs', 'flask', 'gwt', 'web_monetization', 'circuit-design', 'office365dev', 'haxe', 'doctrine', 'typo3', 'regex', 'solidity', 'brainfuck', 'sphinx', 'san', 'vk_api', 'ecommerce'}

مقابلے کے لیے، گیک ٹائمز سیکشنز زیادہ معمولی نظر آتے ہیں:

hubs_gt = {'popular_science', 'history', 'soft', 'lifehacks', 'health', 'finance', 'artificial_intelligence', 'itcompanies', 'DIY', 'energy', 'transport', 'gadgets', 'social_networks', 'space', 'futurenow', 'it_bigraphy', 'antikvariat', 'games', 'hardware', 'learning_languages', 'urban', 'brain', 'internet_of_things', 'easyelectronics', 'cellular', 'physics', 'cryptocurrency', 'interviews', 'biotech', 'network_hardware', 'autogadgets', 'lasers', 'sound', 'home_automation', 'smartphones', 'statistics', 'robot', 'cpu', 'video_tech', 'Ecology', 'presentation', 'desktops', 'wearable_electronics', 'quantum', 'notebooks', 'cyberpunk', 'Peripheral', 'demoscene', 'copyright', 'astronomy', 'arvr', 'medgadgets', '3d-printers', 'Chemistry', 'storages', 'sci-fi', 'logic_games', 'office', 'tablets', 'displays', 'video_conferencing', 'videocards', 'photo', 'multicopters', 'supercomputers', 'telemedicine', 'cybersport', 'nano', 'crowdsourcing', 'infographics'}

باقی حبس کو اسی طرح محفوظ کیا گیا۔ اب ایسا فنکشن لکھنا آسان ہے جو نتیجہ واپس کرتا ہے چاہے مضمون گیک ٹائمز کا ہو یا پروفائل ہب سے۔

def is_geektimes(hubs: List) -> bool:
    return len(set(hubs) & hubs_gt) > 0

def is_geektimes_only(hubs: List) -> bool:
    return is_geektimes(hubs) is True and is_profile(hubs) is False

def is_profile(hubs: List) -> bool:
    return len(set(hubs) & hubs_profile) > 0

اسی طرح کے افعال دوسرے حصوں ("ترقی"، "انتظامیہ"، وغیرہ) کے لیے کیے گئے تھے۔

پروسیسنگ

یہ تجزیہ شروع کرنے کا وقت ہے. ہم ڈیٹاسیٹ لوڈ کرتے ہیں اور حب ڈیٹا پر کارروائی کرتے ہیں۔

def to_list(s: str) -> List[str]:
    # "user:popular_science+astronomy" => [popular_science, astronomy]
    return s.split(':')[1].split('+')

def to_date(dt: datetime) -> datetime.date:
    return dt.date()

df = pd.read_csv("habr_2019.csv", sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#')
dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ')
dates += datetime.timedelta(hours=3)
df['date'] = dates.map(to_date, na_action=None)
hubs = df["hubs"].map(to_list, na_action=None)
df['hubs'] = hubs
df['is_profile'] = hubs.map(is_profile, na_action=None)
df['is_geektimes'] = hubs.map(is_geektimes, na_action=None)
df['is_geektimes_only'] = hubs.map(is_geektimes_only, na_action=None)
df['is_admin'] = hubs.map(is_admin, na_action=None)
df['is_develop'] = hubs.map(is_develop, na_action=None)

اب ہم ڈیٹا کو دن کے حساب سے گروپ کر سکتے ہیں اور مختلف حبس کے لیے اشاعتوں کی تعداد ظاہر کر سکتے ہیں۔

g = df.groupby(['date'])
days_count = g.size().reset_index(name='counts')
year_days = days_count['date'].values
grouped = g.sum().reset_index()
profile_per_day_avg = grouped['is_profile'].rolling(window=20, min_periods=1).mean()
geektimes_per_day_avg = grouped['is_geektimes'].rolling(window=20, min_periods=1).mean()
geektimesonly_per_day_avg = grouped['is_geektimes_only'].rolling(window=20, min_periods=1).mean()
admin_per_day_avg = grouped['is_admin'].rolling(window=20, min_periods=1).mean()
develop_per_day_avg = grouped['is_develop'].rolling(window=20, min_periods=1).mean()

ہم Matplotlib کا استعمال کرتے ہوئے شائع شدہ مضامین کی تعداد ظاہر کرتے ہیں:

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

میں نے چارٹ میں مضامین "geektimes" اور "geektimes صرف" کو تقسیم کیا، کیونکہ ایک مضمون ایک ہی وقت میں دونوں حصوں سے تعلق رکھتا ہے (مثال کے طور پر، "DIY" + "microcontrollers" + "C++")۔ میں نے سائٹ پر پروفائل آرٹیکلز کو نمایاں کرنے کے لیے "پروفائل" کا نام استعمال کیا، حالانکہ شاید اس کے لیے انگریزی اصطلاح پروفائل بالکل درست نہیں ہے۔

پچھلے حصے میں ہم نے اس موسم گرما میں شروع ہونے والے گیک ٹائمز کے مضامین کے لیے ادائیگی کے قواعد میں تبدیلی سے منسلک "geektimes اثر" کے بارے میں پوچھا۔ آئیے گیک ٹائمز کے مضامین کو الگ سے ڈسپلے کریں:

df_gt = df[(df['is_geektimes_only'] == True)]
group_gt = df_gt.groupby(['date'])
days_count_gt = group_gt.size().reset_index(name='counts')
grouped = group_gt.sum().reset_index()
year_days_gt = days_count_gt['date'].values
view_gt_per_day_avg = grouped['views'].rolling(window=20, min_periods=1).mean()

نتیجہ دلچسپ ہے۔ geektimes کے مضامین کے ملاحظات کا تخمینی تناسب کہیں 1:5 کے آس پاس ہے۔ لیکن جب کہ ملاحظات کی کل تعداد میں نمایاں طور پر اتار چڑھاؤ آیا، "تفریحی" مضامین کو دیکھنے کا انداز تقریباً ایک ہی سطح پر رہا۔

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

آپ یہ بھی دیکھ سکتے ہیں کہ "geektimes" سیکشن میں مضامین کے کل ملاحظات کی تعداد قواعد میں تبدیلی کے بعد بھی گر گئی ہے، لیکن "آنکھوں سے"، کل اقدار کے 5% سے زیادہ نہیں ہے۔

فی مضمون ملاحظات کی اوسط تعداد کو دیکھنا دلچسپ ہے:

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

"تفریحی" مضامین کے لیے یہ اوسط سے تقریباً 40% زیادہ ہے۔ یہ شاید حیرت کی بات نہیں ہے۔ اپریل کے آغاز میں ناکامی میرے لیے واضح نہیں ہے، ہو سکتا ہے کہ ایسا ہی ہوا ہو، یا یہ کسی قسم کی تجزیہ کی غلطی ہو، یا ہو سکتا ہے کہ گیک ٹائم کے مصنفین میں سے ایک چھٹی پر گیا ہو؛)۔

ویسے، گراف مضامین کے آراء کی تعداد میں دو اور نمایاں چوٹیوں کو دکھاتا ہے - نئے سال اور مئی کی چھٹیاں۔

حبس

آئیے حبس کے وعدے کے مطابق تجزیہ کی طرف چلتے ہیں۔ آئیے ملاحظات کی تعداد کے لحاظ سے سرفہرست 20 مرکزوں کی فہرست بنائیں:

hubs_info = []
for hub_name in hubs_all:
    mask = df['hubs'].apply(lambda x: hub_name in x)
    df_hub = df[mask]

    count, views = df_hub.shape[0], df_hub['views'].sum()
    hubs_info.append((hub_name, count, views))

# Draw hubs
hubs_top = sorted(hubs_info, key=lambda v: v[2], reverse=True)[:20]
top_views = list(map(lambda x: x[2], hubs_top))
top_names = list(map(lambda x: x[0], hubs_top))

plt.rcParams["figure.figsize"] = (8, 6)
plt.bar(range(0, len(top_views)), top_views)
plt.xticks(range(0, len(top_names)), top_names, rotation=90)
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()

نتیجہ:

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

حیرت انگیز طور پر، خیالات کے لحاظ سے سب سے زیادہ مقبول مرکز "انفارمیشن سیکیورٹی" تھا؛ سرفہرست 5 رہنماؤں میں "پروگرامنگ" اور "مقبول سائنس" بھی شامل تھے۔

Antitop Gtk اور Cocoa پر قبضہ کرتا ہے۔

Habrastatistics: سائٹ کے سب سے زیادہ اور کم سے کم دیکھے جانے والے حصوں کی تلاش

میں آپ کو ایک راز بتاتا ہوں، اوپر والے حبس بھی دیکھے جا سکتے ہیں۔ یہاںاگرچہ ملاحظات کی تعداد وہاں نہیں دکھائی گئی ہے۔

درجہ بندی

اور آخر میں، وعدہ کی درجہ بندی. ہب کے تجزیہ کے اعداد و شمار کا استعمال کرتے ہوئے، ہم اس سال 2019 کے سب سے زیادہ مقبول مرکزوں کے لیے سب سے زیادہ مقبول مضامین ڈسپلے کر سکتے ہیں۔

معلومات کی حفاظت

پروگرامنگ

پاپولر سائنس

کیریئر

آئی ٹی میں قانون سازی

ویب سازی

GTK

اور آخر میں، تاکہ کوئی ناراض نہ ہو، میں سب سے کم دیکھے جانے والے مرکز "gtk" کی ریٹنگ دوں گا۔ ایک سال کے اندر یہ شائع ہو گیا۔ ایک مضمون، جو "خود بخود" درجہ بندی کی پہلی سطر پر بھی قابض ہے۔

حاصل يہ ہوا

کوئی نتیجہ نہیں نکلے گا۔ سب کو پڑھ کر خوشی ہوئی۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں