рд╣реИрдмреНрд░реЗрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХреНрд╕: рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдмрд╕реЗ рдХрдо рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛

рд╣рд╛рдп, рд╣реИрдмреНрд░ред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣реИрдмрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореБрдЦреНрдп рдорд╛рдкрджрдВрдбреЛрдВ - рд▓реЗрдЦреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЙрдирдХреЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рд░реЗрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рд╕рд╡рд╛рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛, рдФрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рд╕рдмрд╕реЗ рдЕрд▓реЛрдХрдкреНрд░рд┐рдп рд╣рдм рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ "geektimes рдкреНрд░рднрд╛рд╡" рдХреА рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╛рдардХреЛрдВ рдХреЛ рдирдИ рд░реЗрдЯрд┐рдВрдЧ рдкрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд▓реЗрдЦреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рдЪрдпрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред



рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рд░реА рд░рд╣рд╛ред

рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдБрдХрдбрд╝реЗ рдФрд░ рд░реЗрдЯрд┐рдВрдЧ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рдореБрдЭреЗ рдХреЛрдИ рдЕрдВрджрд░реВрдиреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрд╣реАрдВ рдЧрд▓рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рдХрд▓рд╛ред рд╣рдо рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдкрд╣рд▓реЗ рдЦрдВрдбреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣


рдкрд╛рд░реНрд╕рд░ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд▓реЗрдЦреЛрдВ рдХреА рд░реЗрдЯрд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рд╖рдпрдЧрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╢реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рдХрд┐ "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() 

Matplotlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ:



рдореИрдВрдиреЗ рдЖрд▓реЗрдЦ "geektimes" рдФрд░ "geektimes рдХреЗрд╡рд▓" рдХреЛ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд▓реЗрдЦ рдПрдХ рд╕рд╛рде рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "DIY" + "рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░" + "C ++")ред рдкрджрдирд╛рдо "рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓" рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рд╕рд╛рдЗрдЯ рдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд▓реЗрдЦреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдмреНрдж рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ рдЗрд╕ рдЧрд░реНрдореА рдХреЗ рд▓рд┐рдП geektimes рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рднреБрдЧрддрд╛рди рдХреЗ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЬреБрдбрд╝реЗ "geektimes effect" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ред рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ 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() 

рдкрд░рд┐рдгрд╛рдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд▓реЗрдЦреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдЕрдиреБрдкрд╛рдд рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд▓рдЧрднрдЧ 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 рдиреЗрддрд╛рдУрдВ рдореЗрдВ рд╣реИрдВред

рдПрдВрдЯрд┐рдЯреЛрдк Gtk рдФрд░ рдХреЛрдХреЛ рд▓реЗрддрд╛ рд╣реИред



рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд░рд╣рд╕реНрдп рдмрддрд╛рдКрдВрдЧрд╛, рд╢реАрд░реНрд╖ рд╣рдм рднреА рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИред

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


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рд░реЗрдЯрд┐рдВрдЧред рд╣рдм рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЗрд╕ 2019 рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣рдм рдкрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЗрдЦ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛


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


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


рд╡реНрдпрд╡рд╕рд╛рдп


рдЖрдИрдЯреА рдореЗрдВ рд╡рд┐рдзрд╛рди


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


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

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рдЕрдкрдорд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдХрдо рд╡рд┐рдЬрд╝рд┐рдЯ рдХрд┐рдП рдЧрдП рд╣рдм "gtk" рдХреА рд░реЗрдЯрд┐рдВрдЧ рджреВрдВрдЧрд╛ред рдЗрд╕рдореЗрдВ, рдПрдХ рд▓реЗрдЦ рдХреЛ рд╡рд░реНрд╖ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ" рд░реЗрдЯрд┐рдВрдЧ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реИред


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


рдХреЛрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ рдирд┐рдХрд▓реЗрдЧрд╛ред рд╕рднреА рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрдирдВрдж рдЖрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi467429/


All Articles