resample перед pct_change () и пропущенными значениями

Не ответ на вопрос, но имейте в виду, что вы не должны использовать пакеты «sun» или «com.sun» непосредственно в ваших программах.

См. Почему разработчики не должны писать Программы, которые называют «sun» Packages

Эти пакеты не являются частью общедоступного API стандартной библиотеки Java, и использование их может сделать вашу программу несовместимой с будущими версиями Java или реализациями Java кроме реализации Sun (и есть несколько реализаций других поставщиков, включая Apple, IBM и HP).

2
задан user3225309 21 January 2019 в 09:05
поделиться

2 ответа

Может быть, вы попытаетесь сравнить разницу между последовательными строками, не равными 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 
0
ответ дан ai_learning 21 January 2019 в 09:05
поделиться

Проверьте с помощью 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) в конец, чтобы сделать весь индекс обратно к столбцам

0
ответ дан Wen-Ben 21 January 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: