Преобразование временных рядов на языке Python

#python #pandas #algorithm #numpy

#python #pandas #алгоритм #numpy

Вопрос:

Добрый день! Существует следующий набор данных временных рядов:

 Time Value
1     1
2     1
3     1
4     2
5     2
6     2
7     2
8     3
9     3
10    4
11    4
12    5
  

Мне нужно разделить и сгруппировать данные по значению следующим образом:

 Value   Time start, Time end
1          1        3
2          4        7
3          8        9
4          10       11
5          12       12
  

Как сделать это быстро и в наиболее функциональном стиле программирования на python? Можно использовать различные библиотеки, например pandas, numpy.

Комментарии:

1. Various libraries can be used for example pandas, numpy. — правильно, и что вы выбрали и попробовали?

2. @buran, я думаю, что pandas наиболее подходит для этой цели. Но я ищу самый красивый вариант. Если я добьюсь успеха сам, тогда я отвечу на вопрос

Ответ №1:

Попробуйте с pandas:

 df.groupby('Time')['Value'].agg(['min','max'])
  

Ответ №2:

Мы можем использовать pandas для этого:

Решение:

 data = {'Time': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
    'Value':  [1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5]
    }
df = pd.DataFrame(data, columns= ['Time', 'Value'])
res = df.groupby('Value').agg(['min', 'max'])
f_res = res.rename(columns = {'min': 'Start Time', 'max': 'End Time'}, inplace = False)
print(f_res)
  

Вывод:

             Time         
      Start Time End Time
Value                    
1              1        3
2              4        7
3              8        9
4             10       11
5             12       12
  

Ответ №3:

сначала получите количество значений

 result = df.groupby('Value').agg(['count'])
result.columns = result.columns.get_level_values(1) #drop multi-index
result

       count
Value       
1          3
2          4
3          2
4          2
5          1
  

затем cumcount, чтобы начать время

 s = df.groupby('Value').cumcount()
result["time start"] = s[s == 0].index.tolist()
result

       count  time start
Value                   
1          3           0
2          4           3
3          2           7
4          2           9
5          1          11
  

наконец,

 result["time start"]  = 1
result["time end"] = result["time start"]   result['count'] - 1
result

       count  time start  time end
Value                             
1          3           1         3
2          4           4         7
3          2           8         9
4          2          10        11
5          1          12        12