Рассчитать новые столбцы в Pandas DataFrame, используя номер строки - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать два новых столбца распределения вероятностей для A и B, которые должны следовать временному ряду (проиндексированному здесь).

from scipy.stats import poisson
from datetime import timedelta
import pandas as pd
import numpy as np

p = 4.0
q = 5.0
a = np.array([0,0,0,1,0])
b = np.array([0,0,1,1,0])
d = {'A':a, 'B':b}
Time_Interval = pd.timedelta_range('11:00:00', periods=5, freq='10T')
df = pd.DataFrame(d, Time_Interval)

Новый столбец A '(соответствующий A) генерируется следующим образом .

so when i = 1 ==> poisson.pmf(0, p*1/5)
        i = 2 ==> poisson.pmf(0, p*2/5)
        i = 3 ==> poisson.pmf(0, p*3/5)
        i = 4 ==> poisson.pmf(1, p*4/5)
        i = 5 ==> poisson.pmf(0, p*5/5)

Я попробовал следующий способ.

df["A'"] = df.A.apply(lambda v : poisson.pmf(v, p*i/len(df)) for i in list(range(1,1+len(df['A']))))
df["B'"] = df.B.apply(lambda x : poisson.pmf(x, q*j/len(df)) for j in list(range(1,1+len(df['B']))))


## list(range(1, len(df['A']))) creates the index i for the i/len(df) term inside the poisson func. for i [1,2,3,4,5]. 

Но я получу следующую ошибку.

TypeError: 'generator' object is not callable

Результат должен выглядеть следующим образом

df
Out[358]: 
               A       B   A'         B'
11:00:00       0       0  0.449329  0.367879
11:10:00       0       0  0.201897  0.135335
11:20:00       0       1  0.090718  0.149361
11:30:00       1       1  0.130439  0.073263
11:40:00       0       0  0.018316  0.006738

1 Ответ

0 голосов
/ 20 сентября 2018

Ваше значение i должно быть индексом строки, который предоставляет ваш параметр v.У вас есть код, который перебирает все строки в каждом расчете.

Чтобы решить эту проблему, вам нужны номера строк в вашем фрейме данных:

d = {'t': Time_Interval, 'A':a, 'B':b}
df = pd.DataFrame(d)

Затем вы можете обработать всю строку и посмотретьномер строки (row.name):

def func(row):
    i = row.name + 1
    return poisson.pmf(row['A'], p*i/len(df))

df["A'"] = df.apply(func, axis=1)

Я оставлю вам столбец обработки B.(Подсказка: вы можете передать args в apply, и они будут добавлены к аргументам func.)

...