我希望你能原谅我糟糕的英语。
我希望像下面的Python(Pandas)一样分析二进制化的时间序列数据。
>>> import pandas as pd
>>>
>>> s = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0])
>>> type(s)
<class 'pandas.core.series.Series'>
>>> s
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 False
8 False
9 False
10 False
11 True
12 True
13 False
dtype: bool我想提取值为True的索引的开始和停止。我试过以下几种方法。
>>> diff = s.diff().dropna()
>>> diff
1 False
2 False
3 True
4 False
5 False
6 False
7 True
8 False
9 False
10 False
11 True
12 False
13 True
dtype: object
>>> idxs = diff[diff].index.to_series()
>>> idxs
3 3
7 7
11 11
13 13
dtype: int64
>>> events = pd.concat(
[idxs[0::2].reset_index(drop=True),
idxs[1::2].reset_index(drop=True)],
axis=1)\
.apply(lambda r: pd.Interval(r[0], r[1]), axis=1)
>>> events
0 (3, 7]
1 (11, 13]
dtype: interval通过这种方式,我成功地提取了数据。然而,这段代码似乎有点难看。我想可能会有更好的代码或者库来实现这一点。
如果你知道的话,如果你能告诉我,我会很感激的。我也不知道type(events) == pd.Series[pd.Interval]是否合适,请给我一个更好的主意。当然,要分析的实际数据要大得多。
发布于 2022-04-14 09:25:59
以下是另一种选择:
pd.Series([pd.Interval(x.index[0], x.index[-1]+1)
for _,x in s[s].groupby((~s).cumsum())])或者,如果您没有范围索引:
m = s|s.shift()
pd.Series([pd.Interval(x.index[0], x.index[-1])
for _,x in s[m].groupby((~m).cumsum())])产出:
0 (3, 7]
1 (11, 13]
dtype: interval已使用的投入:
s = pd.Series([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0]).astype(bool)https://stackoverflow.com/questions/71869239
复制相似问题