Агрегирование данных временных рядов - PullRequest
1 голос
/ 27 апреля 2020

Я не специалист по данным. Я знаю python, и в настоящее время мне приходится управлять данными временных рядов, поступающими через регулярные промежутки времени. Большая часть этих данных - все нули или значения, которые долгое время были одинаковыми, и для экономии памяти я бы хотел отфильтровать их. Есть ли какой-то стандартный метод для этого (о котором я, очевидно, не подозреваю) или я должен реализовать свой собственный алгоритм?

Я хочу добиться следующего:

interval  value   result
(summed) 
1         0       0
2         0       # removed
3         0       0
4         1       1
5         2       2
6         2       # removed
7         2       # removed
8         2       2
9         0       0
10        0       0

Любая помощь приветствуется !

Ответы [ 4 ]

0 голосов
/ 27 апреля 2020

Спасибо всем! Глядя на ответы, я думаю, что могу сделать вывод, что мне нужно свернуть свои собственные. Я буду использовать ваш вклад в качестве вдохновения. Еще раз спасибо!

0 голосов
/ 27 апреля 2020

Нет быстрого вызова функции, чтобы сделать то, что вам нужно. Ниже приведен один из способов

import pandas as pd

df = pd.DataFrame({'interval':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
             'value':[0, 0, 0, 1, 2, 2, 2, 2, 0, 0]}) # example dataframe


df['group'] = df['value'].ne(df['value'].shift()).cumsum() # column that increments every time the value changes

df['key'] = 1 # create column of ones
df['key'] =  df.groupby('group')['key'].transform('cumsum') # get the cumulative sum 

df['key'] = df.groupby('group')['key'].transform(lambda x: x.isin( [x.min(), x.max()])) # check which key is minimum and which is maximum by group

df = df[df['key']==True].drop(columns=['group', 'key']) # keep only relevant cases

df
0 голосов
/ 27 апреля 2020

Вот код:

l = [0, 0, 0, 1, 2, 2, 2, 2, 0, 0]

for (i, ll) in enumerate(l):
    if i != 0 and ll == l[i-1] and i<len(l)-1 and ll == l[i+1]: 
        continue
    print(i+1, ll)

Он производит то, что вы хотите. Вы не указали формат своих входных данных, поэтому я предположил, что они в списке. Условия ll == l[i-1] и ll == l[i+1] являются ключевыми для пропуска повторяющихся значений.

0 голосов
/ 27 апреля 2020

Вы можете использовать pandas запрос для данных, чтобы достичь этого:

import pandas as pd

matrix = [[1,0, 0],
[2, 0, 0],
[3, 0, 0],
[4, 1, 1],
[5, 2, 2],
[6, 2, 0],
[7, 2, 0],
[8, 2, 2],
[9, 0, 0],
[10,0, 0]]


df = pd.DataFrame(matrix, columns=list('abc'))
print(df.query("c != 0"))
...