разница в стоимости предыдущего часа - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь получить разницу между значением текущего и последнего часа.

То, что я делаю, это получение среднего значения за последний час и вычитание, но я делаю вычитание для всех значений, а не для этого конкретного часа.

Вот мойdf:

timestamp       id  value
0 2019-11-04 14:00:10.432783  device1   3000
1 2019-11-04 12:20:03.946156  device1   6000
2 2019-11-04 11:19:03.946156  device1   1000
3 2019-11-04 10:19:03.946156  device1   4000
4 2019-11-04 09:19:03.946156  device2   1000
5 2019-11-04 08:19:03.946156  device2   4000

Вот что я пытаюсь сделать:

Expected 
                 timestamp       id     value       finalvalue
0 2019-11-04 13:00:10.432783  device1     3000         -500
1 2019-11-04 12:30:03.946156  device1     6000         5000
2 2019-11-04 12:15:03.946156  device1     1000         -3000
3 2019-11-04 11:15:00.946156  device1     4000         3000
4 2019-11-04 10:20:03.946156  device1     1000         NaN

Вот мой код:

today = dt.datetime.utcnow()
prev_hour = today - timedelta(hours=1)
prev_hour_top_window = prev_hour + timedelta(minutes=1)
prev_hour_bot_window = prev_hour - timedelta(minutes=1)
prev_hour_values = df.loc[(df['timestamp'] >= prev_hour_bot_window) &(df['timestamp'] <= prev_hour_top_window)]
prev_hour_values_mean = prev_hour_values.mean()
df['finalvalue'] = df['value'] - prev_hour_values_mean

1 Ответ

0 голосов
/ 06 ноября 2019

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

                        timestamp id_device  value
    0  2019-11-04 14:00:10.432783   device1   3000
    1  2019-11-04 14:00:03.946156   device1   4000
    2  2019-11-04 12:20:03.946156   device1   6000
    3  2019-11-04 11:11:03.940150   device1   1500
    4  2019-11-04 11:19:03.946156   device1   1000
    5  2019-11-04 10:19:03.946156   device1   4000
    6  2019-11-04 09:19:03.946156   device2   1000
    7  2019-11-04 08:19:03.946156   device2   4000
    8  2019-11-04 08:22:01.946156   device2   2000

Вы заметите, что я трансформировал фрейм данных много раз и использовал разные имена. Это потому, что я не люблю перезаписывать исходные данные (в случае отступления)

Первая копия - это dataframe df2, для операций datetime. Мое намерение состоит в том, чтобы иметь возможность группировать по id_device и часам.

    import datetime

    df2['timestamp'] = pd.to_datetime(df2['timestamp']) # make sure it's datetime formatted
    df2['hour'] = df['timestamp'].dt.floor('h')         # last useful data
    df2.drop(['timestamp'], axis=1)                     # get rid off timestamp

    #groupby and mean delivered to dataframe df_result
    df_result = df2.groupby(['hour','id_device'])['value'].mean().reset_index(name='mean')

                      hour id_device  mean
    0 2019-11-04 08:00:00   device2  3000
    1 2019-11-04 09:00:00   device2  1000
    2 2019-11-04 10:00:00   device1  4000
    3 2019-11-04 11:00:00   device1  1250
    4 2019-11-04 12:00:00   device1  6000
    5 2019-11-04 14:00:00   device1  3500

Первое значение не имеет предыдущего значения для вычитания, поэтому оно равно 0. Если вы предпочитаете, вы можете сохранить значения в объекте списка, вВ этом случае вычтите.

    deduct = []
    for i in range(len(df_result.index)):

         if i == 0:
           print(0)
           #deduct.append(0)
         else:
           print(df_result['mean'][i]-df_result['mean'][i-1])
           #deduct.append(df_result['mean'][i]-df_result['mean'][i-1])

Выход:

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