Не ответ на вопрос, но имейте в виду, что вы не должны использовать пакеты «sun» или «com.sun» непосредственно в ваших программах.
См. Почему разработчики не должны писать Программы, которые называют «sun» Packages
Эти пакеты не являются частью общедоступного API стандартной библиотеки Java, и использование их может сделать вашу программу несовместимой с будущими версиями Java или реализациями Java кроме реализации Sun (и есть несколько реализаций других поставщиков, включая Apple, IBM и HP).
Может быть, вы попытаетесь сравнить разницу между последовательными строками, не равными 1 дню, а затем измените pct_change.
df= df.groupby(['cust', 'group', 'date'])\
.agg({'val':'sum','date':[min,max]}).reset_index()
df.columns = ['%s%s' % (a, '_%s' % b if b else '') for a, b in df.columns]
df['date_diff']=df['date'].diff()
df['pct_change_val']=df.val_sum.pct_change()
df['pct_change_final'] = df.apply(lambda row: np.NaN if pd.isnull(row.date_diff) \
else np.NaN if row.date_diff != np.timedelta64(1, 'D') else row.pct_change_val ,axis=1)
#output:
cust group date date_min date_max val_sum date_diff pct_change_val pct_change_final
0 A G1 2019-01-01 2019-01-01 2019-01-01 11
1 A G1 2019-01-02 2019-01-02 2019-01-02 12 1 days 00:00:00.000000000 0.09090909090909083 0.09090909090909083
2 A G1 2019-01-04 2019-01-04 2019-01-04 14 2 days 00:00:00.000000000 0.16666666666666674
3 B G2 2019-01-01 2019-01-01 2019-01-01 11 -3 days +00:00:00.000000000 -0.2142857142857143
4 B G2 2019-01-03 2019-01-03 2019-01-03 13 2 days 00:00:00.000000000 0.18181818181818188
5 B G2 2019-01-06 2019-01-06 2019-01-06 16 3 days 00:00:00.000000000 0.23076923076923084
Проверьте с помощью groupby
, затем вам нужно сначала resample
и получить изменение pct с помощью логической маски, так как pct_change будет игнорировать NaN
d={}
for x, y in df.groupby(['cust', 'group']):
s=y.set_index('date').resample('D').val.mean()
d[x]=pd.concat([s,s.pct_change().mask(s.shift().isnull()|s.isnull())],1)
newdf=pd.concat(d)
newdf.columns=['val','pct']
newdf
Out[651]:
val pct
date
A G1 2019-01-01 11.0 NaN
2019-01-02 12.0 0.090909
2019-01-03 NaN NaN
2019-01-04 14.0 NaN
B G2 2019-01-01 11.0 NaN
2019-01-02 NaN NaN
2019-01-03 13.0 NaN
2019-01-04 NaN NaN
2019-01-05 NaN NaN
2019-01-06 16.0 NaN
. Вы можете добавить reset_index (inplace = True) в конец, чтобы сделать весь индекс обратно к столбцам