Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Hey Habr.

В chuid roimhe Rinneadh anailís ar thrácht Habr de réir na bpríomhpharaiméadair - líon na n-alt, a dtuairimí agus a rátálacha. Mar sin féin, níor scrúdaíodh an cheist maidir le tóir na n-alt láithreáin. Bhí sé suimiúil breathnú ar seo níos mine agus teacht ar na moil is mó tóir agus is mó tóir. Ar deireadh, breathnóidh mé ar an éifeacht geektimes níos mine, ag críochnú le rogha nua de na hailt is fearr atá bunaithe ar rátálacha nua.

Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Dóibh siúd a bhfuil suim acu sa mhéid a tharla, tá an leanúint faoin gearrtha.

Cuir i gcuimhne duit arís eile nach bhfuil na staitisticí agus na rátálacha oifigiúla, nach bhfuil aon fhaisnéis chos istigh agam. Níl sé ráthaíocht freisin nach ndearna mé botún áit éigin nó gur chaill mé rud éigin. Ach fós, is dóigh liom go raibh sé suimiúil. Tosóimid leis an gcód ar dtús; is féidir leo siúd nach bhfuil suim acu ann dul thar na chéad ranna.

Bailiú sonraí

Sa chéad leagan den pharsálaí, níor cuireadh ach líon na dtuairimí, na dtuairimí agus na rátálacha alt san áireamh. Tá sé seo go maith cheana féin, ach ní cheadaíonn sé duit fiosrúcháin níos casta a dhéanamh. Tá sé in am anailís a dhéanamh ar ranna téamacha an tsuímh; ligfidh sé seo duit taighde an-suimiúil a dhéanamh, mar shampla, féachaint conas a d’athraigh an tóir a bhí ar an rannán “C++” le roinnt blianta anuas.

Tá parsálaí an ailt feabhsaithe, anois filleann sé na moil lena mbaineann an t-alt, chomh maith le leasainm an údair agus a rátáil (is féidir go leor rudaí suimiúla a dhéanamh anseo freisin, ach tiocfaidh sin níos déanaí). Sábháiltear na sonraí i gcomhad csv a bhfuil cuma mar seo air:

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

Gheobhaidh muid liosta de phríomh-mhoil théamacha an tsuímh.

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)

Roghnaíonn an fheidhm find_between agus an rang Str teaghrán idir dhá chlib, d’úsáid mé iad níos luaithe. Tá moil théamacha marcáilte le "*" ionas gur féidir iad a aibhsiú go héasca, agus is féidir leat trácht a dhéanamh ar na línte comhfhreagracha freisin chun rannóga de chatagóirí eile a fháil.

Is liosta sách suntasach é aschur na feidhme get_hubs, a shábháilimid mar fhoclóir. Táim ag cur an liosta ina iomláine i láthair go sonrach ionas gur féidir leat a thoirt a mheas.

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

Chun comparáid a dhéanamh, tá cuma níos measartha ar na hailt 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'}

Caomhnaíodh na moil a bhí fágtha ar an mbealach céanna. Anois tá sé éasca feidhm a scríobh a thugann an toradh ar ais cibé an mbaineann an t-alt le geektimes nó le mol próifíle.

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

Rinneadh feidhmeanna comhchosúla do rannóga eile (“forbairt”, “riarachán”, etc.).

Próiseáil

Tá sé in am tús a chur le hanailís a dhéanamh. Déanaimid an tacar sonraí a lódáil agus sonraí an mhoil a phróiseáil.

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)

Anois is féidir linn na sonraí a ghrúpáil de réir an lae agus líon na bhfoilseachán a thaispeáint do na moil éagsúla.

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

Taispeánaimid líon na n-alt foilsithe ag baint úsáide as Matplotlib:

Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Roinn mé na hailt “geektimes” agus “geektimes amháin” sa chairt, mar gheall ar Is féidir le halt a bheith sa dá chuid ag an am céanna (mar shampla, “DIY” + “microcontrollers” + “C++”). Bhain mé úsáid as an sonrúchán “próifíl” chun aird a tharraingt ar ailt phróifíle ar an suíomh, cé go mb’fhéidir nach bhfuil an téarma Béarla profile dó seo iomlán ceart.

Sa chuid roimhe seo chuireamar ceist faoin “éifeacht geektimes” a bhaineann leis an athrú ar na rialacha íocaíochta d'earraí geektimes ag tosú an samhradh seo. Taispeánaimis na hailt geektimes ar leithligh:

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

Tá an toradh suimiúil. Is é 1:5 an cóimheas tuairime ar ailt geektime leis an iomlán. Ach cé gur tháinig athrú suntasach ar líon iomlán na dtuairimí, d’fhan breathnú ar ailt “siamsaíochta” thart ar an leibhéal céanna.

Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Is féidir leat a thabhairt faoi deara freisin gur tháinig laghdú ar líon iomlán na n-amharc ar ailt sa rannán “geektimes” fós tar éis na rialacha a athrú, ach “go súl”, gan níos mó ná 5% de na luachanna iomlána.

Tá sé suimiúil breathnú ar an meánlíon tuairimí in aghaidh an ailt:

Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Maidir le hailt “siamsaíochta” tá sé thart ar 40% os cionn an mheáin. Is dócha nach ábhar iontais é seo. Níl an teip ag tús mhí Aibreáin soiléir dom, b’fhéidir gurb é sin a tharla, nó gur earráid parsála de shaghas éigin atá ann, nó b’fhéidir go ndeachaigh duine de na húdair geektimes ar saoire ;).

Dála an scéil, léiríonn an graf dhá bhuaic níos suntasaí i líon na dtuairimí ar earraí - an Bhliain Nua agus laethanta saoire na Bealtaine.

Moil

Gabhaimis ar aghaidh go dtí an anailís atá geallta ar na moil. Déanaimis liosta de na 20 mol is fearr de réir líon na n-amharc:

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: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Ar ionadh, ba é “Slándáil Faisnéise” an mol ba mhó éileamh ó thaobh tuairimí de; chuimsigh na 5 cheannaire ba mhó freisin “Clárú” agus “Eolaíocht Choitianta”.

Áitíonn Antitop Gtk agus cócó.

Habrastatistics: iniúchadh a dhéanamh ar na codanna den láithreán is mó agus is lú a dtugtar cuairt orthu

Inseoidh mé rún duit, is féidir na moil barr a fheiceáil freisin anseo, cé nach léirítear líon na radharc ann.

Rátáil

Agus ar deireadh, an rátáil geallta. Agus sonraí anailíse moil á n-úsáid againn, is féidir linn na hailt is mó tóir a thaispeáint do na moil is mó tóir don bhliain 2019 seo.

Slándáil Faisnéise

Clárú

Eolaíocht Choitianta

gairme

Reachtaíocht in IT

Forbairt gréasáin

GTK

Agus ar deireadh, ionas nach mbeidh aon duine ciontach, tabharfaidh mé rátáil an mhoil is lú cuairt “gtk”. Laistigh de bhliain foilsíodh é ceann Tá an chéad líne den rátáil ag an alt, atá “go huathoibríoch” freisin.

Conclúid

Ní bheidh aon chonclúid ann. Léitheoireacht shona daoibh go léir.

Foinse: will.com

Add a comment