我正在尝试为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)
新的col 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
答案 0 :(得分:1)
您的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
的参数中。)