Как выполнить итерацию по строкам определенных столбцов в панде, чтобы выполнить калькуляцию - PullRequest
0 голосов
/ 18 мая 2018

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

Ниже приведены данные за 3 дня для одного SKU из одного склада

ActivityDate    DepotName   Company SKU  Balance    Demand
1/10/2017       Depot1         A    SKU1    10         1
2/10/2017       Depot1         A    SKU1     9         1
3/10/2017       Depot1         A    SKU1     8         1
4/10/2017       Depot1         A    SKU1     7         1

Я хочу рассчитатьстраховой запас на каждый день и формула:

Страховой запас на 1 октября = Спрос (1-й октябрь + 2-й октябрь + 3-й октябрь) / Баланс (1 октября)

Мой первый вопрос

Как рассчитать страховой запас на каждый день?

Ответ, который я ищу:

   ActivityDate   DepotName   Company   SKU  Balance    Demand     SS
    1/10/2017       Depot1         A    SKU1    10         1      0.30
    2/10/2017       Depot1         A    SKU1     9         1      0.33
    3/10/2017       Depot1         A    SKU1     8         1
    4/10/2017       Depot1         A    SKU1     7         1

Большой набор данных имеет весь спрос и остаток на складедля разных SKU и для различных складов, и это будет выглядеть как

Date       DepotName    Company SKU   Stock Sales
1/10/2017   Depot1         A    SKU1    10  1
1/10/2017   Depot1         A    SKU2    20  1
1/10/2017   Depot1         A    SKU3    30  1
2/10/2017   Depot1         A    SKU1    9   1
2/10/2017   Depot1         A    SKU2    19  1
2/10/2017   Depot1         A    SKU3    29  1
3/10/2017   Depot1         A    SKU1    8   1
3/10/2017   Depot1         A    SKU2    18  1
3/10/2017   Depot1         A    SKU3    28  1

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

PS: Для понимания я не включил данные других складов и других компаний.

Я надеюсь, что смогу использовать этот ответ для реализации на уровне компании и депо.

Редактировать 1:

Просто, чтобы показать вам мои реальные данные, похоже, что

Date       DepotName    Company SKU   Stock Sales
1/10/2017   Depot1         A    SKU1    10  4
1/10/2017   Depot1         A    SKU2    20  5
1/10/2017   Depot1         A    SKU3    30  6
1/10/2017   Depot2         B    SKU4    10  4
1/10/2017   Depot2         B    SKU5    20  5
1/10/2017   Depot2         B    SKU6    30  6
1/10/2017   Depot3         C    SKU7    10  4
1/10/2017   Depot3         C    SKU8    20  5
1/10/2017   Depot3         C    SKU9    30  6
2/10/2017   Depot1         A    SKU1    9   1
2/10/2017   Depot1         A    SKU2    19  1
2/10/2017   Depot1         A    SKU3    29  1
2/10/2017   Depot2         B    SKU4    10  4
2/10/2017   Depot2         B    SKU5    20  5
2/10/2017   Depot2         B    SKU6    30  6
2/10/2017   Depot3         C    SKU7    10  4
2/10/2017   Depot3         C    SKU8    20  5
2/10/2017   Depot3         C    SKU9    30  6
3/10/2017   Depot1         A    SKU1    8   1
3/10/2017   Depot1         A    SKU2    18  1
3/10/2017   Depot1         A    SKU3    28  1
3/10/2017   Depot2         B    SKU4    10  4
3/10/2017   Depot2         B    SKU5    20  5
3/10/2017   Depot2         B    SKU6    30  6
3/10/2017   Depot3         C    SKU7    10  4
3/10/2017   Depot3         C    SKU8    20  5
3/10/2017   Depot3         C    SKU9    30  6

Склады, компании и SKU имеют много категорий

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

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Мне удалось обойти этот вопрос.

Сначала я отсортировал записи по дате

df.sort_values('Date',inplace=True)

Затем я использовал комбинацию groubyby и rolling.

Группировка по категориальным атрибутам и прокатка по датамс суммированием продаж.

Я полностью перевернул все, чтобы сделать скользящую сумму вперед.

df1 = (df.iloc[::-1]
        .groupby(['DepotName','Company','SKU'],sort=False)
        .rolling(7, on='Date',min_periods=0).Sales
        .sum()
        .iloc[::-1])

Затем я объединяю оба кадра данных

df = df.merge(df1, on=['Date','DepotName','Company','SKU'], how='left')

Затем после этогоЯ сделал расчет страхового запаса.

ss3['SafetyStock']=ss3['7DaysSum']/ss3['Stock']
0 голосов
/ 18 мая 2018

Отвечая на ваш первый вопрос, вы можете использовать pd.Series.rolling().

Начиная с

z = io.StringIO("""\
ActivityDate    DepotName   Company SKU  Balance    Demand
1/10/2017       Depot1         A    SKU1    10         1
2/10/2017       Depot1         A    SKU1     9         1
3/10/2017       Depot1         A    SKU1     8         1
4/10/2017       Depot1         A    SKU1     7         1""")

df = pd.read_table(z, delim_whitespace=True)

Вы можете сделать

df.Demand[::-1].rolling(3).sum()[::-1]/df.Balance

который дает

0    0.300000
1    0.333333
2         NaN
3         NaN
dtype: float64

Для вашего полного df, вы можете использовать groupby до применения rolling суммы.

Итак, начинаяот

z2 = io.StringIO("""\
Date       DepotName    Company SKU   Stock Sales
1/10/2017   Depot1         A    SKU1    10  1
1/10/2017   Depot1         A    SKU2    20  1
1/10/2017   Depot1         A    SKU3    30  1
2/10/2017   Depot1         A    SKU1    9   1
2/10/2017   Depot1         A    SKU2    19  1
2/10/2017   Depot1         A    SKU3    29  1
3/10/2017   Depot1         A    SKU1    8   1
3/10/2017   Depot1         A    SKU2    18  1
3/10/2017   Depot1         A    SKU3    28  1""")

df = pd.read_table(z2, delim_whitespace=True)

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

df.groupby("SKU").Sales.rolling(3).sum()

и первое значение в серии ваших акций (т.е. ваш знаменатель)

df.groupby("SKU").Stock.apply(list).apply(lambda k: k[0])

Затем просто разделите эти значения, чтобы получить

(df.groupby("SKU").Sales.rolling(3).sum()/df.groupby("SKU").Stock.apply(list).apply(lambda k: k[0]))[::-1]

SKU    
SKU3  8    0.10
      5     NaN
      2     NaN
SKU2  7    0.15
      4     NaN
      1     NaN
SKU1  6    0.30
      3     NaN
      0     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...