Pandas скользящий: совокупные логические значения - PullRequest
1 голос
/ 24 марта 2020

Есть ли какая-либо подвижная "любая" функция в pandas .DataFrame? Или есть какой-либо другой способ агрегирования логических значений в скользящей функции?

Рассмотрим:

import pandas as pd
import numpy as np

s = pd.Series([True, True, False, True, False, False, False, True])

# this works but I don't think it is clear enough - I am not
# interested in the sum but a logical or!
s.rolling(2).sum() > 0  

# What I would like to have:
s.rolling(2).any()
# AttributeError: 'Rolling' object has no attribute 'any'
s.rolling(2).agg(np.any)
# Same error! AttributeError: 'Rolling' object has no attribute 'any'

Итак, какие функции можно использовать при агрегировании логических значений? (если numpy .any не работает) В скользящей документации по https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.rolling.html указано, что возвращается «Подклассы окна или прокрутки для конкретной операции», что на самом деле не помогает.

1 Ответ

0 голосов
/ 24 марта 2020

Этот метод не реализован, закройте, вам нужно использовать Rolling.apply:

s = s.rolling(2).apply(lambda x: x.any(), raw=False)
print (s)
0    NaN
1    1.0
2    1.0
3    1.0
4    1.0
5    0.0
6    0.0
7    1.0
dtype: float64

s = s.rolling(2).apply(lambda x: x.any(), raw=False).fillna(0).astype(bool)
print (s)
0    False
1     True
2     True
3     True
4     True
5    False
6    False
7     True
dtype: bool

Лучше использовать шагов - генерировать numpy 2d массивы и обработка позже:

s = pd.Series([True, True, False, True, False, False, False, True])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

a = rolling_window(s.to_numpy(), 2)
print (a)
[[ True  True]
 [ True False]
 [False  True]
 [ True False]
 [False False]
 [False False]
 [False  True]]

print (np.any(a, axis=1))
[ True  True  True  True False False  True]

Здесь первые NaN s pandas значения опущены, вы можете добавить первые значения для обработки, здесь False s:

n = 2
x = np.concatenate([[False] * (n), s])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[False False]
 [False  True]
 [ True  True]
 [ True False]
 [False  True]
 [ True False]
 [False False]
 [False False]
 [False  True]]

print (np.any(a, axis=1))
[False  True  True  True  True  True False False  True]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...