Pandas не удалось найти Какие магазины демонстрируют хорошие квартальные темпы роста в 3 квартале, используя DataFrame - PullRequest
1 голос
/ 04 мая 2020

У меня есть датафрейм, я хочу найти, в каком магазине хорошие квартальные темпы роста в 3-м квартале

  Store    Date     Weekly_Sales
0   1   2012-03-31  18951097.69
1   1   2012-06-30  21036965.58
2   1   2012-09-30  18633209.98
3   1   2012-12-31  9580784.77
4   2   2012-03-31  22543946.63
5   2   2012-06-30  25085123.61
6   2   2012-09-30  22396867.61
7   2   2012-12-31  11470757.52 

Мне удалось l oop по всем пунктам и я зашел так далеко, но после этого я не может найти способ. Я думаю, что мне нужно go перейти к следующему значению и получить продажи, а затем добавить его, но я не уверен, как это сделать. Я хочу сравнить индексы 1 и 2 магазина 1 и найти скорость роста, снова делая то же самое для магазина 2, здесь индексы 5 и 6 и т. Д., Так как у меня есть в общей сложности 45 магазинов.

new_df = []
for index, row in monthly_sales.iterrows():
    if index == 1:  ----Not sure what condition to put here 
      q2 = row['Weekly_Sales']
      q3 = row['Weekly_Sales']
      growth_rate = (q3 - q2)/(q2*100)
      new_df.append([row['Store'],growth_rate])
      #print(index, row['Store'],row['Date'], row['Weekly_Sales'])
      #exit;
new_df

Вывод может быть что-то вроде этого

  Store Growth Rate
0   1      6.67890
1   2      5.54327

Я новичок ie до Python и Pandas.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020
#get the quarters into a different column : 
df['Quarter'] = df.Date.dt.quarter
#get the groupings for the percent change from quarters 2 to 3 : 
pct_change = (df.query('Quarter in [2,3]')
              .groupby('Store')
              .Weekly_Sales
              .pct_change()
              .mul(100)
              .dropna()
             )
pct_change

2   -11.426342
6   -10.716535
Name: Weekly_Sales, dtype: float64

#get store number at third quarter:
store = df.loc[df['Quarter']==3,'Store']

2    1
6    2
Name: Store, dtype: int64

#merge the two objects
pd.concat([store,pct_change],axis=1)

    Store   Weekly_Sales
2   1   -11.426342
6   2   -10.716535

Другой подход:

мы знаем, что данные располагаются для каждого магазина, и в каждом магазине по 4 строки, указывающие кварталы ... кварталы 2 и 3 будут по индексам 1 и 2 для каждого сгруппированного магазина:

filtered = (df
             #the nth function allows us to pick rows per group
            .groupby('Store').nth([1,2])
            .pivot(columns='Quarter',values='Weekly_Sales')
            .pct_change(axis=1)
            .mul(100)
            .dropna(axis=1)
            .rename(columns={3:'growth'})
           )

filtered

Quarter growth
Store   
1       -11.426342
2       -10.716535
2 голосов
/ 05 мая 2020

Вы можете попробовать:

df["Date"] = pd.to_datetime(df["Date"])
df["Weekly_Sales"] = pd.to_numeric(df["Weekly_Sales"])


out = df.sort_values(by=["Store", "Date"]) \
        .groupby(["Store"]) \
        .agg(growth_Q3=("Weekly_Sales", lambda x: (x.iloc[2] - x.iloc[1])/(x.iloc[1]) * 100))

Пояснения :

  1. Преобразовать столбцы в соответствующий формат (сделайте, если они не ). Чтобы увидеть формат, вы можете использовать dtypes.

    1. Преобразовать Dates в datetime объект, используя to_datetime
    2. Преобразовать Weekly_Sales в числа c, используя to_numeric
  2. Сортировать значения по Store и Dates, чтобы убедитесь, что даты отсортированы в хронологическом порядке. Мы можем использовать sort_values

  3. Groupby store для вычисления growth_rate для каждого из них

  4. Для каждой группы агрегируйте строки, используя agg, используя нашу пользовательскую функцию агрегирования:

    1. Сначала мы вычисляем скорость роста, используя функцию lambda. Мы используем iloc для выбора значений quarter2 и quarter3. Используемая формула: (Q3-Q2)/Q2 * 100.
    2. Затем мы используем удобную функцию обозначения agg, чтобы переименовать результат в growth_Q3. Мы используем "Weekly_Sales" перед лямбда-выражением, чтобы сказать, что лямбда-функция будет применена к столбцу "Weekly_Sales".

Полный код + иллюстрация :

# Step 1 (Optionnal if types are already correct)
print(df.dtypes)
# Store                    int64
# Date                    object
# Weekly_Sales            object
# dtype: object

df["Date"] = pd.to_datetime(df["Date"])
df["Weekly_Sales"] = pd.to_numeric(df["Weekly_Sales"])
print(df.dtypes)
# Store                    int64
# Date            datetime64[ns]
# Weekly_Sales           float64
# dtype: object

# Step 2 (Optionnal if data already sorted)
print(df.sort_values(by=["Store", "Date"]))
#    Store       Date  Weekly_Sales
# 0      1 2012-03-31   18951097.69
# 1      1 2012-06-30   21036965.58
# 2      1 2012-09-30   18633209.98
# 3      1 2012-12-31    9580784.77
# 4      2 2012-03-31   22543946.63
# 5      2 2012-06-30   25085123.61
# 6      2 2012-09-30   22396867.61
# 7      2 2012-12-31   11470757.52

# Step 4
print(df.sort_values(by=["Store", "Date"])
        .groupby(["Store"])
        .agg(growth_Q3=("Weekly_Sales", lambda x: (x.iloc[2] - x.iloc[1])/x.iloc[1] * 100)))
#        growth_Q3
# Store
# 1     -11.426342
# 2     -10.716535
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...