我需要计算布尔值中“ TRUE”的最大周期
我有一个带有几个TRUE序列的布尔系列。我希望能够确定TRUE值的最大周期。
例如:[0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]
我想要一个循环:[10,14]
我的第一种方法是逐个元素比较并获取每个真实值的索引。我看到的问题是,我正在使用相当大的数据集,因此恐怕会花费很长时间。
你们还有其他可行的想法吗?
谢谢:)
答案 0 :(得分:6)
一个无循环的可能解决方案是对连续的createFormControls
或private _createControlsCategories(categories) {
const categoriesGroup: FormGroup = this.filterForm.get('categories') as FormGroup;
categoriesGroup.controls = {};
for (const cat of categories) {
categoriesGroup.addControl(cat.id_remote, new FormControl(false));
}
s进行计数并获得索引最大值,最后为1
s个组的开始添加最大值:
True
使用1
的另一个想法-使用s = pd.Series([0,0,1,1,0,0,0,0,0,0,1,1,1,1,1])
print (s)
a = s == 1
b = a.cumsum()
c = b.sub(b.mask(a).ffill().fillna(0)).astype(int)
print (c)
0 0
1 0
2 1
3 2
4 0
5 0
6 0
7 0
8 0
9 0
10 1
11 2
12 3
13 4
14 5
dtype: int32
m = c.max()
idx = c.index[c == m]
print (idx)
Int64Index([14], dtype='int64')
out = list(zip(idx - m + 1, idx))
print (out)
[(10, 14)]
为组创建列表,并枚举计数器,然后获取最大长度的列表并获取最小和最大索引:
itertools.groupby
答案 1 :(得分:1)
您似乎必须以某种方式遍历整个数据集。但是您不需要每个True值的索引。您只需要最长条形中最后一个的索引即可。
请注意,如果有平局,只会打印最新的。
using (var stream = new MemoryStream())
{
CreateWorkbook(stream);
stream.Seek(0, SeekOrigin.Begin);
var driveItem = await graphClient.Me
.Drive
.Root
.ItemWithPath("SampleWorkbook1.xlsx")
.Content
.Request()
.PutAsync<DriveItem>(stream);
}