Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Uy Habr.

Π’ miaging bahin Ang trapiko sa Habr gisusi sumala sa mga nag-unang mga parameter - ang gidaghanon sa mga artikulo, ang ilang mga panan-aw ug mga rating. Bisan pa, ang isyu sa pagkapopular sa mga seksyon sa site nagpabilin nga wala masusi. Nahimong makapaikag ang pagtan-aw niini sa mas detalyado ug pagpangita sa labing inila ug labing dili sikat nga mga hub. Sa katapusan, akong tan-awon ang epekto sa geektimes sa mas detalyado, nga nagtapos sa usa ka bag-ong pagpili sa labing kaayo nga mga artikulo base sa bag-ong ranggo.

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Alang sa mga interesado sa nahitabo, ang pagpadayon ubos sa pagputol.

Pahinumdumon ko ikaw sa makausa pa nga ang mga estadistika ug mga rating dili opisyal, wala ako'y bisan unsang kasayuran sa insider. Dili usab garantiya nga wala ako masayop sa usa ka lugar o nasipyat sa usa ka butang. Apan sa gihapon, sa akong hunahuna kini nahimong makapaikag. Magsugod kita sa code una; kadtong dili interesado niini mahimong laktawan ang unang mga seksyon.

Pagkolekta sa datos

Sa una nga bersyon sa parser, ang gidaghanon lamang sa mga pagtan-aw, mga komento ug mga rating sa artikulo ang gikonsiderar. Maayo na kini, apan wala kini magtugot kanimo sa paghimo og mas komplikado nga mga pangutana. Panahon na aron analisahon ang mga tematik nga seksyon sa site; kini magtugot kanimo sa paghimo og makapaikag nga panukiduki, pananglitan, tan-awa kung giunsa ang pagkapopular sa seksyon nga "C++" nausab sa daghang mga tuig.

Ang parser sa artikulo gipauswag, karon gibalik niini ang mga hub diin nahisakop ang artikulo, ingon man ang angga sa tagsulat ug ang iyang rating (daghang makapaikag nga mga butang ang mahimo dinhi, usab, apan kana moabut sa ulahi). Ang datos gitipigan sa usa ka csv file nga ingon niini:

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

Makadawat kami usa ka lista sa mga nag-unang thematic hub sa site.

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)

Ang function nga find_between ug ang klase sa Str nagpili usa ka pisi taliwala sa duha nga mga tag, gigamit nako kini sa sayo pa. Ang mga tematik nga hub gimarkahan sa usa ka "*" aron kini dali nga ma-highlight, ug mahimo usab nimo i-uncomment ang mga katumbas nga linya aron makakuha mga seksyon sa ubang mga kategorya.

Ang output sa get_hubs function kay usa ka impresibong listahan, nga among gitipigan isip diksyonaryo. Espesyal nga gipresentar nako ang lista sa kinatibuk-an aron imong mabanabana ang gidaghanon niini.

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

Alang sa pagtandi, ang mga seksyon sa geektimes tan-awon nga labi ka kasarangan:

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

Ang nahabilin nga mga hub gipreserbar sa parehas nga paagi. Karon dali na magsulat usa ka function nga nagbalik sa resulta kung ang artikulo iya sa geektimes o usa ka hub sa profile.

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

Ang susamang mga gimbuhaton gihimo alang sa ubang mga seksyon ("kauswagan", "administrasyon", ug uban pa).

Pagproseso

Panahon na nga magsugod sa pag-analisar. Gikarga namo ang dataset ug giproseso ang data sa 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)

Karon mahimo na namon nga igrupo ang datos sa adlaw ug ipakita ang gidaghanon sa mga publikasyon alang sa lainlaing mga hub.

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

Gipakita namo ang gidaghanon sa gipatik nga mga artikulo gamit ang Matplotlib:

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Gibahin nako ang mga artikulo nga "geektimes" ug "geektimes only" sa tsart, tungod kay Ang usa ka artikulo mahimong sakop sa duha ka seksyon sa samang higayon (pananglitan, "DIY" + "microcontrollers" + "C++"). Gigamit nako ang ngalan nga "profile" aron ipasiugda ang mga artikulo sa profile sa site, bisan kung tingali ang English nga termino nga profile alang niini dili hingpit nga husto.

Sa miaging bahin nangutana kami bahin sa "geektimes effect" nga nalangkit sa pagbag-o sa mga lagda sa pagbayad alang sa mga artikulo alang sa geektimes sugod karong ting-init. Atong ipakita nga gilain ang mga artikulo sa 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()

Makaiikag ang resulta. Ang gibanabana nga ratio sa mga pagtan-aw sa mga artikulo sa geektimes sa kinatibuk-an naa sa usa ka lugar sa 1:5. Apan samtang ang kinatibuk-ang gidaghanon sa mga pagtan-aw mamatikdan nga nag-usab-usab, ang pagtan-aw sa "kalingawan" nga mga artikulo nagpabilin sa halos parehas nga lebel.

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Mamatikdan usab nimo nga ang kinatibuk-ang gidaghanon sa mga pagtan-aw sa mga artikulo sa seksyon nga "geektimes" nahulog gihapon pagkahuman gibag-o ang mga lagda, apan "pinaagi sa mata", nga dili molapas sa 5% sa kinatibuk-ang kantidad.

Makapainteres nga tan-awon ang kasagaran nga gidaghanon sa mga pagtan-aw matag artikulo:

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Alang sa mga artikulo nga "kalingawan" kini mga 40% labaw sa kasagaran. Tingali dili kini ikatingala. Ang kapakyasan sa sinugdanan sa Abril dili klaro kanako, tingali mao kana ang nahitabo, o kini usa ka matang sa sayup nga pag-parse, o tingali usa sa mga geektimes nga mga tagsulat miadto sa bakasyon;).

Pinaagi sa dalan, ang graph nagpakita sa duha pa ka mamatikdan nga peak sa gidaghanon sa mga panglantaw sa mga artikulo - ang Bag-ong Tuig ug Mayo holidays.

Mga Hub

Mopadayon kita sa gisaad nga pagtuki sa mga hub. Atong ilista ang top 20 hubs sa gidaghanon sa view:

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

Resulta:

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Katingad-an, ang pinakapopular nga hub sa mga termino sa mga panan-aw mao ang "Seguridad sa Impormasyon"; ang nanguna nga 5 nga mga lider naglakip usab sa "Programming" ug "Popular science".

Ang Antitop nag-okupar sa Gtk ug Cocoa.

Habrastatistics: pagsuhid sa kadaghanan ug pinakagamay nga gibisita nga mga seksyon sa site

Isulti ko kanimo ang usa ka sekreto, ang mga top hub makita usab dinhi, bisan tuod ang gidaghanon sa mga pagtan-aw wala gipakita didto.

Rating

Ug sa katapusan, ang gisaad nga rating. Gamit ang datos sa pag-analisa sa hub, mahimo namong ipakita ang labing inila nga mga artikulo para sa labing inila nga mga hub para karong tuiga 2019.

Kasegurohan sa Impormasyon

Programming

Popular nga Siyensya

Ang karera

Lehislasyon sa IT

Pag-uswag sa web

GTK

Ug sa katapusan, aron walay masakitan, akong ihatag ang rating sa labing gamay nga gibisita nga hub nga "gtk". Sulod sa usa ka tuig kini gimantala usa Ang artikulo, nga "awtomatikong" usab nag-okupar sa unang linya sa rating.

konklusyon

Walay konklusyon. Happy reading sa tanan.

Source: www.habr.com

Idugang sa usa ka comment