Python - получить среднее значение между 2 датами - PullRequest
0 голосов
/ 18 июня 2020

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

На самом деле у меня есть первый xlsx с продажами по магазинам и датам

shop sell date
a    100  2000
a    122  2001
a    300  2002
b    55   2000
b    245  2001
b    1156 2002

И у меня есть еще один файл с датой начала и окончания для каждого магазина

shop start stop
a    2000  2002
a    2000  2001
b    2000  2000

И поэтому я хотел бы получить среднее значение продаж между каждой датой из 2-го файла.

I попробуйте что-то вроде этого, но у меня есть список Df, и он не очень оптимален для меня

dfend = []

for i in df2.values:
    filt1 = df.shop == i[0]
    filt2 = df.date >= i[1]
    filt3 = df.date <= i[2]
    dfgrouped = df.where(filt1 & filt2 & filt3).groupby('shop').agg(mean = ('sell','mean'), begin = ('date','min'), end = ('date', 'max'))
    dfend.append(dfgrouped)

Кто-нибудь может мне помочь?

Большое спасибо

1 Ответ

1 голос
/ 18 июня 2020

merge два DataFrames в «магазине». Затем вы можете проверить условие даты, используя between, чтобы отфильтровать до подсчитываемых строк. Наконец, groupby + sum. (Предполагается, что ваш второй df уникален)

m = df2.merge(df1, how='left')

(m[m['date'].between(m['start'], m['stop'])]
   .groupby(['shop', 'start', 'stop'])['sell'].mean()
   .reset_index())

#  shop  start  stop  sell
#0    a   2000  2001   111
#1    a   2000  2002   174
#2    b   2000  2000    55

Если в df2 есть строки, в которых не будет подходящих строк в df1, вместо этого используйте mask, чтобы они по-прежнему получает строку после groupby (это также причина, по которой df2 является левым DataFrame в слиянии). Здесь я добавил дополнительную строку

print(df2)
#  shop  start  stop
#0    a   2000  2002
#1    a   2000  2001
#2    b   2000  2000
#3    e   1999  2011

m = df2.merge(df1, how='left')

(m.where(m['date'].between(m['start'], m['stop']))
  .groupby([m.shop, m.start, m.stop])['sell'].mean()
  .reset_index())

#  shop  start  stop   sell
#0    a   2000  2001  111.0
#1    a   2000  2002  174.0
#2    b   2000  2000   55.0
#3    e   1999  2011    NaN
...