Python 计算;能源";熊猫柱
我试图计算我的Python 计算;能源";熊猫柱,python,pandas,numpy,Python,Pandas,Numpy,我试图计算我的熊猫的信号能量。我尝试了和applymap,也尝试了reduce,如下所示:。但我所做的只是对每个元素进行操作,而不是对整个列进行操作 这不是一个特定于信号处理的问题,它只是一个如何将“summary”(我不知道这个词的正确名称)函数应用于列的示例 我的解决方法是获取原始numpy.array数据并进行计算。但我很确定有一种潘多蒂式的方法可以做到这一点(当然还有一种更为自然的方法) 提前谢谢 您可以对数据帧输出执行以下操作- (df**2).sum(axis=0) # Or (df
熊猫的信号能量。我尝试了和applymap
,也尝试了reduce,如下所示:。但我所做的只是对每个元素进行操作,而不是对整个列进行操作
这不是一个特定于信号处理的问题,它只是一个如何将“summary”(我不知道这个词的正确名称)函数应用于列的示例
我的解决方法是获取原始numpy.array
数据并进行计算。但我很确定有一种潘多蒂式的方法可以做到这一点(当然还有一种更为自然的方法)
提前谢谢 您可以对数据帧输出执行以下操作-
(df**2).sum(axis=0) # Or (df**2).sum(0)
为了提高性能,我们可以使用从数据帧中提取的数组-
(df.values**2).sum(axis=0) # Or (df.values**2).sum(0)
为了进一步提高性能,还有np.einsum
-
a = df.values
out = np.einsum('ij,ij->j',a,a)
运行时测试-
In [31]: df = pd.DataFrame(np.random.randint(0,9,(1000,30)))
In [32]: %timeit (df**2).sum(0)
1000 loops, best of 3: 518 µs per loop
In [33]: %timeit (df.values**2).sum(0)
10000 loops, best of 3: 40.2 µs per loop
In [34]: def einsum_based(a):
...: a = df.values
...: return np.einsum('ij,ij->j',a,a)
...:
In [35]: %timeit einsum_based(a)
10000 loops, best of 3: 32.2 µs per loop
有一个属性df.var()
,它返回列的方差。这是能量(取决于定义,您可能需要将其乘以元素数df.var()*df.shape[0]
)。您可以使用:
真的,就这样?看起来很简单,我现在有点傻了:)谢谢einsum
是给书呆子的,不是吗?但这仍然是一件很酷的事情。@ppasler是的,那些在最后形成俱乐部的,而不是音乐俱乐部;)意想不到的是,numpy
比pandas
快10倍多。可能是C
实现吗?@ppasler不是pandas方面的专家,因此不能权威地对此发表评论,但与基于pandas的一些问题的dataframe数据相比,使用数组的工作性能更高,我可以使用NumPy方法使用底层数组数据来回答这些问题。谢谢,这与我的公式给出的结果相当相同。由于我想知道一般情况下如何实现这些功能,这只适用于我的特殊情况。
In [31]: df = pd.DataFrame(np.random.randint(0,9,(1000,30)))
In [32]: %timeit (df**2).sum(0)
1000 loops, best of 3: 518 µs per loop
In [33]: %timeit (df.values**2).sum(0)
10000 loops, best of 3: 40.2 µs per loop
In [34]: def einsum_based(a):
...: a = df.values
...: return np.einsum('ij,ij->j',a,a)
...:
In [35]: %timeit einsum_based(a)
10000 loops, best of 3: 32.2 µs per loop
print (df.pow(2).sum())
0 40
1 285
2 285
dtype: int64
print (df.pow(2).sum().values.tolist())
[40, 285, 285]