ZeroDivisionError - Панды - PullRequest
       37

ZeroDivisionError - Панды

0 голосов
/ 26 июня 2018

Сценарий следующий - с целью показать разницу в средних показателях кликов по ранжированию по ключевому слову - выделение запросов / страниц с невысокими показателями.

До недавнего времени он работал нормально - однако теперь он дает мне приведенную ниже ошибку ZeroDivisionError.

import os
import sys
import math
from statistics import median
import numpy as np
import pandas as pd

in_file = 'data.csv'
thresh = 5

df = pd.read_csv(in_file)
# Round position to tenths
df = df.round({'position': 1})
# Restrict garbage 1 impression, 1 click, 100% CTR entries
df = df[df.clicks >= thresh]
df.head()

def apply_stats(row, df):

    if int(row['impressions']) > 5:

        ctr = float(row['ctr'])
        pos = row['position']

        # Median
        median_ctr = median(df.ctr[df.position==pos])
        # Mad
        mad_ctr = df.ctr[df.position==pos].mad()

        row['score'] = round(float( (1 * (ctr - median_ctr))/mad_ctr ), 3 ) 
        row['mad'] = mad_ctr
        row['median'] = median_ctr

    return row

df = df.apply(apply_stats, args=(df,), axis = 1)
df.to_csv('out2_' + in_file)
df.head()

Я получаю сообщение об ошибке:

-----------------------------------------
ZeroDivisionErrorTraceback (most recent call last)
<ipython-input-33-f1eef41d1c9a> in <module>()
----> 1 df = df.apply(apply_stats, args=(df,), axis = 1)
      2 df.to_csv('out2_' + in_file)
      3 df.head()

~\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds)
   6002                          args=args,
   6003                          kwds=kwds)
-> 6004         return op.get_result()
   6005 
   6006     def applymap(self, func):

~\Anaconda3\lib\site-packages\pandas\core\apply.py in get_result(self)
    140             return self.apply_raw()
    141 
--> 142         return self.apply_standard()
    143 
    144     def apply_empty_result(self):

~\Anaconda3\lib\site-packages\pandas\core\apply.py in apply_standard(self)
    246 
    247         # compute the result using the series generator
--> 248         self.apply_series_generator()
    249 
    250         # wrap results

~\Anaconda3\lib\site-packages\pandas\core\apply.py in apply_series_generator(self)
    275             try:
    276                 for i, v in enumerate(series_gen):
--> 277                     results[i] = self.f(v)
    278                     keys.append(v.name)
    279             except Exception as e:

~\Anaconda3\lib\site-packages\pandas\core\apply.py in f(x)
     72         if kwds or args and not isinstance(func, np.ufunc):
     73             def f(x):
---> 74                 return func(x, *args, **kwds)
     75         else:
     76             f = func

<ipython-input-32-900a8cda8fce> in apply_stats(row, df)
     11         mad_ctr = df.ctr[df.position==pos].mad()
     12 
---> 13         row['score'] = round(float( (1 * (ctr - median_ctr))/mad_ctr ), 3 )
     14         row['mad'] = mad_ctr
     15         row['median'] = median_ctr

ZeroDivisionError: ('float division by zero', 'occurred at index 317')

Все данные в CSV представляют собой целые числа для кликов, показов + поплавков для ctr, позиции.

Есть ли ошибка в скрипте или, возможно, проблема с форматированием данных?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Если я правильно прочитал ошибку, в какой-то момент у вас есть строка, для которой переменная mad_ctr, которая отображается как делитель для вычисления оценки, равна нулю (похоже, это происходит для строки, имеющей индекс 317) .

Поскольку функция mad вычисляет среднее абсолютное отклонение, возможно, что для этой конкретной строки все значения одинаковы и, следовательно, отклонение равно нулю.

Это проблема, связанная с вашими данными и вещами, которые вы хотите вычислить.

0 голосов
/ 26 июня 2018

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

row['score'] = round(float( (1 * (ctr - median_ctr))/mad_ctr ), 3 ) if mad_ctr != 0 else 0

Это установит score в ноль, если mad_ctr равно нулю. Но вы также можете использовать None или другое значение по умолчанию, если хотите.

...