Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻ°ā§‡ āĻšāĻžāĻŦāĻ°āĨ¤

В āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ…āĻ‚āĻļ Habr āĻāĻ° āĻŸā§āĻ°āĻžāĻĢāĻŋāĻ• āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ - āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž, āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ¤āĻžāĻŽāĻ¤ āĻāĻŦāĻ‚ āĻ°ā§‡āĻŸāĻŋāĻ‚āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧāĻ¤āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋāĨ¤ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ…āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻšāĻžāĻŦāĻ—ā§āĻ˛āĻŋ āĻ–ā§āĻāĻœā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻšāĻ¯āĻŧā§‡ āĻ‰āĻ ā§‡āĻ›ā§‡ā§ˇ āĻ¸āĻŦāĻļā§‡āĻˇā§‡, āĻ†āĻŽāĻŋ geektimes āĻĒā§āĻ°āĻ­āĻžāĻŦāĻ•ā§‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻĻā§‡āĻ–āĻŦ, āĻ¨āĻ¤ā§āĻ¨ āĻ°â€Œā§āĻ¯āĻžāĻ™ā§āĻ•āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ¸ā§‡āĻ°āĻž āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻļā§‡āĻˇ āĻšāĻŦā§‡āĨ¤

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 āĻĢāĻžāĻ‚āĻļāĻ¨ āĻāĻŦāĻ‚ 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 āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļāĻŋāĻ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻŋ:

Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻŽāĻŋ āĻšāĻžāĻ°ā§āĻŸā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ "geektimes" āĻāĻŦāĻ‚ "āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° geektimes" āĻ­āĻžāĻ— āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ•āĻžāĻ°āĻŖ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻāĻ•āĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ‰āĻ­āĻ¯āĻŧ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ—āĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, "DIY" + "āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛āĻžāĻ°" + "C++")āĨ¤ āĻ¸āĻžāĻ‡āĻŸā§‡ āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ‡āĻ˛āĻžāĻ‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻŋ "āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛" āĻ‰āĻĒāĻžāĻ§āĻŋāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ¯āĻĻāĻŋāĻ“ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻ‚āĻ°ā§‡āĻœāĻŋ āĻļāĻŦā§āĻĻ āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸āĻ āĻŋāĻ• āĻ¨āĻ¯āĻŧāĨ¤

āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ…āĻ‚āĻļā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ—ā§āĻ°ā§€āĻˇā§āĻŽā§‡ āĻļā§āĻ°ā§ āĻšāĻ“āĻ¯āĻŧāĻž 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 āĻāĻ° āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŽā§‹āĻŸ āĻ­āĻŋāĻ‰āĻ¯āĻŧā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ“āĻ āĻžāĻ¨āĻžāĻŽāĻž āĻ•āĻ°āĻ˛ā§‡āĻ“, "āĻŦāĻŋāĻ¨ā§‹āĻĻāĻ¨" āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻāĻ•āĻ‡ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ›āĻŋāĻ˛āĨ¤

Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻ°āĻ“ āĻ˛āĻ•ā§āĻˇā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯ā§‡ "āĻ—ā§€āĻ•āĻŸāĻžāĻ‡āĻŽāĻ¸" āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ° āĻŽā§‹āĻŸ āĻĻāĻ°ā§āĻļāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻāĻ–āĻ¨āĻ“ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡āĻ“ āĻšā§āĻ°āĻžāĻ¸ āĻĒā§‡āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻŦā§‡ "āĻšā§‹āĻ–ā§‡āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž", āĻŽā§‹āĻŸ āĻŽāĻžāĻ¨ā§‡āĻ° 5% āĻāĻ° āĻŦā§‡āĻļāĻŋ āĻ¨āĻ¯āĻŧāĨ¤

āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ—āĻĄāĻŧ āĻ­āĻŋāĻ‰ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¤āĻžāĻ•āĻžāĻ¨ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ:

Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

"āĻŦāĻŋāĻ¨ā§‹āĻĻāĻ¨" āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻ—āĻĄāĻŧā§‡ āĻĒā§āĻ°āĻžāĻ¯āĻŧ 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()

āĻĢāĻ˛āĻžāĻĢāĻ˛:

Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻļā§āĻšāĻ°ā§āĻ¯āĻœāĻ¨āĻ•āĻ­āĻžāĻŦā§‡, āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ­āĻ™ā§āĻ—āĻŋāĻ° āĻĻāĻŋāĻ• āĻĨā§‡āĻ•ā§‡ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻšāĻžāĻŦ āĻ›āĻŋāĻ˛ "āĻ¤āĻĨā§āĻ¯ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž"; āĻļā§€āĻ°ā§āĻˇ 5 āĻ¨ā§‡āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ "āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚" āĻāĻŦāĻ‚ "āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻŦāĻŋāĻœā§āĻžāĻžāĻ¨" āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ›āĻŋāĻ˛āĨ¤

āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻŸāĻĒ āĻœāĻŋāĻŸāĻŋāĻ•ā§‡ āĻāĻŦāĻ‚ āĻ•ā§‹āĻ•ā§‹ āĻĻāĻ–āĻ˛ āĻ•āĻ°ā§‡āĨ¤

Habrastatistics: āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ—ā§‹āĻĒāĻ¨ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦ, āĻ‰āĻĒāĻ°ā§‡āĻ° āĻšāĻžāĻŦāĻ—ā§āĻ˛āĻŋāĻ“ āĻĻā§‡āĻ–āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻ–āĻžāĻ¨ā§‡, āĻ¯āĻĻāĻŋāĻ“ āĻ­āĻŋāĻ‰ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ āĻ¨āĻž.

āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ

āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤ āĻ°ā§‡āĻŸāĻŋāĻ‚āĨ¤ āĻšāĻžāĻŦ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡āĻ° āĻĄā§‡āĻŸāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻŦāĻ›āĻ°ā§‡āĻ° 2019 āĻ¸āĻžāĻ˛ā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻšāĻžāĻŦā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

āĻ¤āĻĨā§āĻ¯ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻž

āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚

āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻŦāĻŋāĻœā§āĻžāĻžāĻ¨

āĻĒā§‡āĻļāĻž

āĻ†āĻ‡āĻŸāĻŋ āĻ†āĻ‡āĻ¨

āĻ“āĻ¯āĻŧā§‡āĻŦ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ

āĻĻā§āĻŦāĻžāĻ°āĻž GTK

āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻ¯āĻžāĻ¤ā§‡ āĻ•ā§‡āĻ‰ āĻŦāĻŋāĻ°āĻ•ā§āĻ¤ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ†āĻŽāĻŋ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻž āĻšāĻžāĻŦ "gtk" āĻāĻ° āĻ°ā§‡āĻŸāĻŋāĻ‚ āĻĻā§‡āĻŦāĨ¤ āĻāĻ• āĻŦāĻ›āĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻžāĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻāĻ• āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§, āĻ¯āĻž "āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡" āĻ°ā§‡āĻŸāĻŋāĻ‚ āĻāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ˛āĻžāĻ‡āĻ¨ āĻĻāĻ–āĻ˛ āĻ•āĻ°ā§‡āĨ¤

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ•ā§‹āĻ¨ āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ° āĻšāĻŦā§‡ āĻ¨āĻž. āĻ¸āĻŦāĻžāĻ‡ āĻĒāĻĄāĻŧā§‡ āĻ–ā§āĻļāĻŋāĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨