pandas ewm和滚动方法不填写NA

时间:2016-10-11 11:03:35

标签: python pandas

是否有一个ewm和滚动方法的参数没有填写NA?

template<typename T>
struct UniquePtrInserter : std::iterator< 
                           std::forward_iterator_tag,
                           std::unique_ptr<T>,
                           std::ptrdiff_t,  
                           const std::unique_ptr<T>*,
                           std::unique_ptr<T>>{
  int n_;
public:
  explicit UniquePtrInserter<T>(int n = 0) : n_(n) {}
  UniquePtrInserter<T>& operator++() {n_++; return *this;}
  bool operator==(UniquePtrInserter<T> other) const {return n_ == other.n_;}
  bool operator!=(UniquePtrInserter<T> other) const {return !(*this == other);}
  std::unique_ptr<T> operator*() const {return std::make_unique<T>(); }
};

vec.insert(vec.begin(), UniquePtrInserter<int>(0), UniquePtrInserter<int>(3));

当然,这可以通过

轻松解决
>>> A = pd.Series([1,2,3,4,np.nan,5,6])
>>> A
0    1.0
1    2.0
2    3.0
3    4.0
4    NaN
5    5.0
6    6.0
dtype: float64
>>> eA = A.ewm(alpha = 0.5, ignore_na=True).mean()
>>> eA
0    1.000000
1    1.666667
2    2.428571
3    3.266667
4    3.266667 # I want this to be NA, don't fill in
5    4.161290
6    5.095238
dtype: float64

但是这需要一些不必要的运行时间,并且当你有多个滚动函数时,需要考虑每个滚动函数的变量名称是很麻烦的。

1 个答案:

答案 0 :(得分:1)

不幸的是,ewm目前不支持此功能,您必须使用提议的方法覆盖NaN或过滤NaN行,以便ewm生成保留原始索引的Series,然后您可以使用combine_firstreindex重新插入NaN行:

In [32]:
A = pd.Series([1,2,3,4,np.nan,5,6])
eA = A[A.notnull()].ewm(alpha = 0.5, ignore_na=True).mean()
eA.combine_first(A)

Out[32]:
0    1.000000
1    1.666667
2    2.428571
3    3.266667
4         NaN
5    4.161290
6    5.095238
dtype: float64

In [33]:
eA.reindex(A.index)

Out[33]:
0    1.000000
1    1.666667
2    2.428571
3    3.266667
4         NaN
5    4.161290
6    5.095238
dtype: float64