Как нарисовать временной ряд, который показывает количество изменений в данных? - PullRequest
0 голосов
/ 17 октября 2019

Например, у меня есть такие данные, как:

18:00:00     0
18:00:01    -1
18:00:02    -1
18:00:03    -1
18:00:04     2
18:00:05    -3
18:00:06     1
18:00:07     2
18:00:08     3
18:00:09     4
18:00:10     5
18:00:11     4
18:00:12     3
18:00:13    -1
18:00:14     2
18:00:15     8
18:00:16    11

Я хочу нарисовать волны в соответствии со следующими пунктами:

(-1,18:00:03)
(2,18:00:04)
(-3,18:00:05)
(5,18:00:10)
(-1,18:00:13)
(11,18:00:16)

Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 17 октября 2019

Я тонко понимаю, как подбирать очки. Вы можете использовать groupby для создания групп в зависимости от изменений знаков значений ряда.

Для дифференциации групп вы можете использовать Series.shift + Series.cumsum. Я оставляю деталь результата ряда, который используется для формирования групп.

Затем я создал функцию для получения значений в соответствии с критериями, которые, я думаю, вам нужныпринять и был применен через groupby.apply.

import matplotlib.pyplot as plt
%matplotlib inline
my_serie=pd.Series([0, -1, -1,-1 , 2, -3, 1, 2, 3, 4, 5, 4, 3, -1, 2,8,11],time_serie)

#creating Serie to plot
def get_value(x):
    if len(x)>=3:
        return x.iloc[2]
    elif len(x)>=2:
        return x.iloc[1]
    else:
        return x.iloc[0]
groups=((my_serie.shift()*my_serie)<1).cumsum() 
serie_to_plot=my_serie.groupby(groups).apply(get_value)
#tuple of Serie to plot
s_tuple=(*zip(serie_to_plot,serie_to_plot.index),)
#Show the serie an tuple
print(s_tuple)
print('-'*50)
print(serie_to_plot)

((0, 0), (-1, 1), (2, 2), (-3, 3), (3, 4), (-1, 5), (11, 6))
--------------------------------------------------
0     0
1    -1
2     2
3    -3
4     3
5    -1
6    11
dtype: int64

#Creating figure
plt.figure()
serie_to_plot.plot(figsize=(10,10))
plt.figure()
serie_to_plot.plot(kind='bar',figsize=(10,10))

Выходные изображения:

enter image description here


enter image description here

Деталь

groups

2019-10-18 18:00:00    0
2019-10-18 18:00:01    1
2019-10-18 18:00:02    1
2019-10-18 18:00:03    1
2019-10-18 18:00:04    2
2019-10-18 18:00:05    3
2019-10-18 18:00:06    4
2019-10-18 18:00:07    4
2019-10-18 18:00:08    4
2019-10-18 18:00:09    4
2019-10-18 18:00:10    4
2019-10-18 18:00:11    4
2019-10-18 18:00:12    4
2019-10-18 18:00:13    5
2019-10-18 18:00:14    6
2019-10-18 18:00:15    6
2019-10-18 18:00:16    6
dtype: int64

Другие цифры:

#Creating figure
plt.figure()
serie_to_plot.plot(figsize=(10,10))
serie_to_plot.plot(kind='bar',figsize=(10,10))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...