熊猫-使用Nans的矢量化公式计算

时间:2018-11-09 22:09:31

标签: python pandas numpy

我有一个DataFrame(称为signal),它是一个具有5列的简单时间序列。其.describe()如下所示:

                ES           NK           NQ           YM
count  5294.000000  6673.000000  4798.000000  3415.000000
mean     -0.000340     0.000074    -0.000075    -0.000420
std       0.016726     0.018401     0.023868     0.015399
min      -0.118724    -0.156342    -0.144667    -0.103101
25%      -0.008862    -0.010297    -0.011481    -0.008162
50%      -0.001422    -0.000590    -0.001747    -0.001324
75%       0.007069     0.009163     0.009841     0.006304
max       0.156365     0.192686     0.181245     0.132630

我想在每一行上应用一个简单的函数,并接收回具有相同尺寸的矩阵:

weights = -2*signal.subtract( signal.mean(axis=1), axis=0).divide( signal.sub( signal.mean(axis=1), axis=0).abs().sum(axis=1), axis=0 )

但是,当我运行此行时,程序被卡住了。我相信这个问题是由于nans长度/状态的不同所致。删除nan /填充它不是一个选择,对于任何给定的具有nan的行,我希望将该nan从计算中简单排除。临时解决方案是使用.iterrows()迭代进行此操作,但这不是有效的解决方案。

有没有针对此问题的明智解决方案?

1 个答案:

答案 0 :(得分:2)

问题是,默认情况下,熊猫meansum方法已经排除了NaN值(请参阅链接文档中skipna关键字的描述)。另外,subtractdivide允许使用fill_value关键字arg:

  

fill_value:无或浮点值,默认为无

     

在计算之前用此值填充现有的缺失(NaN)值以及成功完成DataFrame对齐所需的任何新元素。如果两个对应的DataFrame位置中的数据均丢失,则结果将丢失

因此,您可以通过在对fill_value=0的调用中设置subtract和对fill_value=1的调用中divide来获得所需的内容。

但是,我怀疑默认行为(NaNmeansumNaN - anything = NaN中的NaN\anything = NaN被忽略了)是您真正想要的。在这种情况下,您的问题与NaN并没有直接关系,因此您将必须澄清语句“当我运行此行时,程序会卡住”,以便获得有用的答案。