使用python查找时间序列数据(直线或一维数据)的趋势

2024-09-30 18:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个一维时间序列数据或线。我想知道它的切片趋势是什么。图片: enter image description here

有些板块是相等的,有些是上升趋势,有些是下降趋势。图中绿色标记表示上升趋势,红色标记表示下降趋势

我想要一个列表或数组来显示每个索引在哪个切片中。 例如,我想要这样的东西: [equal,equal,…,up,up,…,down,down] 每个项目只是一个显示其切片方向的标记。例如,如果列表中的第二项是“向上”,这意味着实例被放置在向上趋势的切片中

我试过很多方法,其中最好的是scipy的ArgreExtrema

我使用arglextrema查找局部最大值和最小值,然后按索引中的出现顺序进行比较

from scipy.signal import argrelextrema
d = data['tenkan_sen'].fillna(1)
h1 = d.append(pd.Series([5, 4, 3, 2, 1]), ignore_index=True)
g = argrelextrema(h1.values, np.greater)[0]
l = argrelextrema(h1.values, np.less)[0]
e = argrelextrema(h1.values, np.equal)[0]

extermas = dict()
extermas[0] = 'start'
for item in g:
    extermas[item] = 'greater'
for item in l:
    extermas[item] = 'less'
extermas = dict(sorted(extermas.items()))
idx_extermas = list(extermas.keys())

status = []

for item in range(len(idx_extermas)-1):
    if extermas[idx_extermas[item+1]] == 'less':
        stat = 'down'
    if extermas[idx_extermas[item+1]] == 'greater':
        stat = 'up'
    for _ in range(idx_extermas[item], idx_extermas[item+1]):
        #print(_)
        status.append(stat)
        
#print(len(status))
for item in e:
    #print(item)
    status[item] = 'equal'

此方法无法找到线的结束切片的方向。为了解决这个问题,我已经在行的末尾手动添加了五个点,但它不起作用。 我找了很多东西,但找不到合适的解决办法


Tags: in标记forstatus切片equalitemh1
1条回答
网友
1楼 · 发布于 2024-09-30 18:19:21

首先,如果要平滑数据,请运行

data=np.convolve(data,[1/4,2/4,1/4],"valid")

这将消除噪声,但也会模糊数据,并在这样做时稍微缩小数据。 然后跑

data=np.convolve(data,[1,-1],"valid")
gap=0.1
direction=(data>gap).astype(int)-(data<-gap).astype(int)

这将为您提供一个数组,当数据向上倾斜至少间隙时为1,当向下倾斜时为-1。(通常情况下,在大多数数据集中很少出现完全恒定的情况,您只希望拾取陡坡。) 调整间距,直到只选择所需的陡度

相关问题 更多 >