Habrastatistics: рд╕рд╛рдЗрдЯрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдЖрдгрд┐ рдХрдореАрдд рдХрдореА рднреЗрдЯ рджрд┐рд▓реЗрд▓реЗ рд╡рд┐рднрд╛рдЧ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдгреЗ

рдЕрд╣реЛ рд╣рдмреНрд░.

╨Т рдорд╛рдЧреАрд▓ рднрд╛рдЧ Habr рдЪреНрдпрд╛ рд░рд╣рджрд╛рд░реАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореБрдЦреНрдп рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдиреБрд╕рд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ - рд▓реЗрдЦрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛, рддреНрдпрд╛рдВрдЪреА рджреГрд╢реНрдпреЗ рдЖрдгрд┐ рд░реЗрдЯрд┐рдВрдЧ. рддрдерд╛рдкрд┐, рд╕рд╛рдЗрдЯ рд╡рд┐рднрд╛рдЧрд╛рдВрдЪреНрдпрд╛ рд▓реЛрдХрдкреНрд░рд┐рдпрддреЗрдЪрд╛ рдореБрджреНрджрд╛ рддрдкрд╛рд╕рд▓рд╛ рдЧреЗрд▓рд╛ рдирд╛рд╣реА. рд╣реЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╛рдиреЗ рдкрд╛рд╣рдгреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╕рд▓реЗрд▓реЗ рдХреЗрдВрджреНрд░ рд╢реЛрдзрдгреЗ рдордиреЛрд░рдВрдЬрдХ рдмрдирд▓реЗ. рд╢реЗрд╡рдЯреА, рдореА рдирд╡реАрди рд░рдБрдХрд┐рдВрдЧрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕рд░реНрд╡реЛрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдирд╡реАрди рдирд┐рд╡рдбреАрд╕рд╣, рдЧреАрдХрдЯрд╛рдЗрдореНрд╕ рдкреНрд░рднрд╛рд╡ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ.

Habrastatistics: рд╕рд╛рдЗрдЯрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдЖрдгрд┐ рдХрдореАрдд рдХрдореА рднреЗрдЯ рджрд┐рд▓реЗрд▓реЗ рд╡рд┐рднрд╛рдЧ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдгреЗ

рдЬреЗ рдШрдбрд▓реЗ рддреНрдпрд╛рдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╕рд╛рдареА, рдирд┐рд░рдВрддрд░рддрд╛ рдХрдЯ рдЕрдВрддрд░реНрдЧрдд рдЖрд╣реЗ.

рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреБрдиреНрд╣рд╛ рдПрдХрджрд╛ рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ рдХреА рдЖрдХрдбреЗрд╡рд╛рд░реА рдЖрдгрд┐ рд░реЗрдЯрд┐рдВрдЧ рдЕрдзрд┐рдХреГрдд рдирд╛рд╣реАрдд, рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдХреЛрдгрддреАрд╣реА рдЖрдВрддрд░рд┐рдХ рдорд╛рд╣рд┐рддреА рдирд╛рд╣реА. рдореА рдХреБрдареЗрддрд░реА рдЪреВрдХ рдХреЗрд▓реА рдирд╛рд╣реА рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реАрддрд░реА рдЪреБрдХрд▓реЗ рдирд╛рд╣реА рдпрд╛рдЪреАрд╣реА рдЦрд╛рддреНрд░реА рдирд╕рддреЗ. рдкрдг рддрд░реАрд╣реА, рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рддреЗ рдордиреЛрд░рдВрдЬрдХ рдЭрд╛рд▓реЗ. рдЖрдореНрд╣реА рдкреНрд░рдердо рдХреЛрдбрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВ; рдЬреНрдпрд╛рдВрдирд╛ рдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдирд╛рд╣реА рддреЗ рдкрд╣рд┐рд▓реЗ рд╡рд┐рднрд╛рдЧ рд╡рдЧрд│реВ рд╢рдХрддрд╛рдд.

рдорд╛рд╣рд┐рддреА рд╕рдВрдХрд▓рди

рдкрд╛рд░реНрд╕рд░рдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рдХреЗрд╡рд│ рджреГрд╢реНрдпреЗ, рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдЖрдгрд┐ рд▓реЗрдЦ рд░реЗрдЯрд┐рдВрдЧрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реА рдЧреЗрд▓реА. рд╣реЗ рдЖрдзреАрдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА. рд╕рд╛рдЗрдЯрдЪреНрдпрд╛ рдереАрдореЕрдЯрд┐рдХ рд╡рд┐рднрд╛рдЧрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪреА рд╣реА рд╡реЗрд│ рдЖрд╣реЗ; рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдмрд░реЗрдЪ рдордиреЛрд░рдВрдЬрдХ рд╕рдВрд╢реЛрдзрди рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, тАЬC++тАЭ рд╡рд┐рднрд╛рдЧрд╛рдЪреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдордзреНрдпреЗ рдХрд╢реА рдмрджрд▓рд▓реА рдЖрд╣реЗ рддреЗ рдкрд╣рд╛.

рд▓реЗрдЦ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реБрдзрд╛рд░рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ, рдЖрддрд╛ рддреЛ рд▓реЗрдЦ рдЬреНрдпрд╛ рд╣рдмрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ, рддрд╕реЗрдЪ рд▓реЗрдЦрдХрд╛рдЪреЗ рдЯреЛрдкрдгрдирд╛рд╡ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд░реЗрдЯрд┐рдВрдЧ рдкрд░рдд рдХрд░рддреЛ (рдмрд░реНтАНрдпрд╛рдЪ рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯреА рдпреЗрдереЗ рджреЗрдЦреАрд▓ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдкрд░рдВрддреБ рддреНрдпрд╛ рдирдВрддрд░ рдпреЗрддреАрд▓). рдбреЗрдЯрд╛ рд╕реАрдПрд╕рд╡реНрд╣реА рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЬреЛ рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕рддреЛ:

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

рддреБрд▓рдиреЗрд╕рд╛рдареА, 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()

рдЖрдореНрд╣реА рдореЕрдЯрдкреНрд▓реЙрдЯрд▓рд┐рдм рд╡рд╛рдкрд░реВрди рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЛ:

Habrastatistics: рд╕рд╛рдЗрдЯрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдЖрдгрд┐ рдХрдореАрдд рдХрдореА рднреЗрдЯ рджрд┐рд▓реЗрд▓реЗ рд╡рд┐рднрд╛рдЧ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдгреЗ

рдореА рдЪрд╛рд░реНрдЯрдордзреАрд▓ тАЬрдЧреАрдХрдЯрд╛рдЗрдореНрд╕тАЭ рдЖрдгрд┐ тАЬрдлрдХреНрдд рдЧреАрдХрдЯрд╛рдЗрдореНрд╕тАЭ рдЕрд╕реЗ рд▓реЗрдЦ рд╡рд┐рднрд╛рдЧрд▓реЗ рдЖрд╣реЗрдд, рдХрд╛рд░рдг рд▓реЗрдЦ рдПрдХрд╛рдЪ рд╡реЗрд│реА рджреЛрдиреНрд╣реА рд╡рд┐рднрд╛рдЧрд╛рдВрдЪрд╛ рдЕрд╕реВ рд╢рдХрддреЛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, тАЬDIYтАЭ + тАЬрдорд╛рдпрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░тАЭ + тАЬ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 рдЖрдгрд┐ рдХреЛрдХреЛ рд╡реНрдпрд╛рдкрд▓рд╛ рдЖрд╣реЗ.

Habrastatistics: рд╕рд╛рдЗрдЯрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдЖрдгрд┐ рдХрдореАрдд рдХрдореА рднреЗрдЯ рджрд┐рд▓реЗрд▓реЗ рд╡рд┐рднрд╛рдЧ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдгреЗ

рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЧреБрдкрд┐рдд рд╕рд╛рдВрдЧреЗрди, рд╡рд░рдЪреЗ рд╣рдм рджреЗрдЦреАрд▓ рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдпреЗрдереЗ, рдЬрд░реА рддреЗрдереЗ рджреГрд╢реНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрд╢рд╡рд┐рд▓реА рдЬрд╛рдд рдирд╛рд╣реА.

рд░реЗрдЯрд┐рдВрдЧ

рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, рд╡рдЪрди рджрд┐рд▓реЗрд▓реЗ рд░реЗрдЯрд┐рдВрдЧ. рд╣рдм рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдбреЗрдЯрд╛ рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рдпрд╛ рд╡рд░реНрд╖ 2019 рд╕рд╛рдареА рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣рдмрд╕рд╛рдареА рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЗрдЦ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВ рд╢рдХрддреЛ.

рдорд╛рд╣рд┐рддреА рд╕реБрд░рдХреНрд╖рд╛

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рдЬреНрдЮрд╛рди

рдХрд░рд┐рдЕрд░

рдЖрдпрдЯреА рдордзреНрдпреЗ рдХрд╛рдпрджреЗ

рд╡реЗрдм рд╡рд┐рдХрд╛рд╕

рдЬреАрдЯреАрдХреЗ

рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, рдЬреЗрдгреЗрдХрд░реВрди рдХреЛрдгреАрд╣реА рдирд╛рд░рд╛рдЬ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА, рдореА рд╕рд░реНрд╡рд╛рдд рдХрдореА рднреЗрдЯ рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╣рдм "gtk" рдЪреЗ рд░реЗрдЯрд┐рдВрдЧ рджреЗрдИрди. рд╡рд░реНрд╖рднрд░рд╛рдд рддреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЭрд╛рд▓реЗ рдПрдХ рд▓реЗрдЦ, рдЬреЛ "рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ" рд░реЗрдЯрд┐рдВрдЧрдЪреА рдкрд╣рд┐рд▓реА рдУрд│ рджреЗрдЦреАрд▓ рд╡реНрдпрд╛рдкрддреЛ.

рдирд┐рд╖реНрдХрд░реНрд╖

рдХреЛрдгрддрд╛рд╣реА рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдШрдгрд╛рд░ рдирд╛рд╣реА. рд╕рд░реНрд╡рд╛рдВрдирд╛ рд╡рд╛рдЪреВрди рдЖрдирдВрдж рдЭрд╛рд▓рд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛