首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >切分与条件相关的熊猫时间序列

切分与条件相关的熊猫时间序列
EN

Stack Overflow用户
提问于 2019-09-10 21:12:58
回答 2查看 331关注 0票数 1

我需要在条件发生前60分钟对熊猫时间序列进行切片,例如,在'Signal‘== 1列中的数字之前60秒

现在,我在整个数据帧上使用.tail(60),直到得到所需的索引,但效率非常低

代码语言:javascript
运行
复制
def create_sequences(signal, label,  data):
    """Function to return seqs of 60 secs prior to condition"""
    sequences = []

    for i in signal:
        sequence = data.loc[:i].tail(60)
        if len(sequence) == 60:
            sequences.append((np.array(sequence.drop('Signal', 
                                       axis=1)).transpose(), label))


    return sequences


# To generate some data for reproduction
periods = 7 * 24 * 60
tidx = pd.date_range('2019-09-01', periods=periods, freq='T')
ts = pd.DataFrame(data=data, index=tidx)
ts['Signal'] = ts[0].apply(lambda x: 1 if x > 0 else 0)

ones = ts[ts.Signal == 1].index.values


x = create_sequences(ones, 1, ts)
EN

回答 2

Stack Overflow用户

发布于 2019-09-10 23:11:03

我稍微修改了数据生成脚本,

代码语言:javascript
运行
复制
periods = 7 * 24 * 60
tidx = pandas.date_range('2019-09-01', periods=periods, freq='T')
ts = pandas.DataFrame(index=tidx)
ts['Signal'] = 0

并且在第1000行(超过10080行)中引入了'1‘,

代码语言:javascript
运行
复制
ts['Signal'].iloc[1000] = 1

首先快速检查时间戳索引是否已排序,

代码语言:javascript
运行
复制
 In[1]: ts.index.is_monotonic_increasing
Out[1]: True

导入tqdm以测量性能

代码语言:javascript
运行
复制
from tqdm import tqdm

有两个选项,因为时间序列的分辨率是1分钟,所以结果在这里是相同的,但您可以根据预期的结果使用其中一个。

1.如果希望得到的切片像滑动窗口一样重叠,可以使用.iterrows()

代码语言:javascript
运行
复制
D = pandas.Timedelta('00:00:60')
sequences = []

for timestamp, row in tqdm(ts.iterrows()):
    if ts.loc[timestamp:timestamp + D, 'Signal'].sum() > 0: 
        break
    sequences.append(ts.loc[timestamp:timestamp + D])

2.如果希望得到的切片是连续的,而不是重叠的,

代码语言:javascript
运行
复制
D = pandas.Timedelta('00:00:60')
sequences = []

nmax = numpy.trunc((ts.index.max() - ts.index.min()) / D)

for n in range(0, int(nmax)):
  if ts.loc[ts.index.min() + (n * D):ts.index.min()  + (1 + n) * D, 'Signal'].sum() > 0: 
    break
  sequences.append(ts.loc[ts.index.min() + (n * D):ts.index.min()  + (1 + n) * D])

这两次执行都不到一秒,但如果您正在寻求更快的性能,您可以检查.itertuples() (参考。https://medium.com/@formigone/stop-using-df-iterrows-2fbc2931b60e)

票数 1
EN

Stack Overflow用户

发布于 2019-11-22 16:03:31

这是有效的,尽管对于大数据集来说有点慢

代码语言:javascript
运行
复制
sequences = []
for timestamp, row in ts.iterrows():

    data = ts.loc[timestamp:timestamp + pd.Timedelta(seconds=60),:]
    label = ts.Signal.loc[timestamp + pd.Timedelta(seconds=60)]
    sequences.append((ts.drop('Signal', axis=1).values, label))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57871595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档