【问题标题】:Need and Supply Python Algorithm [closed]需要和提供 Python 算法 [关闭]
【发布时间】:2021-12-18 02:56:14
【问题描述】:

我正在从事一个从 SQL 转移到 Python 的分配项目,因为我认为这最好用 Python 来处理。所以我在下面有2张桌子。第一个 NEED TABLE 是我为每个合作伙伴、每个商店提供所需物品的地方,我根据他们需要的数量对它们进行了排名,目标是首先为最需要的商店提供服务。第二个表是我有可用供应数量的地方。

第三个输出表是我对 Python 代码的目标输出。如何在 python 上为此编写一个简短的代码循环以获取输出表? (考虑到有成千上万的合作伙伴 ID 和 ITEM_ID)。我正在考虑 while 语法,但如果您有其他建议,请随时提出!

NEED_TBL

PARTNER_ID ITEM_ID STORE NEED NEED_RANK
1 ID32 621 57 1
1 ID32 321 9 2
1 ID32 315 3 3
1 ID32 732 1 4
2 ID32 443 5 1
2 ID32 321 2 2

SUPPLY_TBL

PARTNER_ID ITEM_ID SUPPLY
1 ID32 57
2 ID32 6

输出表

PARTNER_ID ITEM_ID STORE NEED NEED_RANK RECEIVED_SUPPLY
1 ID32 621 57 1 57
1 ID32 321 9 2 0
1 ID32 315 3 3 0
1 ID32 732 1 4 0
2 ID32 443 5 1 5
2 ID32 321 2 2 1

【问题讨论】:

  • 请附上您尝试过的代码。
  • 所以我的代码是在 SQL 中的,我对如何在 python 上做到这一点不是很熟悉。在 SQL 上,我加入了 NEED 和 SUPPLY 表并创建了一个新表,其中包含比较 IF NEED

标签: python sql while-loop


【解决方案1】:

您可以使用 pandas 来做到这一点:

import pandas as pd
import sqlite3
conn = sqlite3.connect('your_database.db')
df1 = pd.read_sql('SELECT * FROM table1', conn)
df2 = pd.read_sql('SELECT * FROM table2', conn)

df_final = df1.merge(df2, on = ["PARTNER_ID", "ITEM_ID"], how="left")

【讨论】:

  • 是的,我已经这样做了,但我不确定如何计算 RECEIVED_SUPPLY 列
【解决方案2】:
  1. merge 数据框
  2. groupbycumsum 获取每个 PARTNER_ID 和 ITEM_ID 所需的总数量。
  3. 计算供应量并使用clip 限制负值。
merged = need_tbl.merge(supply_tbl, on=["PARTNER_ID", "ITEM_ID"], how="left")
total_need = merged.groupby(["PARTNER_ID", "ITEM_ID"])["NEED"].transform("cumsum")
merged["RECEIVED_SUPPLY"] = (merged["NEED"]-(total_need-merged["SUPPLY"]).clip(0)).clip(0)
merged = merged.drop("SUPPLY", axis=1)

>>> merged

   PARTNER_ID ITEM_ID  STORE  NEED  NEED_RANK  RECEIVED_SUPPLY
0           1    ID32    621    57          1               57
1           1    ID32    321     9          2                0
2           1    ID32    315     3          3                0
3           1    ID32    732     1          4                0
4           2    ID32    443     5          1                5
5           2    ID32    321     2          2                1

【讨论】:

  • 哇,谢谢!我之所以考虑做一个while循环是因为如果有一个额外的供应,我可以平均分配额外的供应。你知道我该如何调整它吗?
  • 请不要在cmets中追问。如果需要,创建一个新帖子。当前问题(如最初发布的)已得到解答
【解决方案3】:

我知道您要求提供 Python 代码,但如果我可以说服您使用 SQL,这里是使用 window function 的尝试

with cte as
(select n.*,
        s.supply,
        sum(n.need) over (partition by n.partner_id, n.item_id order by n.need_rank) as cumulative_need
from need n
join supply s on n.partner_id=s.partner_id and s.item_id=n.item_id)

select partner_id,
       item_id,
       store,
       need,
       need_rank,
       case when supply-cumulative_need >=0 then need
            when need+supply-cumulative_need > 0 then need+supply-cumulative_need 
            else 0 
       end as received_supply
from cte      
order by partner_id, item_id, need_rank asc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2022-11-21
    • 2010-09-25
    • 2023-03-12
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多