gpt4 book ai didi

python - 评估时间序列的频率、持续时间和值

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:20 24 4
gpt4 key购买 nike

我是 python 的新手,有一个简单的问题,我还没有找到答案。假设我有一个 c(t) 的时间序列:

t_  c_
1 40
2 41
3 4
4 5
5 7
6 20
7 20
8 8
9 90
10 99
11 10
12 5
13 8
14 8
15 19

我现在想根据值 c 在特定范围内持续多长时间以及这些时间段出现的频率来评估这个系列。

因此,结果将包括三列:c (binned)、duration (binned)、频率。转换为简单示例,结果可能如下所示:

c_      Dt_  Freq_ 
0-50 8 1
50-100 2 1
0-50 5 1

你能给我一个建议吗?

提前致谢

乌尔里克

//编辑:感谢您的答复!我的示例数据有些缺陷,因此我无法展示我的问题的一部分。所以,这是一个新的数据系列:

series=
t c
1 1
2 1
3 10
4 10
5 10
6 1
7 1
8 50
9 50
10 50
12 1
13 1
14 1

如果我应用下面 Christoph 提出的代码:

bins = pd.cut(series['c'], [-1, 5, 100])
same_as_prev = (bins != bins.shift())
run_ids = same_as_prev.cumsum()
result = bins.groupby(run_ids).aggregate(["first", "count"])

我收到这样的结果:

first   count
(-1, 5] 2
(5, 100] 3
(-1, 5] 2
(5, 100] 3
(-1, 5] 3

但我对这样的东西更感兴趣:

c        length  freq
(-1, 5] 2 2
(-1, 5] 3 1
(5, 100] 3 2

我如何实现这一目标?我如何在 KDE 绘图中绘制它?

最好的,

乌尔里克

最佳答案

很好地提出了一个例子 :)这是一种方法,很可能不完整,但它应该对您有所帮助。

由于您的数据在时间上按固定增量间隔,因此我不实现时间序列并使用索引作为时间。因此,我将 c 转换为数组并使用 np.where() 来查找 bin 中的值。

import numpy as np

c = np.array([40, 41, 4, 5, 7, 20, 20, 8, 90, 99, 10, 5, 8, 8, 19])

bin1 = np.where((0 <= c) & (c <= 50))[0]
bin2 = np.where((50 < c) & (c <= 100))[0]

对于 bin1,输出为 array([ 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14], dtype=int64)它对应于 c 中的值在 bin 中的 idx。

下一步是找到连续的 idx。根据这个 SO post::

from itertools import groupby
from operator import itemgetter

data = bin1
for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
print(list(map(itemgetter(1), g)))

# Output is:
#[0, 1, 2, 3, 4, 5, 6, 7]
#[10, 11, 12, 13, 14]

最后一步:以正确的顺序放置新的子箱,并跟踪哪些箱对应于哪个子箱。因此,完整的代码如下所示:

import numpy as np
from itertools import groupby
from operator import itemgetter

c = np.array([40, 41, 4, 5, 7, 20, 20, 8, 90, 99, 10, 5, 8, 8, 19])

bin1 = np.where((0 <= c) & (c <= 50))[0]
bin2 = np.where((50 < c) & (c <= 100))[0]

# 1 and 2 for the range names.
bins = [(bin1, 1), (bin2, 2)]
subbins = list()

for b in bins:
data = b[0]
name = b[1] # 1 or 2
for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
subbins.append((list(map(itemgetter(1), g)), name))

subbins = sorted(subbins, key=lambda x: x[0][0])

输出:[([0, 1, 2, 3, 4, 5, 6, 7], 1), ([8, 9], 2), ([10, 11, 12, 13 , 14], 1)]

然后,您只需要做您想要的统计数据:)

关于python - 评估时间序列的频率、持续时间和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com