Приближение просмотров страницы на тег (или группа тега) в месяц с ограниченными данными?

Я обеспечил набор ссылок ниже, которые отвечают на Ваш вопрос более подробно и более точно, чем я могу когда-либо надеяться. Я однако дам ответ на Ваш вопрос в моих собственных словах также, чтобы сэкономить Вам некоторое время. Я помещу его в точки -

  1. супер, встроенная функция, не атрибут.
  2. Каждый тип (класс) в Python имеет __mro__ атрибут, который хранит порядок разрешения метода того конкретного экземпляра.
  3. Каждый вызов к супер имеет форму супер (тип [объект-или-тип]). Давайте предположим, что второй атрибут является объектом в настоящий момент.
  4. В начальной точке вызовов super, объект имеет тип Производного класса (, говорят что DC).
  5. супер ищет методы, которые соответствуют (в Вашем случае __init__) в классах в MRO, после того, как класс определил как первый аргумент (в этом случае классы после DC).
  6. , Когда метод сопоставления найден (говорят в классе BC1 ), это называют.
    (Этот метод должен использовать супер, таким образом, я принимаю, это делает - Видят, что супер Python является остротой, но не может использоваться - ссылка ниже), Что метод тогда вызывает поиск в MRO класса объекта для следующего метода, направо от [1 152] BC1.
  7. повторение промывки Промывки, пока все методы не находят и называют.

Объяснение Вашего примера

 MRO: D,B,C,A,object  
  1. super(D, self).__init__() называют. isinstance (сам, D) => Верный
  2. Поиск следующий метод в MRO в классах направо от D.

    B.__init__ найденный и названный

  1. B.__init__ вызовы super(B, self).__init__().

    isinstance (сам, B) => Ложь
    isinstance (сам, D) => Верный

  2. Таким образом, MRO является тем же, но поиск продолжается направо от B, т.е. C, A, объект ищется один за другим. Следующее __init__ найденный называют.

  3. И т. д. и т. п.

объяснение супер
http://www.python.org/download/releases/2.2.3/descrintro/#cooperation
Вещи наблюдать за при использовании супер
http://fuhm.net/super-harmful/
Python Алгоритм MRO:
http://www.python.org/download/releases/2.3/mro/
документы super:
http://docs.python.org/library/functions.html
низ этой страницы имеет хороший раздел по супер:
http://docstore.mik.ua/orelly/other/python/0596001886_pythonian-chp-5-sect-2.html

я надеюсь, что это помогает разрешить его.

5
задан Alex Papadimoulis 17 September 2009 в 22:36
поделиться

3 ответа

Вам необходимо учитывать экспоненциальный Кривая затухания просмотров, что-то похожее на эту - http://en.wikipedia.org/wiki/Exponential_decay

Нам нужна площадь под кривой до желаемого времени (в днях).

Если вычислите, и получите результат

Views = V/λ[1 - e^(-λt)]

t is (дата создания - сегодняшняя дата - 1)

V - количество просмотров, которое у нас есть

λ может быть 2ln2 / T или 1,4 / T

T может быть основным временем жизни, например, 5 или 7 дней. Давайте возьмем это 5.

Мы делаем много предположений здесь из-за динамической природы SO.

5
ответ дан 14 December 2019 в 08:55
поделиться

Чтобы имитировать длинные хвосты, просто введите константу. Или используйте логарифмическую функцию.

your_formula(delta_t) + C

1 / (1 + log(1 + delta_t))

(коэффициенты опущены)

0
ответ дан 14 December 2019 в 08:55
поделиться

Я подумал об этом методе для оценки хвоста:

для списка тегов, для каждого вопроса в этих тегах дать 1-й месяц после даты создания 80% View_Count дать 2-й месяц после creation_date 10% View_Count разделить 10% поровну между оставшимися месяцами до сегодняшнего дня

, конечно, 80%, 10% - это просто мой выбор, их можно рассчитать более точно на основе реальных данных. Также со второго месяца 10% могут быть отменены. Вся эта логика находится в: CASE WHEN diff ... часть.

вы получаете приблизительное количество просмотров / вопрос / месяц

, тогда все, что вам нужно сделать, это сумма просмотров в месяц, и если вы хотите, чтобы окно времени добавляло условие для месяца

Я создал хранимую процедуру, которая это можно сделать, но сначала вам нужно создать временную таблицу #tags (Tag_name), в которую вы поместите нужные теги.

CREATE PROCEDURE GetTagViews @startDate datetime, @endDate datetime
As

IF exists (SELECT null FROM sysobjects WHERE name = '#months' and type = 'U')
    DROP TABLE #MONTHS

CREATE TABLE #MONTHS
(
    month datetime
)

DECLARE @currMonth datetime
SELECT @currMonth = MIN(Creation_Date) FROM Questions

-- Populate #MONTHS with all the months from the oldest
-- question creation_date to Today
WHILE @currMonth < getdate()
BEGIN
    -- insert date starting at the beginning og the month
    INSERT INTO #MONTHS select @currMonth - day(@currMonth) + 1
    SELECT @currMonth = dateadd(m, 1, @currMonth) -- advance 1 month
END

SELECT YEAR(month) y, MONTH(month) m, SUM(curr_month_views) Views FROM (
SELECT Q1.month, Q1.diff, round(
CASE WHEN diff = dmin and diff = dmax THEN View_Count
     WHEN diff = dmin and diff < dmax THEN 0.8*View_Count
     WHEN diff = dmin+1 and diff < dmax THEN 0.1*View_Count
     WHEN diff = dmin+1 and diff = dmax THEN 0.2*View_Count
     WHEN diff >= dmin+2 THEN 0.1/(dmax - (dmin+2) + 1)*View_Count
     ELSE 0
END, 0) curr_month_views
FROM (
SELECT  Q.question_id, m.month, 
    DATEDIFF(m, Q.Creation_Date, m.month) diff, 
    Q.View_Count, dmin, dmax
FROM Questions Q,
     #MONTHS m, 
     (SELECT MIN(DATEDIFF(m, Q.Creation_Date, m.month)) [dmin], 
             MAX(DATEDIFF(m, Q.Creation_Date, m.month)) [dmax]
        FROM Questions Q,#MONTHS m
       WHERE DATEDIFF(m, Q.Creation_Date, m.month) >= 0) MINMAX
) Q1 join QuestionTags QT on Q1.question_id = QT.question_id 
     join #tags on #tags.Tag_Name = QT.Tag_Name
) b WHERE month >= @startDate - day(@startDate) + 1
      AND month <= @enddate - day(@enddate) + 1
GROUP BY Year(month), Month(month)
ORDER BY 1, 2

Если я запущу эту процедуру со следующими данными:

Question_Id View_Count  Creation_Date                  tag_name         
----------- ----------- ------------------------------ ----------
0           42          2009-09-10 00:00:00.000        sql
1           326         2008-08-04 00:00:00.000        sql
2           377         2008-08-04 00:00:00.000        sql
3           568         2008-08-03 00:00:00.000        sql
4           839         2008-08-01 00:00:00.000        sql
5           228         2009-03-01 00:00:00.000        sql
6           178         2009-03-11 00:00:00.000        sql
7           348         2009-08-11 00:00:00.000        c#

заполните #tags с помощью 'sql'

GetTagViews '20090501', '20091001'

    y           m           Views                                    
    ----------- ----------- ---------------
    2009        5           21.000000000000
    2009        6           21.000000000000
    2009        7           21.000000000000
    2009        8           21.000000000000
    2009        9           55.000000000000

заполнить # теги с помощью 'c #'

GetTagViews '20090501', '20091001'

    y           m           Views                                    
    ----------- ----------- ---------------------------------------- 
    2009        5           .000000000000
    2009        6           .000000000000
    2009        7           .000000000000
    2009        8           278.000000000000
    2009        9           35.000000000000

заполнить # теги как 'sql', так и 'c #'

GetTagViews '20090501', '20091001'

    y           m           Views                                    
    ----------- ----------- ----------------
    2009        5           21.000000000000
    2009        6           21.000000000000
    2009        7           21.000000000000
    2009        8           299.000000000000
    2009        9           90.000000000000

(вы видите этот пик для (sql,

2
ответ дан 14 December 2019 в 08:55
поделиться