python - 如何用 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 个关闭周期。在忽略循环中的随机数据错误的情况下,计算这一点的最佳方法是什么。
解决方案
编辑:这个答案感觉好一点,仍然使用相同的正则表达式方法:
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
,据我计算,这是正确的状态更改次数。如果有人可以帮助我解释为什么会这样,那就太好了……直觉上这对我来说很有意义,但我无法用言语表达。
推荐阅读
- php - 如何在 WordPress 页面模板中显示分类的帖子?
- optimization - 多节点 Neo4j 的匹配查询优化
- nginx - 在 nginx 后面设置 mongodb
- c# - 分支执行后如何返回管道根目录?
- google-cloud-platform - 按项目划分的 Google Cloud API 使用数据
- python - 试图在 macos 上使用 pip 安装任何东西,但不能
- ios - 删除服务器/后端帐户后,iOS 订阅会发生什么情况?
- html - 在 html 文件中使用填充进行样式设置
- java - 在 Java 中通过 GridLauncherV3 启动 Selenium Grid
- android - 在 Android studio 3.2 中使用 Build Bundle Option