Панды: процентное изменение в виде столбца от первого значения, если дата отличается в индексе даты и времени - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть пандас с таким же датой, где столбец datetime является индексом:

                         volume 
2018-04-08 15:52:26.110     43   
2018-04-08 15:53:26.110     17  
2018-04-08 15:54:26.110     10  
2018-04-09 12:40:35.877     15  
2018-04-09 12:41:35.877     16 

Мое требование - добавить еще один столбец VolumePercentage, где он вычисляет процентное изменение от определенного значения, которое является предыдущим значением 1-гозначение в группе.

Требуемый выход:

                         volume  PercentVolume
2018-04-08 15:52:26.110     43       NaN (No previous)
2018-04-08 15:53:26.110     17       NaN
2018-04-08 15:54:26.110     10       NaN
2018-04-09 12:40:35.877     15       50% (from 10)
2018-04-09 12:41:35.877     16       60% (from 10)

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Да, вы можете достичь этого, как показано ниже, что аналогично предложению @Anna, код показан ниже:

import pandas as pd

df = pd.DataFrame([['2018-04-08 15:52:26.110', 43],
                   ['2018-04-08 15:53:26.110', 17],
                   ['2018-04-08 15:54:26.110', 10],
                   ['2018-04-09 12:40:35.877', 15],
                   ['2018-04-09 12:41:35.877', 16]], columns=['Date', 'Volume'])

df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Vol%'] = df['Volume'].shift(1)

def VolumePercent(dfg):
    dfg['Vol%'] = (dfg['Volume'] - dfg['Vol%'].iloc[0]) * 100.0 / dfg['Vol%'].iloc[0]
    return dfg

df = df.groupby(['Date'], as_index=False).apply(VolumePercent)
print(df)

и выдает результат, как показано ниже:

         Date  Volume  Vol%
0  2018-04-08      43   NaN
1  2018-04-08      17   NaN
2  2018-04-08      10   NaN
3  2018-04-09      15  50.0
4  2018-04-09      16  60.0
0 голосов
/ 14 сентября 2018

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

Данные:

data = pd.DataFrame(columns=['date', 'volume'],
                    data = [['2018-04-08 15:52:26.110', 43],
                            ['2018-04-08 15:53:26.110', 17],
                            ['2018-04-08 15:54:26.110', 10],
                            ['2018-04-09 12:40:35.877', 15],
                            ['2018-04-09 12:41:35.877', 16]])
data.date = pd.to_datetime(data.date)
data.date = data.date.dt.day

Код:

data['PercentVolume'] = data.volume.shift(1)

def func(df):
    m = df.PercentVolume.values[0]
    df.PercentVolume = (df.volume - m) / m * 100
    return df

data = data.groupby('day').apply(func)

Вывод:

                     date  volume  day  PercentVolume
0 2018-04-08 15:52:26.110      43    8            NaN
1 2018-04-08 15:53:26.110      17    8            NaN
2 2018-04-08 15:54:26.110      10    8            NaN
3 2018-04-09 12:40:35.877      15    9           50.0
4 2018-04-09 12:41:35.877      16    9           60.0

Это то, что вы хотите?Надеюсь, это поможет.

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