Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Aho Habr.

В ampahany teo aloha Ny fifamoivoizana an'i Habr dia nodinihina araka ny mari-pamantarana lehibe - ny isan'ny lahatsoratra, ny fomba fijeriny ary ny naoty. Na izany aza, mbola tsy nodinihina ny olan'ny lazan'ireo fizarana tranonkala. Nanjary nahaliana ny mijery an'io amin'ny antsipiriany bebe kokoa ary mahita ny toerana malaza sy tsy malaza indrindra. Farany, hojereko amin'ny antsipiriany bebe kokoa ny fiantraikan'ny geektimes, mifarana amin'ny fifantenana vaovao amin'ireo lahatsoratra tsara indrindra mifototra amin'ny filaharana vaovao.

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Ho an'ireo izay liana amin'ny zava-nitranga dia ambany ny tohiny.

Mamelà ahy hampahatsiahy anao indray fa ny antontan'isa sy ny naoty dia tsy ofisialy, tsy manana fampahalalana anatiny aho. Tsy azo antoka koa fa tsy nanao hadisoana tany ho any aho na tsy nahita zavatra. Na izany aza, heveriko fa nahaliana izany. Hanomboka amin'ny kaody aloha isika; ireo izay tsy liana amin'izany dia afaka mandingana ny fizarana voalohany.

Fanangonana angona

Ao amin'ny dikan-teny voalohany amin'ny parser, ny isan'ny fijery, ny fanehoan-kevitra ary ny naoty lahatsoratra ihany no nodinihina. Efa tsara izany, saingy tsy mamela anao hanao fanontaniana sarotra kokoa. Fotoana handinihana ireo fizarana lohahevitra amin'ny tranokala izany dia ahafahanao manao fikarohana mahaliana, ohatra, jereo ny fiovan'ny lazan'ny fizarana "C ++" nandritra ny taona maro.

Nohatsaraina ny mpizara lahatsoratra, izao dia mamerina ny hub misy ny lahatsoratra, ary koa ny anaram-bositra ny mpanoratra sy ny naoty (betsaka ny zavatra mahaliana azo atao eto, fa ho avy any aoriana). Ny angon-drakitra dia voatahiry ao anaty rakitra csv izay toa izao:

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

Hahazo lisitr'ireo ivon-tematika lehibe amin'ny tranokala izahay.

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)

Ny asa find_between sy ny kilasy Str dia misafidy tady eo anelanelan'ny marika roa, nampiasa azy ireo aho aloha. Voamarika amin'ny "*" ny foiben-tematika mba ho mora asongadina, ary azonao atao koa ny manaisotra ny tsipika mifanaraka amin'izany mba hahazoana fizarana amin'ny sokajy hafa.

Ny vokatra avy amin'ny asa get_hubs dia lisitra manaitra, izay tehirizinay ho rakibolana. Atolotro manokana ny lisitra manontolo mba hahafahanao manombana ny habeny.

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

Raha ampitahaina, ny fizarana geektimes dia toa maotina kokoa:

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

Ny habaka sisa tavela dia voatahiry toy izany koa. Ankehitriny dia mora ny manoratra asa iray izay mamerina ny valiny na an'ny geektimes ny lahatsoratra na amin'ny habaka mombamomba azy.

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

Nisy asa mitovy amin'izany natao ho an'ny fizarana hafa ("fampandrosoana", "administration", sns.).

fanodinana

Fotoana hanombohana ny famakafakana izao. Mametraka ny angona izahay ary manodina ny angona 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)

Ankehitriny dia afaka manangona ny angon-drakitra isan'andro isika ary mampiseho ny isan'ny famoahana ho an'ny foibe samihafa.

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

Asehoy ny isan'ny lahatsoratra navoaka mampiasa Matplotlib:

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Nozaraiko tao amin'ny tabilao ny lahatsoratra "geektimes" sy "geektimes only", satria Ny lahatsoratra dia mety ho an'ny fizarana roa miaraka (ohatra, "DIY" + "microcontrollers" + "C++"). Nampiasa ny anarana hoe “profile” aho mba hanasongadinana ireo lahatsoratra momba ny mombamomba ao amin'ilay tranokala, na dia mety tsy marina tanteraka aza ny teny anglisy momba izany.

Tao amin'ny ampahany teo aloha dia nanontany momba ny "vokatry ny geektimes" mifandraika amin'ny fiovan'ny fitsipiky ny fandoavam-bola ho an'ny lahatsoratra momba ny geektimes izahay manomboka amin'ity fahavaratra ity. Andao haseho mitokana ny lahatsoratra 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()

Mahaliana ny vokany. Manodidina ny 1:5 eo ho eo ny tahan'ny fijerena lahatsoratra momba ny geektimes amin'ny fitambarany. Saingy na dia niovaova be aza ny fitambaran'ny isan'ny mpijery, ny fijerena ireo lahatsoratra “fialam-boly” dia nitovy ihany.

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Azonao atao ihany koa ny manamarika fa ny totalin'ny fijerena lahatsoratra ao amin'ny fizarana "geektimes" dia mbola nihena taorian'ny fanovana ny fitsipika, fa "amin'ny maso", tsy mihoatra ny 5% amin'ny totalin'ny sanda.

Mahaliana ny mijery ny salan'isa isaky ny lahatsoratra:

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Ho an'ny lahatsoratra "fialam-boly" dia eo amin'ny 40% eo ho eo ambonin'ny salan'isa. Tsy mahagaga angamba izany. Ny tsy fahombiazana tamin'ny fiandohan'ny volana aprily dia tsy mazava amiko, mety ho izay no nitranga, na karazana fahadisoam-panantenana, na angamba iray amin'ireo mpanoratra geektimes nandeha vakansy ;).

Teny an-dalana, ny tabilao dia mampiseho tampon'isa roa miharihary kokoa amin'ny isan'ny fomba fijery lahatsoratra - ny Taom-baovao sy ny fetin'ny Mey.

Hubs

Andeha isika hiroso amin'ny famakafakana nampanantenaina momba ny hub. Andeha hotanisaintsika ireo hub 20 ambony amin'ny isan'ny fijery:

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

vokany:

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Mahagaga fa ny foibe malaza indrindra amin'ny lafiny fomba fijery dia ny "Security Information";

Antitop dia mitana ny Gtk sy Cocoa.

Habrastatistics: mikaroka ireo faritra be mpitsidika indrindra amin'ny tranokala

Hilaza aminao tsiambaratelo aho, ny hub ambony dia hita ihany koa eto, na dia tsy hita ao aza ny isan'ny mpijery.

Rating

Ary farany, ny nampanantenaina naoty. Amin'ny fampiasana angona famakafakana hub dia afaka mampiseho lahatsoratra malaza indrindra ho an'ny hub malaza indrindra amin'ity taona 2019 ity izahay.

Fiarovam-baovao

fandaharana

Siansa malaza

asany

Legislation in IT

Fampandrosoana tranonkala

GTK

Ary farany, mba tsy hisy ho tafintohina, dia homeko ny naotin'ny hub "gtk" kely indrindra notsidihina. Tao anatin'ny herintaona no navoaka одна ny lahatsoratra, izay "ho azy" ihany koa dia mitana ny andalana voalohany amin'ny naoty.

famaranana

Tsy hisy fehin-kevitra. Faly mamaky daholo.

Source: www.habr.com

Add a comment