Рассчитать% продаж, сделанных в выходные дни, по сравнению с общей продажей в неделю pandas и узнать, как обращаться с исключениями, такими как праздничные дни - PullRequest
1 голос
/ 25 февраля 2020

У меня есть DataFrame с ежедневными продажами.

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

Я создал рабочий код в качестве примера ниже. Он работает.

Но:

1) (первый ГЛАВНЫЙ вопрос) Я думаю, что может быть улучшен более Pythoni c, но я не знаю, как

2) ( второстепенный вопрос) В случае выходного дня, когда продажи слишком низкие, или особого праздника, когда продажи слишком высоки, я должен заменить эти выбросы средними или средними значениями?

#Generating a Random Sample
np.random.seed(30)
values=np.random.randint(0,400,14)
day= pd.date_range(start='25/02/2020',periods=14)

#Creating an example DataFrame
df_input={'date':day,"values":values}
df_test=pd.DataFrame(df_input)

#From here starts what I have done on my original code
# week and day of the week are two informatio that I have to retrieve from my
#original DataFrame
#Creating a column with Week and Day Of The Week info
df_test['week']=df_test.date.dt.week
df_test['day']=df_test.date.dt.dayofweek

#Creating a Column for differencing weekend from normal day 
df_test['weekend']=np.zeros(len(df_test))
df_test['weekend'][(df_test.day==5)|(df_test.day==6)]=1

#Grouping on Week to get total sales 
grouped_full=df_test.groupby(['week']).sum()

#Grouping on Week And Weekend to separate normal days from weekend days
grouped=df_test.groupby(['week','weekend']).sum()

#Getting the ratio between 
#the weekend and total weekly sales
#normal days and total weekly sales
ratio=grouped/grouped_full
print(ratio['values'])

Это мой вывод:

week  weekend
9     0.0        0.666667
      1.0        0.333333
10    0.0        0.784127
      1.0        0.215873
11    0.0        1.000000

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Привет, я бы хотел прокомментировать ответ украинского сержа, но в конечном итоге это невозможно из-за правила репутации 50 очков, но мне все равно, и я все равно хочу внести свой вклад.

Я хотел бы отметить что технически ваш ответ отвечает только на последнюю часть вопроса:

Я хочу создать KPI, чтобы понять, как продажи в выходные дни влияют на еженедельные продажи и как обычные дни влияют на еженедельные продажи

действительно, группируя по тому же номеру недели, мы создаем KPI с причинно-следственной связью Weekdays -> Weekend, в то время как для обратного мы должны использовать:

# group and use mean
weekdays = (df_test[df_test.date.dt.weekday.isin([0,1,2,3,4])]
                .groupby(df_test.date.dt.week)
                .mean())
# group and use mean
weekends = (df_test[df_test.date.dt.weekday.isin([5,6])]
                .groupby(df_test.date.dt.week -1 )
                .mean())

, чтобы найти Weekend -> Будущее причинно-следственная связь

1 голос
/ 26 февраля 2020

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

Я ни в коем случае не профессионал, поэтому возьмите все это с крошкой соли:

  1. Я не думаю, что есть более "питон" c "способ сделать свой код. Несмотря на обширность, я могу показать вам, как мой мозг подходил к вашей проблеме, как я ее понял:
import numpy as np
import pandas as pd

#Generating a Random Sample
np.random.seed(30)
values=np.random.randint(0,400,14)
day= pd.date_range(start='25/02/2020',periods=14)

#Creating an example DataFrame
df_input={'date':day,"values":values}
df_test=pd.DataFrame(df_input)

# group and use mean
weekdays = (df_test[df_test.date.dt.weekday.isin([0,1,2,3,4])]
                .groupby(df_test.date.dt.week)
                .mean())
# group and use mean
weekends = (df_test[df_test.date.dt.weekday.isin([5,6])]
                .groupby(df_test.date.dt.week)
                .mean())

# store in dict
d = {'weekdays': weekdays, 'weekends': weekends}

# concat and drop extra level('values')
both = pd.concat(d, axis=1).droplevel(1, axis=1)

# create new column with mean ratio differences
both['weekends_ratio'] = both['weekends'].div(both['weekends']+both['weekdays'])

print(both)
      weekdays  weekends  weekend_ratio
date
9          280     280.0       0.500000
10         247     170.0       0.407674
11          18       NaN            NaN
Я не знаю, поможет ли это, но, возможно, используйте .mean() (как вы видите в моем коде) вместо .sum(), чтобы найти разницу в средних продажах.
0 голосов
/ 29 апреля 2020

Вопрос 1

Возможная альтернатива

# Creating an example DataFrame
np.random.seed(30)
values = np.random.randint(0,400,14)
day = pd.date_range(start='25/02/2020',periods=14)
df_test = pd.DataFrame({'date':day,"values":values})

# Create week, day, weekend
df_test['week'] = df_test['date'].dt.week
df_test['day'] = df_test['date'].dt.dayofweek
df_test['weekend'] = df_test['day'].isin([5,6])# optional --> .astype(int)

# Calculate the metric
df_test_grouped = df_test.groupby(['week', 'weekend'])[['values']].sum()
df_test_grouped.groupby(level=0).apply(lambda x: 100 * x / float(x.sum()))

Вопрос 2
Трудно сказать, это зависит от тип анализа, допущения, которые вы делаете, объем имеющихся у вас данных, масштаб выбросов и т. д. c.
Часто выбросы являются важными числами, а не просто значениями, которые нужно сгладить.
Например, Рождественская неделя может обеспечить 20% годовых продаж определенного товара. Эта неделя просто выброс?

...