Ich habe eine Django-Anwendung, in der ich einen einfachen Trending / Ranking-Algorithmus implementieren muss. Ich bin sehr verloren als:
Ich habe zwei Modelle, Book
und Reader
. Jede Nacht werden neue Bücher zu meiner Datenbank hinzugefügt. Die Anzahl der Leser für jedes Buch wird auch jede Nacht aktualisiert, d. H. Ein Buch wird mehrere Leserstatistikaufzeichnungen haben (ein Datensatz für jeden Tag).
Über einen bestimmten Zeitraum (vergangene Woche, vergangenen Monat oder letztes Jahr) möchte ich die beliebtesten Bücher auflisten, welchen Algorithmus soll ich dafür verwenden?
Die Popularität muss in keiner Weise in Echtzeit sein, weil die Leserzahl für jedes Buch nur täglich aktualisiert wird.
Ich fand einen Artikel, auf den in einer anderen SO verwiesen wurde Beitrag, der gezeigt hat, wie sie Wikipedia-Artikel mit Trendanalyse berechnet haben , aber der Beitrag zeigte nur, wie der aktuelle Trend berechnet wurde.
Wie jemand auf SO hingewiesen hat, ist es ein sehr einfacher Grundlinientrendalgorithmus und berechnet nur die Steigung zwischen zwei Datenpunkten, also schätze ich, dass er den Trend zwischen gestern und heute zeigt.
Ich suche nicht nach einem Uber-Komplex-Trending-Algorithmus, wie er bei Hacker News, Reddit usw. verwendet wird.
Ich habe nur zwei Datenachsen, Leseranzahl und Datum.
Irgendwelche Ideen, was und wie ich umsetzen soll. Für jemanden, der nie mit Statistiken / Algorithmen gearbeitet hat, scheint dies ein sehr entmutigendes Unterfangen zu sein.
Vielen Dank im Voraus alle.
Der wahrscheinlichste Trending-Algorithmus, den ich mir vorstellen kann, ist der gleitende Durchschnitt der nächsten Tage. Ich bin mir nicht sicher, wie Ihre Daten strukturiert sind, aber sagen Sie, Sie haben so etwas:
%Vor% Ein einfacher gleitender Durchschnitt nimmt nur die letzten n
Werte und mittelt sie:
Die Slice-Notation erfasst einfach das Ende der Liste, beginnend mit der n-ten bis zur letzten Variablen. Ein gleitender Durchschnitt ist eine ziemlich übliche Methode, um Rauschen zu glätten, das eine einzelne Spitze oder ein Eintauchen verursachen könnte. Die Funktion könnte wie folgt verwendet werden:
%Vor%Sie möchten mit der Anzahl der Tage spielen, über die Sie durchschnittlich liegen. Und wenn Sie aktuelle Trends hervorheben möchten, können Sie sich auch etwas wie einen gewichteten gleitenden Durchschnitt ansehen.
>Wenn Sie sich auf etwas konzentrieren wollten, das weniger auf absolute Leserschaft abzielt und stattdessen auf eine Steigerung der Leserschaft abzielt, finden Sie einfach die prozentuale Veränderung des gleitenden 30-Tage-Durchschnitts und des gleitenden 5-Tage-Durchschnitts:
%Vor%Mit diesen einfachen Werkzeugen haben Sie eine gewisse Flexibilität, wie sehr Sie vergangene Trends betonen und wie viel Sie Spikes ausgleichen (oder nicht glätten) wollen.
Popularität ist einfach; Sie führen einfach eine Zählung auf den Lesern durch und bestellen damit:
%Vor%Der Trend ist schwieriger, da dies eher ein Popularitätsdelta ist, d. h. welche Bücher in jüngster Zeit die meisten Leser gewonnen haben. Wenn Sie so etwas wollen, brauchen Sie etwas, das hinter den Kulissen läuft, um die Anzahl der Leser nach Datum aufzuzeichnen.
Sie können stackoverflow-Reputationsrangliste als Beispiel verwenden.
Der Benutzer kann die Ansicht ändern: nach Monat, nach Jahr, ...
In Ihrem Fall: Das am meisten gelesene Buch nach Monat, nach Jahr.
Um dies zu erreichen, sollten Sie Tag für Tag die Anzahl der Leser für jedes Buch speichern.
%Vor%Dann ist es so einfach wie:
%Vor%Ich würde es systemisch so machen:
Erstellen Sie eine Liste der häufigsten Fragen oder Datenpunkte, an denen ein Benutzer interessiert ist, zum Beispiel: 1.1 Top 100 der beliebtesten Bücher dieser Woche 1.2 Die 100 beliebtesten Bücher dieses Monats
Nach Ihrer täglichen Leser / Buchinfo. Ist aktualisiert, würde ich einen Job (wahrscheinlich nächtlich) ausführen, um eine Tabelle dieser Info zu aktualisieren. Tabelle wird wahrscheinlich Buch und ReaderDelta Felder haben, wo ReaderDelta die Änderung in readerCount über eine Woche, Monat oder Jahr ist.
Sie können auch einfach das tägliche ReaderDelta speichern und bei der Suche nach Daten für einen Monat einfach die letzten 30 Tage nach Datum aggregieren.
Tags und Links python django statistics trending popularity