Habrastatistics: අඩවියේ වැඩිපුරම සහ අඩුවෙන් නරඹන කොටස් ගවේෂණය කිරීම

හේ හබ්ර්.

В පෙර කොටස හබ්ර්ගේ ගමනාගමනය ප්‍රධාන පරාමිතීන් අනුව විශ්ලේෂණය කරන ලදී - ලිපි ගණන, ඒවායේ අදහස් සහ ශ්‍රේණිගත කිරීම්. කෙසේ වෙතත්, අඩවි කොටස්වල ජනප්‍රියත්වය පිළිබඳ ගැටළුව විභාග නොවී පැවතුනි. මෙය වඩාත් විස්තරාත්මකව බැලීම සහ වඩාත් ජනප්‍රිය හා වඩාත්ම ජනප්‍රිය නොවන මධ්‍යස්ථාන සොයා ගැනීම සිත්ගන්නා කරුණක් විය. අවසාන වශයෙන්, මම නව ශ්‍රේණිගත කිරීම් මත පදනම් වූ හොඳම ලිපිවල නව තේරීමකින් අවසන් වන 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 only” යන ලිපි බෙදුවෙමි, මන්ද ලිපියක් එකවර කොටස් දෙකටම අයත් විය හැක (උදාහරණයක් ලෙස, "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% පමණ වේ. මෙය බොහෝ විට පුදුමයක් නොවේ. අප්‍රේල් මස මුලදී ඇති වූ අසාර්ථකත්වය මට අපැහැදිලි ය, සමහර විට එය සිදු වූයේ එය විය හැකිය, නැතහොත් එය යම් ආකාරයක විග්‍රහ කිරීමේ දෝෂයක් විය හැකිය, නැතහොත් සමහර විට ගීක්ටයිම් කතුවරුන්ගෙන් එක් අයෙකු නිවාඩුවක් ගත කර ඇත;).

මාර්ගය වන විට, ප්‍රස්ථාරය ලිපි බැලීම් ගණනේ තවත් කැපී පෙනෙන උච්ච දෙකක් පෙන්වයි - අලුත් අවුරුදු සහ මැයි නිවාඩු.

හබ්ස්

මධ්‍යස්ථාන පිළිබඳ පොරොන්දු වූ විශ්ලේෂණය වෙත යමු. බැලීම් ගණන අනුව ඉහළම කේන්ද්‍රස්ථාන 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 දෙනා අතරට “ක්‍රමලේඛනය” සහ “ජනප්‍රිය විද්‍යාව” ද ඇතුළත් විය.

Antitop Gtk සහ Cocoa අල්ලා ගනී.

Habrastatistics: අඩවියේ වැඩිපුරම සහ අඩුවෙන් නරඹන කොටස් ගවේෂණය කිරීම

මම ඔබට රහසක් කියන්නම්, ඉහළ කේන්ද්රස්ථාන ද දැකිය හැකිය මෙහි, නැරඹුම් ගණන එහි පෙන්වා නැතත්.

ශ්රේණිගත කිරීම

අවසාන වශයෙන්, පොරොන්දු වූ ශ්‍රේණිගත කිරීම. මධ්‍යස්ථාන විශ්ලේෂණ දත්ත භාවිතයෙන්, අපට මෙම 2019 වර්ෂය සඳහා වඩාත් ජනප්‍රිය මධ්‍යස්ථාන සඳහා වඩාත් ජනප්‍රිය ලිපි ප්‍රදර්ශනය කළ හැක.

තොරතුරු ආරක්ෂාව

වැඩසටහන්කරණය

ජනප්රිය විද්යාව

වෘත්තිය

තොරතුරු තාක්ෂණයේ නීති

වෙබ් දියුණු කිරීම

gtk

අවසාන වශයෙන්, කිසිවෙකු අමනාප නොවන පරිදි, මම අවම වශයෙන් සංචාරය කරන ලද කේන්ද්‍රස්ථානය වන “gtk” ශ්‍රේණිගත කිරීම ලබා දෙමි. අවුරුද්දක් ඇතුළත එය ප්රකාශයට පත් විය එකක් "ස්වයංක්‍රීයව" යන ලිපිය ශ්‍රේණිගත කිරීමේ පළමු පේළිය දරයි.

නිගමනය

නිගමනයකට එළඹෙන්නේ නැත. හැමෝම සතුටින් කියෙව්වා.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න