Cei mai activi membri ai comunitatii

Cum acest forum are deja ceva vechime, ati fi curiosi de o animatie cu evolutia celor mai activi membri?

Exemplu realizat de mine dupa ce am descarcat baza de date publica a stackoverflow:

3 Likes

Nu știu cât de mult îți permite API-ul treaba asta. Dar:

  1. un punct de plecare cred că ar fi ăsta
  2. majoritatea endpoints de pe forum au și varianta să le pui .json în coadă pentru a avea acces la informații.

Îmi spui ce ai nevoie, dacă nu implică date personale și îți pot da acces, rezolvăm.

1 Like

Ma astept sa nu fie un API disponibil fiindca e nevoie de agregare cumulata la nivelul fiecarei zi, nu doar de la inceput pana in prezent cum fac leaderboarduri.

E nevoie de un dump (csv, json, etc) cu nume utilizator (unic) si data fiecarei postari (fara ora). Ma astept sa nu fie date personale (peste tot apare ca X a scris ceva la data Y).

Rezultatul din query-ul de aici arată așa

Dar este nevoie să rulez un query pentru fiecare user în parte :smiley: Dacă vii cu un query mai isteț (de ex. ceva care se leagă de leaderboard, să ia primii X utilizatori pe rând) îl rulez și-ți dau rezultatul.

Pot să-ți dau like-uri primite, flag-uri, user ID, user name etc. Adică tot ce este public.

Nu pot să-ți dau ip-uri, mail-uri și orice altceva ar putea fi folosit la identificarea cuiva.

1 Like
(SELECT u.username as name, p.created_at::date as day
FROM posts p
JOIN users u ON users.id = p.user_id

UNION ALL

SELECT u.username as name, t.created_at::date as day
FROM topics t
JOIN users u ON users.id = t.user_id
)
ORDER BY day

Procesarea o fac eu mai departe din cod, n-am gasit cum sa scriu un SQL eficient pentru rezultatul final. Sortarea e optionala daca-i prea costisitoare.

username e iamntz sau Ionuț Staicu? Ionuț Staicu ar arata mai bine pe animatie.

1 Like

@iamntz este userul lui
Numele compelet piate sa nu apara

In cazul meu, user-ul este @Cosmin_Popescu :grin:

O idee faina. Abia astept sa vad ce iese!

Ar merge o adaptare atunci sa ia numele (nu stiu coloana din db) iar daca nu e pus sa fallback la username.

Recomand să pui un Discourse în Docker local, vezi cum funcționează Data Explorer și query-urile în general. Sau să deschizi un subiect pe meta.discourse, oamenii sunt super săritori și e posibil să existe ceva deja ce ne permite să extragem datele.

Cred că ar fi o idee interesantă de implementat ca plugin de discourse. :wink:

Datele necesare din Discourse sunt doar o insiruire de nume & data postarii (interogarea de mai sus).

Partea mai dificila a fost procesarea lor ulterioara. Din cod a fost usor & eficient pentru zecile de milioane de postari de pe Stackoverflow. Pentru SQL am pus problema aici Evolutia top N useri - #13 de Dani dar nu s-a gasit o solutie prea eficienta.

Asa ca am ramas la varianta mai simpla: din SQL doar export de date minim necesare, iar apoi procesare separata.

Ideea mea: interogarea de mai jos → csv apoi fac eu procesarea ulterioara pana la nivel de animatie.

(SELECT coalesce(u.name, u.username) as name, p.created_at::date as day
 FROM posts p
          JOIN users u ON u.id = p.user_id
 UNION ALL
 SELECT coalesce(u.name, u.username), t.created_at::date as day
 FROM topics t
          JOIN users u ON u.id = t.user_id
)
    ORDER BY day

Cui ii place rezultatul si are suficient timp liber, poate incerca sa implementeze asa ceva ca plugin Discourse.

2 Likes

Care ar fi noutatea ? Implementarea in Discourse ?
Am vazut zeci de astfel de chart-uri in pandemie.

1 Like
10 Likes

trebuie ignorat discobot-ul.
si iamntz :))

Pentru cine nu știe cine-i discobot: Who is Discobot?

1 Like