Манипулирование данными на основе значения трендов - PullRequest
0 голосов
/ 14 ноября 2018

Учитывая набор данных со столбцами «Дата» и «Значение», мне нужно найти лучшее решение для сегментирования данных по дате на основе тенденций в столбце «Значение». Мой вывод должен быть CSV-файл со столбцами: StartDate, EndDate, StartValue, EndValue. Дата начала и окончания определяют границы сегмента. Краткий пример представлен: входные данные:

 **Date**        **Value**
  01/01/2014        10
  01/02/2014        5
  01/03/2014        5
  01/04/2014        0

выход:

 **StartDate**   **EndDate**   **StartValue**   **EndValue**
   01/01/2014      01/15/2014        10              5
   01/16/2014      02/03/2014         5              5
   02/04/2014      03/10/2014         5              4

1 Ответ

0 голосов
/ 04 января 2019

Подход, использующий pandas.DataFrame.shift ( документы ).

Сначала я создам кадр данных с некоторыми данными:

import pandas as pd
datelist = pd.date_range('1/1/2019', periods=100).tolist()
values = np.random.randint(1, 5, 100)
df = pd.DataFrame({'Date': datelist, 'Value': values})
df = df.set_index('Date')
df.head(10)

Date        Value
2019-01-01  1
2019-01-02  4
2019-01-03  2
2019-01-04  2
2019-01-05  2
2019-01-06  3
2019-01-07  2
2019-01-08  2
2019-01-09  3
2019-01-10  2

Удаляем непрерывно повторяющиеся строки:

df = df.loc[df.Value.shift() != df.Value]

Date        Value
2019-01-01  2
2019-01-02  1
2019-01-04  2
2019-01-05  3
2019-01-06  1

Сброс индекса (если столбец Date является индексом в исходных данных):

df = df.reset_index()

Переименуйте существующие столбцы в начальные столбцы.

df.columns = ['Start_Date', 'Start_Value']

Создание конечных столбцов путем смещения начальных столбцов назад на одну строку.

df['End_Date'] = df.Start_Date.shift(-1)
df['End_Value'] = df.Start_Value.shift(-1)

Удаление NaN (последняя строка кадра данных из-за shift(-1).

df = df.dropna()

Установите тип End_Value на int (если предпочитаете).

df['End_Value'] = df['End_Value'].astype(int)
df.head(10)

    Start_Date  Start_Value End_Date    End_Value
0   2019-01-01  1           2019-01-02  4
1   2019-01-02  4           2019-01-03  2
2   2019-01-03  2           2019-01-06  3
3   2019-01-06  3           2019-01-07  2
4   2019-01-07  2           2019-01-09  3
5   2019-01-09  3           2019-01-10  2
6   2019-01-10  2           2019-01-11  1
7   2019-01-11  1           2019-01-12  2
8   2019-01-12  2           2019-01-15  1
9   2019-01-15  1           2019-01-16  4

Создайте файл CSV из фрейма данных:

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