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

У меня есть такой фрейм данных

x = pd.DataFrame({'a':[1.1341, 1.13421, 1.13433, 1.13412, 1.13435, 1.13447, 1.13459, 1.13452, 1.13471, 1.1348, 1.13496,1.13474,1.13483,1.1349,1.13502,1.13515,1.13526,1.13512]})

Как мы можем разделить эту серию, чтобы получить следующий вывод так, чтобы минимальная разница была не менее 0,0005

x['output'] =  [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0]

enter image description here

Ответы [ 2 ]

2 голосов
/ 28 сентября 2019

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

x = x.assign(output=0)  # Initialize all the output values to zero.
x['output'].iat[0] = 1
threshold = 0.0005
prior_val = x['a'].iat[0]
for n, val in enumerate(x['a']):
    if abs(val - prior_val) >= threshold:
        x['output'].iat[n] = 1
        prior_val = val  # Reset to new value found that exceeds threshold.
0 голосов
/ 29 сентября 2019

Вот моя попытка с большинством векторизации и рекурсивной функцией.

Рекурсивная функция создает однострочный кадр данных, отправляемый вызывающей стороне и объединяющий в конце основной функции.

Используется целочисленный тип, который можно добавлять в панды в версии 0.24.

Редактировать : Это решение в десятый раз медленнее, чем в случае с циклами.Вы не должны использовать его.

import pandas as pd


def find_next_step(df, initial_value, threshold):
    try:
        following_index = (
            df.loc[lambda x: (x['a'] - initial_value).abs() >= threshold]
            .loc[:, 'a']
            .index[0]
        )
    except IndexError:
        return []
    to_append = find_next_step(
        df.loc[following_index + 1:, :], x.loc[following_index, 'a'], threshold
    )
    to_append.append(
        pd.DataFrame({'output': [1]}, index=[following_index], dtype=pd.Int64Dtype())
    )
    return to_append


if __name__ == '__main__':
    x = pd.DataFrame({'a':[1.1341, 1.13421, 1.13433, 1.13412, 1.13435, 1.13447, 1.13459, 1.13452, 1.13471, 1.1348, 1.13496,1.13474,1.13483,1.1349,1.13502,1.13515,1.13526,1.13512]})
    output_list = find_next_step(x.iloc[1:, :], x.loc[:, 'a'].iloc[0], 0.0005)
    output_list.append(pd.DataFrame({'output': [1]}, index=[0], dtype=pd.Int64Dtype()))
    output_series = pd.concat(
        [x, pd.concat(output_list).sort_index()], axis='columns'
    ).assign(output=lambda x: x['output'].fillna(0))

Это работает на вашем примере, это печатает:

          a  output
0   1.13410       1
1   1.13421       0
2   1.13433       0
3   1.13412       0
4   1.13435       0
5   1.13447       0
6   1.13459       0
7   1.13452       0
8   1.13471       1
9   1.13480       0
10  1.13496       0
11  1.13474       0
12  1.13483       0
13  1.13490       0
14  1.13502       0
15  1.13515       0
16  1.13526       1
17  1.13512       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...