首页 > 解决方案 > 如何用 Pandas 确定周期

问题描述

基于示例数据框:

import pandas as pd
Machine = [0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0]
df2 = pd.DataFrame(Machine)

这是在嘲笑一台机器的开启和关闭。0 表示关闭,1 表示在该时间段内开启。但是,由于数据不佳,机器会在数据中看到的开启周期中间说它关闭。(1,1,1,1,1,0,1,1,1) 整段时间机器确实是开着的,0为错误。有没有人知道一种简单的方法来计算在忽略不良数据实例的情况下将具有的循环总数?

上面的示例代码有 3 个开启周期和 4 个关闭周期。在忽略循环中的随机数据错误的情况下,计算这一点的最佳方法是什么。

标签: pythonpandas

解决方案


编辑:这个答案感觉好一点,仍然使用相同的正则表达式方法:

import re

patt = re.compile(r'000+')
off_states = patt.findall(''.join([str(i) for i in machine])

for s in off_states:
     print(s)

输出:

> 000000
> 0000000
> 00000000
> 0000000

然后我们可以将机器拆分为这些关闭状态,并计算产生的“开启”状态的数量:

on_states = patt.split(''.join([str(i) for i in machine])

输出:

> ['', '111110111', '1110011111111', '111011111111', '']

state_changes = len(matches) + len([i for in in on_states if i != '']))

这给出了所需的总状态7,如果需要,我们可以减去 1 以获得更改的数量。


原来的:

好的,所以这感觉有点骇人听闻,但在我对您的样本数据的测试中,它是有效的。

我们使用正则表达式来查找超过 2 个连续零的出现(即“关闭”状态),然后将其除以整个列表的长度以查找状态更改的数量。

import re
pattern = re.compile(r'[0]{3}')
machine = [str(i) for i in machine]
matches = len(patt.findall(''.join(machine))
print(len(machine) // matches)

这给了我7,据我计算,这是正确的状态更改次数。如果有人可以帮助我解释为什么会这样,那就太好了……直觉上这对我来说很有意义,但我无法用言语表达。


推荐阅读