ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ื”ื™ื™ ื”ื‘ืจ.

ะ’ ื”ื—ืœืง ื”ืงื•ื“ื ื”ืชืขื‘ื•ืจื” ืฉืœ ื”ื‘ืจ ื ื•ืชื—ื” ืœืคื™ ื”ืคืจืžื˜ืจื™ื ื”ืขื™ืงืจื™ื™ื - ืžืกืคืจ ื”ื›ืชื‘ื•ืช, ื”ืฆืคื™ื•ืช ื•ื”ื“ื™ืจื•ื’ื™ื ืฉืœื”ืŸ. ืขื ื–ืืช, ืกื•ื’ื™ื™ืช ื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ ืงื˜ืขื™ ื”ืืชืจ ื ื•ืชืจื” ื‘ืœืชื™ ื ื‘ื“ืงืช. ื”ื™ื” ืžืขื ื™ื™ืŸ ืœื”ืกืชื›ืœ ืขืœ ื–ื” ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื•ืœืžืฆื•ื ืืช ื”ืจื›ื–ื•ืช ื”ืคื•ืคื•ืœืจื™ื•ืช ื‘ื™ื•ืชืจ ื•ื”ืœื ืคื•ืคื•ืœืจื™ื•ืช ื‘ื™ื•ืชืจ. ืœื‘ืกื•ืฃ, ืืกืชื›ืœ ืขืœ ืืคืงื˜ ื”-Geektimes ื‘ื™ืชืจ ืคื™ืจื•ื˜, ื•ืืกื™ื™ื ื‘ืžื‘ื—ืจ ื—ื“ืฉ ืฉืœ ื”ืžืืžืจื™ื ื”ื˜ื•ื‘ื™ื ื‘ื™ื•ืชืจ ื”ืžื‘ื•ืกืกื™ื ืขืœ ื“ื™ืจื•ื’ื™ื ื—ื“ืฉื™ื.

ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ืœืžื™ ืฉืžืชืขื ื™ื™ืŸ ื‘ืžื” ืฉืงืจื”, ื”ื”ืžืฉืš ื‘ืงื˜ืข.

ื”ืจืฉื• ืœื™ ืœื”ื–ื›ื™ืจ ืœื›ื ืฉื•ื‘ ืฉื”ืกื˜ื˜ื™ืกื˜ื™ืงื” ื•ื”ื“ื™ืจื•ื’ื™ื ืื™ื ื ืจืฉืžื™ื™ื, ืื™ืŸ ืœื™ ืžื™ื“ืข ืคื ื™ืžื™. ื–ื” ื’ื ืœื ืžื•ื‘ื˜ื— ืฉืœื ืขืฉื™ืชื™ ื˜ืขื•ืช ืื™ืคืฉื”ื• ืื• ืคืกืคืกืชื™ ืžืฉื”ื•. ืื‘ืœ ื‘ื›ืœ ื–ืืช, ืื ื™ ื—ื•ืฉื‘ ืฉื–ื” ื™ืฆื ืžืขื ื™ื™ืŸ. ื ืชื—ื™ืœ ืงื•ื“ื ื‘ืงื•ื“, ืžื™ ืฉืœื ืžืขื•ื ื™ื™ืŸ ื‘ื›ืš ื™ื›ื•ืœ ืœื“ืœื’ ืขืœ ื”ืกืขื™ืคื™ื ื”ืจืืฉื•ื ื™ื.

ืื™ืกื•ืฃ ื ืชื•ื ื™ื

ื‘ื’ืจืกื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืžื ืชื— ื ืœืงื—ื• ื‘ื—ืฉื‘ื•ืŸ ืจืง ืžืกืคืจ ื”ืฆืคื™ื•ืช, ื”ื”ืขืจื•ืช ื•ื“ื™ืจื•ื’ื™ ื”ื›ืชื‘ื•ืช. ื–ื” ื›ื‘ืจ ื˜ื•ื‘, ืื‘ืœ ื–ื” ืœื ืžืืคืฉืจ ืœืš ืœื‘ืฆืข ืฉืื™ืœืชื•ืช ืžื•ืจื›ื‘ื•ืช ื™ื•ืชืจ. ื”ื’ื™ืข ื”ื–ืžืŸ ืœื ืชื— ืืช ื”ื—ืœืงื™ื ื”ื ื•ืฉืื™ื™ื ืฉืœ ื”ืืชืจ; ื–ื” ื™ืืคืฉืจ ืœืš ืœืขืจื•ืš ืžื—ืงืจ ืžืขื ื™ื™ืŸ ืœืžื“ื™, ืœืžืฉืœ, ืœืจืื•ืช ื›ื™ืฆื“ ื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ ืงื˜ืข "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'}

ื”ืจื›ื–ื•ืช ื”ื ื•ืชืจื•ืช ื ืฉืชืžืจื• ื‘ืื•ืชื• ืื•ืคืŸ. ืขื›ืฉื™ื• ืงืœ ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืฉืžื—ื–ื™ืจื” ืืช ื”ืชื•ืฆืื” ื‘ื™ืŸ ืื ื”ืžืืžืจ ืฉื™ื™ืš ืœ-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:

ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ื—ื™ืœืงืชื™ ืืช ื”ืžืืžืจื™ื "ื–ืžื ื™ ื—ื ื•ืŸ" ื•"ื–ืžื ื™ ื—ื ื•ืŸ ื‘ืœื‘ื“" ื‘ืชืจืฉื™ื, ื›ื™ ืžืืžืจ ื™ื›ื•ืœ ืœื”ืฉืชื™ื™ืš ืœืฉื ื™ ื”ืกืขื™ืคื™ื ื‘ื•-ื–ืžื ื™ืช (ืœื“ื•ื’ืžื”, "DIY" + "microcontrollers" + "C++"). ื”ืฉืชืžืฉืชื™ ื‘ื›ื™ื ื•ื™ "ืคืจื•ืคื™ืœ" ื›ื“ื™ ืœื”ื“ื’ื™ืฉ ืžืืžืจื™ ืคืจื•ืคื™ืœ ื‘ืืชืจ, ืื ื›ื™ ืื•ืœื™ ื”ืžื•ื ื— ื‘ืื ื’ืœื™ืช 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. ืื‘ืœ ื‘ืขื•ื“ ืฉืžืกืคืจ ื”ืฆืคื™ื•ืช ื”ื›ื•ืœืœ ื”ืฉืชื ื” ื‘ืฆื•ืจื” ื ื™ื›ืจืช, ื”ืฆืคื™ื™ื” ื‘ื›ืชื‘ื•ืช "ื‘ื™ื“ื•ืจ" ื ื•ืชืจื” ื‘ืขืจืš ื‘ืื•ืชื” ืจืžื”.

ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ืืชื” ื™ื›ื•ืœ ื’ื ืœืฉื™ื ืœื‘ ืฉืžืกืคืจ ื”ืฆืคื™ื•ืช ื”ื›ื•ืœืœ ืฉืœ ืžืืžืจื™ื ื‘ืกืขื™ืฃ "ื–ืžื ื™ื ืฉืœ ื—ื ื•ื ื™ื" ืขื“ื™ื™ืŸ ื™ืจื“ ืœืื—ืจ ืฉื™ื ื•ื™ ื”ื›ืœืœื™ื, ืืš "ืœืคื™ ื”ืขื™ืŸ", ืœืœื ื™ื•ืชืจ ืž-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()

ืชื•ืฆืื”:

ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ื‘ืื•ืคืŸ ืžืคืชื™ืข, ื”ืžืจื›ื– ื”ืคื•ืคื•ืœืจื™ ื‘ื™ื•ืชืจ ืžื‘ื—ื™ื ืช ืฆืคื™ื•ืช ื”ื™ื” "ืื‘ื˜ื—ืช ืžื™ื“ืข"; ื—ืžืฉืช ื”ืžื ื”ื™ื’ื™ื ื”ืžื•ื‘ื™ืœื™ื ื›ืœืœื• ื’ื "ืชื›ื ื•ืช" ื•"ืžื“ืข ืคื•ืคื•ืœืจื™".

Antitop ื›ื•ื‘ืฉ Gtk ื•ืงืงืื•.

ืกื˜ื˜ื™ืกื˜ื™ืงื”: ื—ืงื™ืจืช ื”ืงื˜ืขื™ื ื”ืžื‘ื•ืงืจื™ื ื‘ื™ื•ืชืจ ื‘ืืชืจ

ืื ื™ ืื’ืœื” ืœืš ืกื•ื“, ื ื™ืชืŸ ืœืจืื•ืช ื’ื ืืช ื”ืจื›ื–ื•ืช ื”ืขืœื™ื•ื ื•ืช ื›ืืŸ, ืœืžืจื•ืช ืฉืžืกืคืจ ื”ืฆืคื™ื•ืช ืœื ืžื•ืฆื’ ืฉื.

ื“ืจื•ื’

ื•ืœื‘ืกื•ืฃ, ื”ื“ื™ืจื•ื’ ื”ืžื•ื‘ื˜ื—. ื‘ืืžืฆืขื•ืช ื ืชื•ื ื™ ื ื™ืชื•ื— ืจื›ื–ื•ืช, ื ื•ื›ืœ ืœื”ืฆื™ื’ ืืช ื”ืžืืžืจื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ืขื‘ื•ืจ ื”ืจื›ื–ื•ืช ื”ืคื•ืคื•ืœืจื™ื•ืช ื‘ื™ื•ืชืจ ืœืฉื ื” ื–ื• 2019.

ืื‘ื˜ื—ืช ืžื™ื“ืข

ืชื›ื ื•ืช

ืžื“ืข ืคื•ืคื•ืœืจื™

ืงืจื™ื™ืจื”

ื—ืงื™ืงื” ื‘ืชื—ื•ื ื”-IT

ื‘ื ื™ื™ืช ืืชืจื™ื

GTK

ื•ืœื‘ืกื•ืฃ, ื›ื“ื™ ืฉืืฃ ืื—ื“ ืœื ื™ื™ืขืœื‘, ืื ื™ ืืชืŸ ืืช ื”ื“ื™ืจื•ื’ ืฉืœ ื”ืจื›ื–ืช ื”ื›ื™ ืคื—ื•ืช ื‘ื™ืงืจื” "gtk". ืชื•ืš ืฉื ื” ื”ื•ื ืคื•ืจืกื ะพะดะฝะฐ ื”ื›ืชื‘ื”, ืฉื’ื "ืื•ื˜ื•ืžื˜ื™ืช" ืชื•ืคืกืช ืืช ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ื“ื™ืจื•ื’.

ืžืกืงื ื”

ืœื ืชื”ื™ื” ืžืกืงื ื”. ืงืจื™ืื” ืžื”ื ื” ืœื›ื•ืœื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”