如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]

Posted

技术标签:

【中文标题】如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]【英文标题】:How do I create a while loop for this df that has moving average in every stage? [duplicate] 【发布时间】:2021-12-26 05:19:35 【问题描述】:

因此,我想通过查看平均销售额来逐一分配组中每个 ID 的发货量,以确定将其提供给谁。

这是我的数据框:

ID   STOREID    BAL       SALES   SHIP
1     STR1      50        5       18
1     STR2      6         7       18
1     STR3      74        4       18
2     STR1      35        3       500
2     STR2      5         4       500
2     STR3      54        7       500

当 SHIP(按 ID 分组)大于 0 时,计算 AVG (BAL/SALES),每组的最低 AVG 为其 BAL 列 +1,其最终列 +1。然后重复这个过程,直到 SHIP 为 0。每个阶段的 AVG 都会不同,这就是我希望它是一个 while 循环的原因。

第一轮的样本输出如下。所以这样做直到 SHIP 为 0 并且每个 ID 的最终总和 = 到 SHIP:

ID   STOREID   BAL   SALES  SHIP   AVG        Final
1    STR1      50    5      18     10         0
1    STR2      6     4      18     1.5        1
1    STR3      8     4      18     2          0
2    STR1      35    3      500    11.67      0
2    STR2      5     4      500    1.25       1
2    STR3      54    7      500    7.71       0

我在 SQL 中尝试了几种方法,我认为在 python 中这样做会更好,但我的循环并没有做得很好。到目前为止,这是我尝试过的:

df['AVG'] = 0
df['FINAL'] = 0

for i in df.groupby(["ID"])['SHIP']:
    if i > 0:
          df['AVG'] = df['BAL'] / df['SALES']
          df['SHIP'] = df.groupby(["ID"])['SHIP']-1
          total = df.groupby(["ID"])["FINAL"].transform("cumsum")
          df['FINAL'] = + 1
          df['A'] = + 1
    else:
         df['FINAL'] = 0

【问题讨论】:

您能解释一下您所说的“所以我想将每个 ID 的货件一个一个地分配到组中”是什么意思吗?当示例代码显示整数值时,为什么在预期输出中将 [Final] 列显示为 x?您可以使用不同的数据结构进行迭代计算吗? 所以在最后一列中,我试图通过查看最低的 AVG 列一一分配整个 FINAL 列的 SHIP。我只是使用 X 作为值的占位符。我会编辑它。 【参考方案1】:

这很有挑战性,因为组中的多行可以有相同的平均计算。然后它会抛出分配。

如果我理解正确的话,这适用于示例数据框。

d = 'ID': [1, 1, 1, 2,2,2], 'STOREID': ['str1', 'str2', 'str3','str1', 'str2', 'str3'],'BAL':[50, 6, 74, 35,5,54], 'SALES': [5, 7, 4, 3,4,7], 'SHIP': [18, 18, 18, 500,500,500] 
df = pd.DataFrame(data=d)
df['AVG'] = 0
df['FINAL'] = 0

def calc_something(x):
    # print(x.iloc[0]['SHIP'])
    for i in range(x.iloc[0]['SHIP'])[0:500]:
          x['AVG'] = x['BAL'] / x['SALES']
          x['SHIP'] = x['SHIP']-1
          x = x.sort_values('AVG').reset_index(drop=True)
          # print(x.iloc[0, 2])
          x.iloc[0, 2] = x['BAL'][0] + 1
          x.iloc[0, 6] = x['FINAL'][0] + 1
    return x

df_final = df.groupby('ID').apply(calc_something).reset_index(drop=True).sort_values(['ID', 'STOREID'])
df_final

   ID STOREID  BAL  SALES  SHIP    AVG  FINAL
1   1    STR1   50      5     0 10.000      0
0   1    STR2   24      7     0  3.286     18
2   1    STR3   74      4     0 18.500      0
4   2    STR1  127      3     0 42.333     92
5   2    STR2  170      4     0 42.500    165
3   2    STR3  297      7     0 42.286    243

【讨论】:

它实际上给了我不同的输出,我做了完全相同的事情吗?我有相似的 ID(即 1) 抱歉,请不要理解这意味着什么:“我有相似的 ID(即 1)”除非您使用的输入数据帧与上面提供的不同,否则不清楚它有何不同。 是的,我用的完全一样,但是循环搞混了?这是我的数据框: d = 'ID': [1, 1, 1, 2,2,2], 'STOREID': ['str1', 'str2', 'str3','str1', 'str2' , 'str3'],'BAL':[50, 6, 74, 35,5,54], '销售': [5, 7, 4, 3,4,7], 'SHIP': [18, 18 , 18, 500,500,500] df = pd.DataFrame(data=d) 当我尝试运行代码时,我得到了 5 行的输出,所有 ID 都为 1,似乎所有 SHIP 都分配给了最小的 avg 而不是散布 用您的数据再次运行它并获得相同的正确结果。您没有移动或添加列? .iloc[0, 2] 很挑剔。寻找特定的行/列。不幸的是,很难说为什么它不适合你。

以上是关于如何为这个在每个阶段都有移动平均线的 df 创建一个 while 循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 RHEV-M 安装配置一个离线的软件存储仓库(REPOSITORY)

Pandas:通过从列表的字典映射创建一列

如何为 Azure Pipelines 中的每个阶段使用不同的服务连接?

我想创建一项服务,允许我公司的产品仅为客户拥有的产品移动页面

Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?

如何为Laravel中的每个会话设置不同的到期时间?