Python 来自scipy的jarque_bera计算

Python 来自scipy的jarque_bera计算,python,pandas,dataframe,Python,Pandas,Dataframe,我试图对我的数据计算Jarque Bera Bera检验(正态性检验),结果如下(链式操作后): 我使用这样的函数: from scipy import stats def stat(x): return pd.Series([x.mean(), np.sqrt(x.var()), stats.jarque_bera(x), ],

我试图对我的数据计算Jarque Bera Bera检验(正态性检验),结果如下(链式操作后):

我使用这样的函数:

from scipy import stats

def stat(x):
    return pd.Series([x.mean(),
                      np.sqrt(x.var()),
                      stats.jarque_bera(x),
                      ],
                     index=['Return',
                            'Volatility',
                            'JB P-Value'
                            ])

data.apply(stat)

虽然均值和方差计算工作正常,但我有一条错误消息
stats.jarque_bera
函数,它是:

ValueError: Length of passed values is 10, index implies 9.

有什么想法吗?

我试图复制,通过复制上面提供的10行数据,该函数对我来说运行良好。这看起来像是一个数据输入问题,其中某些列的值似乎少于该
pd.Series
(实际上是
len(data[col])>len(data[col].index)
)。您可以通过运行一个简单的“调试”函数来尝试找出它是哪一列,例如:

对于data.columns中的列:
如果len(数据[col].values)!=len(数据[col]。索引):
打印(f“列{col}的值大于/小于索引”)
然而,on-Scipy说,
x
可以是任何“类似数组”的结构,因此您不需要传递
pd.Series
,这可能会使您遇到缺少值等问题。本质上,您只需传递一个值列表并计算其JB测试统计和p值

因此,我将把你的函数修改为

def stat(x):
返回pd.系列([x.平均值(),
np.sqrt(x.var()),
stats.jarque_bera(x.dropna().values),#删除NaN并获取numpy数组,而不是pd.Series
],
索引=['Return',
“波动性”,
“JB P值”
])

问题在于stat函数中的pd.Series()。我做了:``data.agg([…])``它工作得很好,但现在如何命名函数,因为我有:``Q1 Q2 Q3 Q4 8.89 9.20 7.63 7.30 15.77 16.19 16.93 17.59-1.04-0.95-0.79-0.61``我不确定我是否完全理解您的尝试。您是否尝试过我的建议来修改您构建的函数?我将代码更改为:data.agg([lambda x:x/mean(),lambda x:stats.jarque_bera(x.dropna()]))它工作得很好,但现在如何命名函数,因为我有:Q1 Q2 Q3 Q4 8.89 9.20 7.63 7.30 15.77 16.19 16.93 17.59-1.04-0.95-0.79-0.61 THX如何重命名lambda名称?在新的熊猫版本之前,它是命名lambda_1,…所以很容易使用重命名函数来更改它们。但现在我不知道如何在c内部进行操作hain操作ie:(df.agg(…)。???这里如何重命名我的函数???)我明白了。lambda本质上是匿名函数,因此您必须以某种方式重命名列名。一种方法是这样做:
new=data.agg([lambda x:x.mean(),lambda x:np.sqrt(x.var()),lambda x:stats.jarque_bera(x.dropna())]。
ValueError: Length of passed values is 10, index implies 9.