Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Hi Habr.

В pàirt roimhe Chaidh trafaic Habr a sgrùdadh a rèir nam prìomh chrìochan - an àireamh de artaigilean, am beachdan agus na rangachadh. Ach, bha a 'cheist mu cho mòr' sa tha na h-earrannan làraich fhathast gun sgrùdadh. Dh’ fhàs e inntinneach coimhead air seo ann am barrachd mionaideachd agus na mòr-ionadan as mòr-chòrdte agus as neo-chòrdte a lorg. Mu dheireadh, bheir mi sùil nas mionaidiche air buaidh geektimes, a’ crìochnachadh le taghadh ùr de na h-artaigilean as fheàrr stèidhichte air rangachadh ùra.

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Dhaibhsan aig a bheil ùidh anns na thachair, tha an leantainn fon ghearradh.

Leig leam do chuimhneachadh a-rithist nach eil na staitistigean agus na rangachadh oifigeil, chan eil fiosrachadh taobh a-staigh agam. Chan eilear cinnteach cuideachd nach do rinn mi mearachd an àiteigin no gun do chaill mi rudeigin. Ach fhathast, tha mi a 'smaoineachadh gu robh e inntinneach. Tòisichidh sinn leis a’ chòd an toiseach; faodaidh an fheadhainn aig nach eil ùidh ann an seo na ciad earrannan a leum.

Cruinneachadh dàta

Anns a 'chiad dreach den parser, cha deach ach an àireamh de bheachdan, beachdan agus rangachadh artaigil a thoirt fa-near. Tha seo mar-thà math, ach chan eil e a 'leigeil leat ceistean nas iom-fhillte a dhèanamh. Tha an t-àm ann sgrùdadh a dhèanamh air earrannan cuspaireil na làraich; leigidh seo leat rannsachadh gu math inntinneach a dhèanamh, mar eisimpleir, faicinn mar a tha fèill na h-earrainn “C ++” air atharrachadh thar grunn bhliadhnaichean.

Chaidh parser an artaigil a leasachadh, a-nis tha e a’ tilleadh na mòr-ionadan dham buin an artaigil, a bharrachd air far-ainm an ùghdair agus an rangachadh aige (faodar tòrr rudan inntinneach a dhèanamh an seo cuideachd, ach thig sin nas fhaide air adhart). Tha an dàta air a shàbhaladh ann am faidhle csv a tha a’ coimhead rudeigin mar seo:

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
...

Gheibh sinn liosta de phrìomh ionadan cuspaireil na làraich.

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)

Bidh an gnìomh find_between agus an clas Str a’ taghadh sreang eadar dà thaga, chleachd mi iad na bu thràithe. Tha mòr-ionadan cuspaireil air an comharrachadh le "*" gus an tèid an comharrachadh gu furasta, agus faodaidh tu cuideachd na loidhnichean co-fhreagarrach a thoirt seachad gus earrannan de roinnean eile fhaighinn.

Tha toradh na gnìomh get_hubs na liosta gu math drùidhteach, a shàbhaileas sinn mar fhaclair. Tha mi gu sònraichte a’ taisbeanadh an liosta gu h-iomlan gus an urrainn dhut tuairmse a dhèanamh air an tomhas-lìonaidh aige.

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'}

Airson coimeas a dhèanamh, tha na h-earrannan geektimes a’ coimhead nas lugha:

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'}

Chaidh na h-ionadan a bha air fhàgail a ghleidheadh ​​​​san aon dòigh. A-nis tha e furasta gnìomh a sgrìobhadh a thilleas an toradh ge bith an ann le amannan geek no mòr-ionad ìomhaigh a tha an artaigil.

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

Chaidh gnìomhan co-chosmhail a dhèanamh airson earrannan eile (“leasachadh”, “rianachd”, msaa).

Pròiseas

Tha an t-àm ann tòiseachadh air mion-sgrùdadh. Bidh sinn a’ luchdachadh an dàta agus a’ pròiseasadh dàta an ionaid.

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)

A-nis is urrainn dhuinn an dàta a chuir còmhla gach latha agus an àireamh de fhoillseachaidhean airson diofar ionadan a thaisbeanadh.

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()

Bidh sinn a’ taisbeanadh an àireamh de artaigilean foillsichte a’ cleachdadh Matplotlib:

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Roinn mi na h-artaigilean “geektimes” agus “geektimes a-mhàin” sa chairt, oir Faodaidh artaigil buntainn ris an dà roinn aig an aon àm (mar eisimpleir, “DIY” + “microcontrollers” + “C ++”). Chleachd mi an sònrachadh “profile” gus artaigilean ìomhaigh air an làrach a shoilleireachadh, ged is dòcha nach eil am facal Beurla profile airson seo gu tur ceart.

Anns a ’phàirt roimhe seo dh’ fhaighnich sinn mun “buaidh amannan geek” co-cheangailte ris an atharrachadh anns na riaghailtean pàighidh airson artaigilean airson amannan geek a ’tòiseachadh as t-samhradh. Nach seall sinn na h-artaigilean geektimes air leth:

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()

Tha an toradh inntinneach. Tha an co-mheas tuairmseach de bheachdan air artaigilean amannan geek gu h-iomlan an àiteigin timcheall air 1: 5. Ach ged a bha an àireamh iomlan de bheachdan ag atharrachadh gu mòr, bha coimhead air artaigilean “cur-seachad” fhathast aig timcheall air an aon ìre.

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Faodaidh tu cuideachd mothachadh gun do thuit an àireamh iomlan de bheachdan artaigilean anns an roinn “geektimes” fhathast às deidh na riaghailtean atharrachadh, ach “le sùil”, gun a bhith nas motha na 5% de na luachan iomlan.

Tha e inntinneach coimhead air an àireamh chuibheasach de bheachdan gach artaigil:

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Airson artaigilean “fèisteas” tha e mu 40% os cionn na cuibheasachd. Is dòcha nach eil seo na iongnadh. Chan eil am fàiligeadh aig toiseach a’ Ghiblein soilleir dhomh, is dòcha gur e sin a thachair, no gur e mearachd parsaidh air choireigin a th’ ann, no is dòcha gun deach fear de na h-ùghdaran geektimes air saor-làithean ;).

Air an t-slighe, tha an graf a 'sealltainn dà stùc nas nochdte anns an àireamh de bheachdan artaigil - saor-làithean na Bliadhn' Ùire agus a 'Chèitein.

Mòr-ionadan

Gluaisidh sinn air adhart chun mhion-sgrùdadh a chaidh a ghealltainn air mòr-ionadan. Dèanamaid liosta de na prìomh ionadan 20 a rèir àireamh de bheachdan:

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()

Toradh:

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Gu h-iongantach, b’ e “Tèarainteachd Fiosrachaidh” am meadhan as mòr-chòrdte a thaobh bheachdan; bha na prìomh stiùirichean 5 cuideachd a’ toirt a-steach “Prògramadh” agus “Saidheans mòr-chòrdte”.

Tha Antitop ann an Gtk agus Cocoa.

Habrastatistics: a’ sgrùdadh nan earrannan as motha agus as lugha air an deach tadhal air an làrach

Innsidh mi dìomhaireachd dhut, chithear na prìomh ionadan cuideachd an seo, ged nach eil an àireamh de bheachdan air a shealltainn an sin.

Rangachadh

Agus mu dheireadh, an ìre a chaidh a ghealltainn. A’ cleachdadh dàta mion-sgrùdadh mòr-ionad, is urrainn dhuinn na h-artaigilean as mòr-chòrdte a thaisbeanadh airson na mòr-ionadan as mòr-chòrdte airson na bliadhna seo 2019.

Tèarainteachd fiosrachaidh

Prògraman

Saidheans mòr-chòrdte

Dreuchd

Reachdas ann an IT

Leasachadh lìn

GTK

Agus mu dheireadh, gus nach bi duine ciontach, bheir mi seachad an ìre as lugha de thadhal air "gtk". Taobh a-staigh bliadhna chaidh fhoillseachadh одна Tha an artaigil, a tha cuideachd “gu fèin-ghluasadach” anns a’ chiad loidhne den rangachadh.

co-dhùnadh

Cha bhi co-dhùnadh ann. Deagh leughadh a h-uile duine.

Source: www.habr.com

Cuir beachd ann