ሃብራስታቲስቲክስ፡ ብዙ እና ብዙም ያልተጎበኙ የገጹን ክፍሎች ማሰስ

ሃይ ሀብር።

В ያለፈው ክፍል የሀብር ትራፊክ እንደ ዋና መለኪያዎች - የጽሁፎች ብዛት ፣ አመለካከታቸው እና ደረጃ አሰጣጡ ተተነተነ። ይሁን እንጂ የጣቢያው ክፍሎች ተወዳጅነት ጉዳይ ሳይመረመር ቀርቷል. ይህንን በበለጠ ዝርዝር መመልከቱ እና በጣም ተወዳጅ እና በጣም ተወዳጅ ያልሆኑትን ማዕከሎች ማግኘት አስደሳች ሆነ። በመጨረሻ፣ የጊክታይምስ ተፅእኖን በበለጠ ዝርዝር እመለከታለሁ፣ በአዲስ የደረጃ አሰጣጦች ላይ በመመስረት በአዲስ ምርጥ መጣጥፎች ምርጫ እጨርሳለሁ።

ሃብራስታቲስቲክስ፡ ብዙ እና ብዙም ያልተጎበኙ የገጹን ክፍሎች ማሰስ

ለተፈጠረው ነገር ፍላጎት ላላቸው ሰዎች, ቀጣይነቱ በቆራጩ ስር ነው.

ስታስቲክስ እና ደረጃ አሰጣጡ ይፋ እንዳልሆኑ በድጋሚ ላስታውስህ ምንም አይነት የውስጥ አዋቂ መረጃ የለኝም። እንዲሁም የሆነ ቦታ ላይ ስህተት እንዳልሰራሁ ወይም የሆነ ነገር ስላጣሁ ዋስትና የለኝም። ግን አሁንም ፣ አስደሳች ሆኖ ተገኝቷል ብዬ አስባለሁ። በመጀመሪያ በኮዱ እንጀምራለን, ለዚህ ፍላጎት የሌላቸው የመጀመሪያዎቹን ክፍሎች መዝለል ይችላሉ.

የውሂብ መሰብሰብ

በተንታኙ የመጀመሪያ ስሪት ውስጥ የእይታዎች ፣ የአስተያየቶች እና የጽሑፍ ደረጃዎች ብዛት ብቻ ግምት ውስጥ ገብቷል። ይህ ቀድሞውኑ ጥሩ ነው, ነገር ግን የበለጠ ውስብስብ ጥያቄዎችን እንዲያደርጉ አይፈቅድልዎትም. የገጹን ጭብጥ ክፍሎች ለመተንተን ጊዜው አሁን ነው ፣ ይህ በጣም አስደሳች ምርምር እንዲያደርጉ ይፈቅድልዎታል ፣ ለምሳሌ ፣ “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)

በተግባሩ እና በ 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'}

የተቀሩት ማዕከሎች በተመሳሳይ መንገድ ተጠብቀዋል. አሁን ጽሑፉ የጂኪታይም ይሁን የመገለጫ ማዕከል ከሆነ ውጤቱን የሚመልስ ተግባር መፃፍ ቀላል ነው።

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

ለሌሎች ክፍሎች ("ልማት", "አስተዳደር", ወዘተ) ተመሳሳይ ተግባራት ተሠርተዋል.

በመስራት ላይ

መተንተን ለመጀመር ጊዜው አሁን ነው። የውሂብ ስብስብን እንጭነዋለን እና የ hub ውሂብን እናስኬዳለን።

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++”)። በጣቢያው ላይ የመገለጫ መጣጥፎችን ለማድመቅ “መገለጫ” የሚለውን ስያሜ ተጠቀምኩ፣ ምንም እንኳን ምናልባት የዚህ የእንግሊዝኛ ቃል ፕሮፋይል ሙሉ በሙሉ ትክክል ላይሆን ይችላል።

ባለፈው ክፍል በዚህ የበጋ ወቅት ለሚጀምሩ ጽሁፎች የክፍያ ደንቦች ለውጥ ጋር የተያያዘውን "የጊክታይምስ ተጽእኖ" ጠይቀን ነበር. የጊክ ታይምስ ጽሑፎችን ለየብቻ እናሳይ፡-

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% ገደማ ነው. ይህ ምናልባት አያስገርምም. በኤፕሪል መጀመሪያ ላይ ያለው ውድቀት ለእኔ ግልፅ አይደለም ፣ ምናልባት የሆነው ያ ነው ፣ ወይም የሆነ የመተንተን ስህተት ነው ፣ ወይም ምናልባት ከጊኪታይምስ ደራሲዎች አንዱ ለእረፍት ሄዶ ሊሆን ይችላል ;)

በነገራችን ላይ ግራፉ በአንቀጾች እይታዎች ብዛት ውስጥ ሁለት ተጨማሪ ጉልህ ጫፎችን ያሳያል - የአዲስ ዓመት እና የግንቦት በዓላት።

ማዕከላት

ወደ ተስፋው የማዕከሎች ትንተና እንሂድ። ምርጥ 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 እና Cocoa ን ይይዛል።

ሃብራስታቲስቲክስ፡ ብዙ እና ብዙም ያልተጎበኙ የገጹን ክፍሎች ማሰስ

አንድ ሚስጥር እነግርዎታለሁ, ከፍተኛዎቹ ማዕከሎችም ሊታዩ ይችላሉ እዚህምንም እንኳን የእይታዎች ብዛት እዚያ ባይታይም።

ደረጃ አሰጣጥ

እና በመጨረሻም, ቃል የተገባው ደረጃ. የ hub ትንታኔ መረጃን በመጠቀም በዚህ አመት 2019 በጣም ተወዳጅ ለሆኑት ማዕከሎች በጣም ታዋቂ የሆኑትን ጽሑፎች ማሳየት እንችላለን።

የመረጃ ደህንነት

ፕሮግራሚንግ

ታዋቂ ሳይንስ

ሼል

በ IT ውስጥ ህግ

የድር ልማት

ጂቲኬ

እና በመጨረሻም ማንም ሰው እንዳይናደድ፣ በትንሹ የተጎበኘውን “gtk” ደረጃን እሰጣለሁ። በአንድ ዓመት ውስጥ ታትሟል одна የደረጃ አሰጣጡን የመጀመሪያ መስመር “በራስ-ሰር” የሚይዘው ጽሑፉ።

መደምደሚያ

ምንም መደምደሚያ አይኖርም. መልካም ንባብ ለሁሉም።

ምንጭ: hab.com

አስተያየት ያክሉ