Рассчитать средневзвешенное значение с пандами для уменьшения стоимости - PullRequest
1 голос
/ 15 мая 2019

Я устанавливаю систему ранжирования, и в основном у меня есть поле с именем site_fees, которое составляет 10% от общего количества для рассмотрения. Плата за сайт 0 получит все 10 баллов. Я хочу рассчитать, сколько очков получат ненулевые поля, но я изо всех сил пытаюсь это сделать.

Мой первоначальный подход состоял в том, чтобы разделить фрейм данных на 2 фрейма данных (dfb, где site_fees - 0, и dfa, где они> 0) и рассчитать среднее значение для dfa, присвоить рейтинг для dfb равным 10, а затем объединить два.

Код выглядит следующим образом:

dfSitesa = dfSites[dfSites['site_fees'].notnull()]
dfSitesb = dfSites[dfSites['site_fees'].isnull()]
dfSitesa['rating'] = FeeWeight * \
dfSitesa['site_fees'].min()/dfSitesa['site_fees']
dfSitesb['rating'] = FeeWeight
dfSites = pd.concat([dfSitesa,dfSitesb])

Это приводит к выводу, однако результаты dfa неверны, так как минимум dfa равен 5000 вместо 0, поэтому рейтинг сайта с комиссией в 5000 долларов составляет 10 (максимум, не верный). Что я делаю не так?

Минимальное ненулевое значение site_fee составляет 5000, а максимальное - 15000. Исходя из этого, можно ожидать общую систему ранжирования, такую ​​как:

15000 | 0
10000 | 3.3
5000  | 6.6
0     | 10

1 Ответ

1 голос
/ 15 мая 2019

Вот способ сделать это:

dfSites = pd.DataFrame({'site_fees':[0,1,2,3,5]})
FeeWeight = 10

dfSitesa = dfSites[dfSites['site_fees'].notnull()]
dfSitesb = dfSites[dfSites['site_fees'].isnull()]
dfSitesb['rating'] = FeeWeight
factor = (dfSitesa['site_fees'].max() - dfSitesa['site_fees'].min())
dfSitesa['rating'] = FeeWeight * ( 1 - ( (dfSitesa['site_fees'] -  dfSitesa['site_fees'].min()) / factor) )
dfSites = pd.concat([dfSitesa,dfSitesb])

In [1] : print(dfSites)
Out[1] : 
site_fees   rating
0   0   10.0
1   1   8.0
2   2   6.0
3   3   4.0
4   5   0.0
...