Суммирование и усреднение за те же дни - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть данные, которые я отсортировал по дням в Excel, и теперь я хочу получить сумму ежедневных доходов за каждый день.Проблема здесь в том, что у меня есть несколько записей для дней.Таким образом, у меня может быть только одна ежедневная запись на 2018-12-05, но 5 записей на 2018-12-06Мне бы хотелось, чтобы я получил только одну запись на 2018-12-06 с совокупным дневным доходом (таким образом, все совокупные доходы сложены вместе) и среднесуточным доходом (таким образом, совокупный доход, деленный на количество записей за день.2018-12-06 это будет разделено на 5).

Итак, данные, которые у меня есть сейчас, выглядят так:

            Dates  Last.Price  Daily.Return
19788  2018-11-23       75.18     -0.001199
19789  2018-11-23      129.04     -0.026490
19790  2018-11-26       77.84     -0.035382
19791  2018-11-26      127.98      0.008215
19792  2018-11-27       79.50     -0.021326
19793  2018-11-27      122.68      0.041413
19794  2018-11-28       80.27     -0.009686
19795  2018-11-29       80.00      0.003364

Окончательный фрейм данных должен выглядеть следующим образом

              Dates  Last.Price  Cum.Return   Average.Return
19788  2018-11-23       75.18     -0.027689    -0.0138445
19790  2018-11-26       77.84     -0.027167    -0.0135835
19792  2018-11-27       79.50      0.020087     0.0100435
19794  2018-11-28       80.27     -0.009686    -0.009686
19795  2018-11-29       80.00      0.003364     0.003364

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

df = pd.read_csv('/Python Test/SP500Acquirer.csv')

def sum_from_days_prior(row, df):
    '''returns sum of values in row month, 
    from all dates in df prior to row date'''

    day = pd.to_datetime(row).day

    all_dates_prior = df[df.index <= row]
    same_day = all_dates_prior[all_dates_prior.index.day == day]

    return same_day["Daily.Return"].sum()


df.set_index('Dates', inplace = True)
df.index = pd.to_datetime(df.index)
df["Dates"] = df.index
df.sort_index(inplace = True)

df["Day"] = df["Dates"].apply(lambda row: sum_from_days_prior (row, df))
df.drop("Dates", axis = 1, inplace = True)

print(df.tail(20))

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

1 Ответ

0 голосов
/ 08 декабря 2018

Я думаю, вам нужно агрегировать по agg с функциями first, sum и mean:

Поскольку столбец Daily.Return является агрегатом по нескольким функциям, определенным в списке, получить MultiIndex в выходных данных.Так что нужно сгладить его - проще всего использовать map с join.

df = df.groupby('Dates').agg({'Last.Price':'first', 'Daily.Return':['mean','sum']})

print (df)
           Last.Price Daily.Return          
                first         mean       sum
Dates                                       
2018-11-23      75.18    -0.013844 -0.027689
2018-11-26      77.84    -0.013583 -0.027167
2018-11-27      79.50     0.010044  0.020087
2018-11-28      80.27    -0.009686 -0.009686
2018-11-29      80.00     0.003364  0.003364

print (df.columns)
MultiIndex(levels=[['Last.Price', 'Daily.Return'], ['first', 'mean', 'sum']],
           labels=[[0, 1, 1], [0, 1, 2]])

df.columns = df.columns.map('_'.join)
print (df)
           Last.Price_first  Daily.Return_mean  Daily.Return_sum
Dates                                                            
2018-11-23             75.18          -0.013844         -0.027689
2018-11-26             77.84          -0.013583         -0.027167
2018-11-27             79.50           0.010044          0.020087
2018-11-28             80.27          -0.009686         -0.009686
2018-11-29             80.00           0.003364          0.003364

Last rename столбцов:

d = {'Last.Price_first':'Last.Price',
     'Daily.Return_sum': 'Cum.Return',
     'Daily.Return_mean': 'Average.Return'}

df = df.rename(columns=d)
print (df)
            Last.Price  Average.Return  Cum.Return
Dates                                             
2018-11-23       75.18       -0.013844   -0.027689
2018-11-26       77.84       -0.013583   -0.027167
2018-11-27       79.50        0.010044    0.020087
2018-11-28       80.27       -0.009686   -0.009686
2018-11-29       80.00        0.003364    0.003364
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...