найти первые и последние доступные дни месяца в пандах - PullRequest
0 голосов
/ 25 октября 2018

У меня есть данные pandas с 2007 по 2017 год. Данные примерно такие:

date      closing_price
2007-12-03  728.73
2007-12-04  728.83
2007-12-05  728.83
2007-12-07  728.93
2007-12-10  728.22
2007-12-11  728.50
2007-12-12  728.51
2007-12-13  728.65
2007-12-14  728.65
2007-12-17  728.70
2007-12-18  728.73
2007-12-19  728.73
2007-12-20  728.73
2007-12-21  728.52
2007-12-24  728.52
2007-12-26  728.90
2007-12-27  728.90
2007-12-28  728.91
2008-01-05  728.88
2008-01-08  728.86
2008-01-09  728.84
2008-01-10  728.85
2008-01-11  728.85
2008-01-15  728.86
2008-01-16  728.89

Как видите, в каждом месяце не хватает некоторых дней.Я хочу взять первый и последний «доступные» дни каждого месяца, вычислить разницу их закрытия_прайса и поместить результаты в новый фрейм данных.Например, для первого месяца днями будут 2007-12-03 и 2007-12-28, а цены закрытия будут 728,73 и 728,91, поэтому результат будет 0,18.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

вы можете сгруппировать df по месяцам и применить функцию для этого.Обратите внимание на to_period , эта функция преобразует DataFrame из DatetimeIndex в PeriodIndex с желаемой частотой.

def calculate(x):
    start_closing_price = x.loc[x.index.min(), "closing_price"]
    end_closing_price = x.loc[x.index.max(), "closing_price"]
    return end_closing_price-start_closing_price

result = df.groupby(df["date"].dt.to_period("M")).apply(calculate)

# result
date
2007-12    0.18
2008-01    0.01
Freq: M, dtype: float64
0 голосов
/ 25 октября 2018

Сначала убедитесь, что они datetime и отсортированы:

import pandas as pd

df['date'] = pd.to_datetime(df.date)
df = df.sort_values('date')

Groupby

gp = df.groupby([df.date.dt.year.rename('year'), df.date.dt.month.rename('month')])
gp.closing_price.last() - gp.closing_price.first()

#year  month
#2007  12       0.18
#2008  1        0.01
#Name: closing_price, dtype: float64

или

gp = df.groupby(pd.Grouper(key='date', freq='1M'))
gp.last() - gp.first()

#            closing_price
#date                     
#2007-12-31           0.18
#2008-01-31           0.01

Resample

gp = df.set_index('date').resample('1M')
gp.last() - gp.first()

#            closing_price
#date                     
#2007-12-31           0.18
#2008-01-31           0.01
...