Habrastatistics: سائيٽ جي سڀ کان وڌيڪ ۽ گهٽ ۾ گهٽ دورو ڪيل حصن کي ڳولڻ

هي حبر.

В پويون حصو Habr جي ٽرئفڪ جو تجزيو ڪيو ويو مکيه پيٽرولن جي مطابق - آرٽيڪل جو تعداد، انهن جي نظريات ۽ درجه بندي. بهرحال، سائيٽ جي حصن جي مقبوليت جو مسئلو اڻڄاتل رهيو. اهو دلچسپ ٿي ويو ته هن کي وڌيڪ تفصيل سان ڏسڻ ۽ سڀ کان وڌيڪ مشهور ۽ سڀ کان وڌيڪ غير مقبول مرڪز ڳولڻ. آخرڪار، مان وڌيڪ تفصيل سان جيڪ ٽائمز اثر کي ڏسندس، نئين درجه بندي جي بنياد تي بهترين مضمونن جي نئين چونڊ سان ختم ڪندي.

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 function ۽ 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'}

باقي حب ساڳيءَ طرح محفوظ ڪيا ويا. هاڻي اهو هڪ فنڪشن لکڻ آسان آهي جيڪو نتيجو ڏئي ٿو ته مضمون geektimes يا پروفائل حب سان تعلق رکي ٿو.

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: سائيٽ جي سڀ کان وڌيڪ ۽ گهٽ ۾ گهٽ دورو ڪيل حصن کي ڳولڻ

مون چارٽ ۾ آرٽيڪل ”جيڪ ٽائمز“ ۽ ”صرف جيڪ ٽائمز“ کي ورهايو، ڇاڪاڻ ته هڪ مضمون هڪ ئي وقت ٻنهي حصن سان تعلق رکي سگهي ٿو (مثال طور، “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: سائيٽ جي سڀ کان وڌيڪ ۽ گهٽ ۾ گهٽ دورو ڪيل حصن کي ڳولڻ

توهان اهو پڻ نوٽيس ڪري سگهو ٿا ته "جيڪ ٽائمز" سيڪشن ۾ آرٽيڪل جي نظرن جو ڪل تعداد اڃا تائين ضابطن کي تبديل ڪرڻ کان پوء گهٽجي ويو، پر "اکين طرفان"، مجموعي قدرن جي 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 اڳواڻن ۾ "پروگرامنگ" ۽ "مقبول سائنس" پڻ شامل هئا.

اينٽي ٽاپ Gtk ۽ Cocoa تي قبضو ڪري ٿو.

Habrastatistics: سائيٽ جي سڀ کان وڌيڪ ۽ گهٽ ۾ گهٽ دورو ڪيل حصن کي ڳولڻ

مان توکي هڪ راز ٻڌايان ٿو، مٿيون حب به ڏسي سگھان ٿو هتي، جيتوڻيڪ ڏسڻ جو تعداد اتي نه ڏيکاريو ويو آهي.

درجه بندي

۽ آخرڪار، واعدو ڪيل درجه بندي. حب تجزيي جي ڊيٽا استعمال ڪندي، اسان هن سال 2019 لاء سڀ کان وڌيڪ مشهور حب لاء سڀ کان وڌيڪ مشهور آرٽيڪل ڊسپلي ڪري سگهون ٿا.

معلومات سيڪيورٽي

پروگرامنگ

مشهور سائنس

سنڀاليندڙ

آئي ٽي ۾ قانون سازي

ويب ڊولپمينٽ

GTK

۽ آخر ۾، ته جيئن ڪو به ناراض نه ٿئي، مان گهٽ ۾ گهٽ دورو ڪيل حب "gtk" جي درجه بندي ڏيندس. هڪ سال اندر شايع ٿيو هڪ آرٽيڪل، جيڪو پڻ "خودڪار" درجه بندي جي پهرين لائن تي قبضو ڪري ٿو.

ٿڪل

ڪو به نتيجو نه نڪرندو. هرڪو پڙهڻ خوش ٿيو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو