Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ части Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΡΠ΅Ρ‰Π°Π΅ΠΌΠΎΡΡ‚ΡŒ Π₯Π°Π±Ρ€Π° ΠΏΠΎ основным ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ β€” количСству статСй, ΠΈΡ… просмотрам ΠΈ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π°ΠΌ. Однако вопрос популярности Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² сайта остался Π½Π΅ рассмотрСнным. Π‘Ρ‚Π°Π»ΠΎ интСрСсно Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ это Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΈ Π½Π°ΠΉΡ‚ΠΈ самыС популярныС ΠΈ самыС нСпопулярныС Ρ…Π°Π±Ρ‹. НаконСц, я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ Β«geektimes-эффСкт» Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΈ Π² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΡƒ Π»ΡƒΡ‡ΡˆΠΈΡ… статСй ΠΏΠΎ Π½ΠΎΠ²Ρ‹ΠΌ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π°ΠΌ.

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

ΠšΠΎΠΌΡƒ интСрСсно Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ.

Π•Ρ‰Π΅ Ρ€Π°Π· напомню, Ρ‡Ρ‚ΠΎ статистика ΠΈ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ инсайдСрской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρƒ мСня Π½Π΅Ρ‚. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ гарантируСтся, Ρ‡Ρ‚ΠΎ я Π³Π΄Π΅-Ρ‚ΠΎ Π½Π΅ ошибся ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ пропустил. Но всС ΠΆΠ΅, Π΄ΡƒΠΌΠ°ΡŽ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ интСрСсно. ΠœΡ‹ приступим сначала ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΊΠΎΠΌΡƒ это Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Π‘Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии парсСра ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ лишь число просмотров, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ статСй. Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ Π½Π΅ позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС запросы. ΠŸΠΎΡ€Π° ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСматичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта, это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ достаточно интСрСсныС исслСдования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ мСнялась ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π° Β«Π‘++Β» Π·Π° нСсколько Π»Π΅Ρ‚.

ΠŸΠ°Ρ€ΡΠ΅Ρ€ статСй Π±Ρ‹Π» ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ…Π°Π±Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относится ΡΡ‚Π°Ρ‚ΡŒΡ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½ΠΈΠΊ Π°Π²Ρ‚ΠΎΡ€Π° ΠΈ Π΅Π³ΠΎ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ (Ρ‚ΡƒΡ‚ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсного, Π½ΠΎ это ΠΏΠΎΡ‚ΠΎΠΌ). Π”Π°Π½Π½Ρ‹Π΅ сохранСны Π² 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 ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ достаточно Π²Π½ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСм ΠΊΠ°ΠΊ dictionary. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ список Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ объСм.

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

Для сравнСния, Ρ€Π°Π·Π΄Π΅Π»Ρ‹ geektimes выглядят скромнСС:

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:

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

Π― Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ» Π² Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«geektimesΒ» ΠΈ Β«geektimes onlyΒ», Ρ‚.ΠΊ. ΡΡ‚Π°Ρ‚ΡŒΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊ ΠΎΠ±Π΅ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«DIYΒ» + Β«ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹Β» + Β«Π‘++Β»). ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Β«profileΒ» я Π²Ρ‹Π΄Π΅Π»ΠΈΠ» ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ сайта, хотя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, английский Ρ‚Π΅Ρ€ΠΌΠΈΠ½ profile для этого Π½Π΅ совсСм Π²Π΅Ρ€Π½Ρ‹ΠΉ.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ части ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΠΈ ΠΏΡ€ΠΎ Β«geektimes-эффСкт», связанный с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠΏΠ»Π°Ρ‚Ρ‹ статСй для geektimes с этого Π»Π΅Ρ‚Π°. Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡΡ‚Π°Ρ‚ΡŒΠΈ 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. Но Ссли ΠΎΠ±Ρ‰Π΅Π΅ число просмотров Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ колСбалось, Ρ‚ΠΎ просмотр Β«Ρ€Π°Π·Π²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…Β» статСй дСрТался ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ число просмотров статСй Ρ€Π°Π·Π΄Π΅Π»Π° Β«geektimesΒ» послС измСнСния ΠΏΡ€Π°Π²ΠΈΠ» всС ΠΆΠ΅ ΡƒΠΏΠ°Π»ΠΎ, Π½ΠΎ Β«Π½Π° Π³Π»Π°Π·Β», Π½Π΅ большС Ρ‡Π΅ΠΌ Π½Π° 5% ΠΎΡ‚ ΠΎΠ±Ρ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ срСднСС число просмотров Π½Π° ΡΡ‚Π°Ρ‚ΡŒΡŽ:

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

Для Β«Ρ€Π°Π·Π²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…Β» статСй ΠΎΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 40% Π²Ρ‹ΡˆΠ΅ срСднСго. НавСрно это Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΎΠ²Π°Π» Π² Π½Π°Ρ‡Π°Π»Π΅ апрСля ΠΌΠ½Π΅ нСпонятСн, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊ ΠΈ Π±Ρ‹Π»ΠΎ, ΠΈΠ»ΠΈ это какая-Ρ‚ΠΎ ошибка парсинга, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² geektimes ΡƒΡˆΠ΅Π» Π² отпуск ;).

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π²ΠΈΠ΄Π½Ρ‹ Π΅Ρ‰Π΅ Π΄Π²Π° Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΈΠΊΠ° числа просмотров статСй β€” Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄Π½ΠΈΠ΅ ΠΈ майскиС ΠΏΡ€Π°Π·Π΄Π½ΠΈΠΊΠΈ.

Π₯Π°Π±Ρ‹

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΎΠ±Π΅Ρ‰Π°Π½Π½ΠΎΠΌΡƒ Π°Π½Π°Π»ΠΈΠ·Ρƒ Ρ…Π°Π±ΠΎΠ². Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ Ρ‚ΠΎΠΏ 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()

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

На ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅, самым популярным ΠΏΠΎ просмотрам оказался Ρ…Π°Π± Β«Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΒ», Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ‚ΠΎΠΏ-5 Π»ΠΈΠ΄Π΅Ρ€ΠΎΠ² входят Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» ΠΈ Β«Popular scienceΒ».

Антитоп Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Gtk ΠΈ Cocoa.

Π₯абрастатистика: исслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ посСщаСмыС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ сайта

Π‘ΠΊΠ°ΠΆΡƒ ΠΏΠΎ сСкрСту, Ρ‚ΠΎΠΏ Ρ…Π°Π±ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ здСсь, хотя число просмотров Ρ‚Π°ΠΌ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ.

Π Π΅ΠΉΡ‚ΠΈΠ½Π³

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ±Π΅Ρ‰Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π°Π½Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΈΠ·Π° Ρ…Π°Π±ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ вывСсти самыС популярныС ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ самым популярным Ρ…Π°Π±Π°ΠΌ Π·Π° этот 2019 Π³ΠΎΠ΄.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Научно-популярноС

ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π°

Π—Π°ΠΊΠΎΠ½ΠΎΠ΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π² IT

Π’Π΅Π±-Π΄Π΅Π²Π΅Π»ΠΎΠΏΠΌΠ΅Π½Ρ‚

GTK

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΠΈΠ΄Π½ΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ самого малопосСщаСмого Ρ…Π°Π±Π° Β«gtkΒ». Π’ Π½Π΅ΠΌ Π·Π° Π³ΠΎΠ΄ Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° ΠΎΠ΄Π½Π° ΡΡ‚Π°Ρ‚ΡŒΡ, ΠΎΠ½Π° ΠΆΠ΅ Β«Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌΒ» Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ВсСм приятного чтСния.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ