【问题标题】:Why is Pandas not adding two columns at the same time here?为什么 Pandas 不在这里同时添加两列?
【发布时间】:2018-03-09 14:17:05
【问题描述】:

我目前正在开发一个“restocker”模拟器,它从与实际不同的库存位置开始,接收实际销售的每日输入,并且必须执行 3 项任务:

  • 在今天销售后更新所有商店所有商品的库存状况
  • 验证当前库存头寸是否已达到“重新库存点”(全部库存头寸的 85%)
  • 计算LEAD_TIME 之后所有商店的所有商品的补货(每个商店都有不同的LEAD_TIME

首先,我将列出你们需要了解的所有概念:

  • GRID - 可以描述为“股票目标”的最大股票头寸。 在运营的第一天,库存仓位等于GRID,补货将始终尝试将库存仓位恢复到GRID

  • 为简化起见,我们将使用固定的 GRID,但实际上该 GRID 应该是动态的,并在每次补货后重新计算

  • SIM_SALES = SALES

  • SIM_STOCK(day n) = SIM_STOCK(day n-1) - SALES(day n) + RESTOCK(day n)

  • 如果 SIM_STOCK - SALES <= 0 ,则当天的 SALES 也将被假定为零。

DataFrame 的结构类似于这样(例如 ONE ITEM - ONE STORE)并包含实际值:

INDEX      ITEM     STORE   STOCK(UN)   SALES(UN)   DAY     LEAD_TIME    GRID   
0          4058855  1000    173         0           1       5            55
1          4058855  1000    172         1           2       5            55
2          4058855  1000    163         9           3       5            55
3          4058855  1000    149         14          4       5            55

类似地,我们的模拟网格在第一天会是这样的:

INDEX      ITEM     STORE   STOCK(UN)   SALES(UN)   DAY     LEAD_TIME    GRID      KEY      RESTOCK      COUNTER    
 0         4058855  1000    55          0           1       5            55        False    0            0
 1         4058855  1000    0           0           2       5            55        False    0            0
 2         4058855  1000    0           0           3       5            55        False    0            0
 3         4058855  1000    0           0           4       5            55        False    0            0

我正在寻找的是:

INDEX      ITEM     STORE   SIM_STOCK(UN)   SIM_SALES(UN)   DAY     LEAD_TIME    GRID      KEY      RESTOCK      COUNTER    
0          4058855  1000    55              0               1       5            55        False    0            0
1          4058855  1000    54              1               2       5            55        False    0            0
2          4058855  1000    45              9               3       5            55        True     0            5
3          4058855  1000    31              14              4       5            55        True     0            4
4          4058855  1000    24              7               5       5            55        True     0            3
5          4058855  1000    15              9               6       5            55        True     0            2
6          4058855  1000    19              6               7       5            55        True     10           1
7          4058855  1000    11              8               8       5            55        True     0            5
8          4058855  1000    3               8               9       5            55        True     0            4

我已经通过 3 个步骤提出了解决方案:

  • 将所有值(Stock、Sales、Key 和 Counter)保存在字典中。
  • 在当天销售后更新所有值
  • 重新计算所有字典值

由于代码繁琐复杂,我把整个笔记本发了where(里面有一个csv文件)

但重要的是,这是我得到的实际 DataFrame

INDEX      ITEM     STORE   SIM_STOCK(UN)   SIM_SALES(UN)   DAY     LEAD_TIME    GRID      KEY      RESTOCK      COUNTER    
0          4058855  1000    55              0               1       5            55        False    0            0
1          4058855  1000    54              1               2       5            55        False    0            0
2          4058855  1000    45              9               3       5            55        True     0            5
3          4058855  1000    31              14              4       5            55        True     0            4
4          4058855  1000    24              7               5       5            55        True     0            3
5          4058855  1000    15              9               6       5            55        True     0            2
6          4058855  1000    9               6               7       5            55        True     10           1
7          4058855  1000    1               8               8       5            55        True     0            5
8          4058855  1000    1               0               9       5            55        True     0            4

除了添加RESTOCK 之外,代码正在做所有事情。这是我添加RESTOCK并减去SALES的代码部分:

DF['SIM_STOCK'] = DF.apply(lambda row:(dict_est[(row['ITEM'],row['STORE'],row['DAY']-1)]
                                          -row['SIM_SALES']
                                          +row['RESTOCK']) 
                              if row['DAY'] == CURRENT_DAY 
                              else row['SIM_STOCK'], 
                              axis=1)

如果两个操作都发生在同一行代码中,Pandas 怎么会做减法而不是加法?

【问题讨论】:

    标签: python pandas stock


    【解决方案1】:

    我不确定您的代码为什么不起作用,但是有一种更好的矢量化方式来执行您希望执行的计算。此方法也可以解决您的问题。

    DF['DICT_KEY'] = list(zip(DF['ITEM'], DF['STORE'], DF['DAY']-1))
    
    DF['SIM_STOCK'] = np.where(DF['DAY'] == CURRENT_DAY,
                               DF['DICT_KEY'].map(dict_est) - DF['SIM_SALES'] + DF['RESTOCK'],
                               DF['SIM_STOCK'])
    

    说明

    • 创建一个由元组组成的pd.Series,然后将其作为键提供给 dict_est.
    • 使用np.where 指定您的if / else 条件。

    【讨论】:

    • 这实际上快了 40%,但结果是一样的。没有加起来RESTOCK。其他一切正常
    • DF['RESTOCK'].dtype 得到什么?
    • int64。这绝对不是问题
    【解决方案2】:

    问题其实很简单……

    我试图从DF['RESTOCK]列中获取值,如下:

    DF['RESTOCK'] = np.where(DF['COUNTER'] == 1, 
                           DF['DICT_RESTOCK'].map(dict_RST), 
                           0)
    

    DF['COUNTER'] 列在RESTOCKSTOCK 之后更新。

    这是获取价值的正确方法:

    DF['ABAST'] = np.where(((DF['DICT_KEY'].map(dc) == 1)&(DF['DAY'] == DIA_ATUAL))
                           |(DF['COUNTER'] == 1), 
                          DF['DICT_ABAST'].map(dict_abs), 
                          0)
    

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多