Функция внутри функции для итерации каждой строки на основе значения столбца - PullRequest
2 голосов
/ 26 мая 2019

Я сейчас пытаюсь создать функцию для фрейма данных, и она слишком сложна для меня. У меня есть датафрейм, который выглядит так:

df1

     hour    production ....      
0     1          10
0     2          20
0     1          30
0     3          40
0     1          40
0     4          30
0     1          20
0     4          10

Я пытаюсь создать функцию, которая будет делать следующее:

  1. Группировать данные по разным hour
  2. Рассчитать 90% доверительный интервал production для каждого hour
  3. Если значение production определенной строки выходит за пределы 90-процентного доверительного интервала для ее соответствующего hour, пометьте его как unusual, создав новый столбец

Ниже приведен текущий шаг, который я предпринимаю для выполнения вышеуказанного для каждого индивидуального часа:

Рассчитать доверительный интервал

confidence = 0.90
data = df1['production ']
n = len(data)
m = mean(data)
std_err = sem(data)
h = std_err * t.ppf((1 + confidence) / 2, n - 1)
lower_interval = m - h
upper_interval = m + h

Тогда:

def confidence_interval(x):
if x['production'] > upper_interval  :
    return 1
if x['production'] < lower_interval :
    return 1
return 0

df1['unusual'] = df1.apply (lambda x: confidence_interval(x), axis=1)

Я делаю это для каждого значения в часе, а не для того, чтобы объединить все результаты в один исходный кадр данных.

Может ли кто-нибудь помочь мне создать функцию, которая может выполнять все вышеперечисленное одновременно? Я попробовал, но просто не могу обдумать это.

1 Ответ

2 голосов
/ 26 мая 2019

Создать пользовательскую функцию и использовать GroupBy.transform с Series.between и инвертировать маску с помощью ~:

from scipy.stats import sem, t
from scipy import mean

def confidence_interval(data):
    confidence = 0.90
    n = len(data)
    m = mean(data)
    std_err = sem(data)
    h = std_err * t.ppf((1 + confidence) / 2, n - 1)
    lower_interval = m - h
    upper_interval = m + h
    #print (lower_interval ,upper_interval)
    return ~data.between(lower_interval, upper_interval, inclusive=False)

df1['new'] = df1.groupby('hour')['production'].transform(confidence_interval).astype(int)
print (df1)
   hour  production  new
0     1          10    0
0     2          20    1
0     1          30    0
0     3          40    1
0     1          40    0
0     4          30    0
0     1          20    0
0     4          10    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...