创建自定义累积总和,计算给定位置列表及其顺序的下游数量

2024-02-10

我试图想出一些代码,基本上可以计算其下方位置的累积值。采用累积总和几乎可以完成此任务,但某些位置对相同的下游点有贡献。此外,最上游的点(或起始点)不会有任何贡献值,并且可以在最终的累积 DataFrame 中保留其起始值。

假设每个站点都有以下 DataFrame。

df = pd.DataFrame({
"Site 1": np.random.rand(10),
"Site 2": np.random.rand(10),
"Site 3": np.random.rand(10),
"Site 4": np.random.rand(10),
"Site 5": np.random.rand(10)})

我还有一个数据表,其中包含每个站点及其相应的下游组件。

df_order = pd.DataFrame({
    "Site 1": Site 3,
    "Site 2": Site 3,
    "Site 3": Site 4,
    "Site 4": Site 5,
    "Site 5": None})

我想做以下事情:

1) 对上游值求和以获得相应下游值的累积和。例如,站点 1 和站点 2 对站点 3 的价值有贡献。因此,我想将站点 1、站点 2 和站点 3 加在一起以获得站点 3 的累积值。

2) 现在我在站点 3 上有了该累积值,我想将该累积值保存到站点 3 的“df”中。现在我想将该值传播到站点 4,通过更新 DataFrame 保存它,然后继续到站点 5。

我可以使用 cumsum 来获得每个站点的累积值,如下所示:

df = df.cumsum(axis=1)

但是,这并没有考虑到站点 1 和站点 2 正在为站点 3 做出贡献,而不是彼此之间。

好吧,我可以使用以下方法手动解决这个问题:

df['Site 3'] = df.loc[:,'Site 1':'Site 3'].sum(axis = 1)
df['Site 4'] = df.loc[:,'Site 3':'Site 4'].sum(axis = 1)
df['Site 5'] = df.loc[:,'Site 4':'Site 5'].sum(axis = 1)

但是,我的实际站点列表要广泛得多,并且手动方法不会自动考虑提供的“df_order”。有没有办法以可以自动计算的方式逻辑链接“df_order”DataFrame?我知道如何手动执行此操作,我将如何扩展它以能够处理更大的 DataFrame 和站点顺序?

考虑一个更大的 DataFrame,可能多达 50 个站点,如下所示:

df_order = pd.DataFrame({
    "Site 1": Site 3,
    "Site 2": Site 3,
    "Site 3": Site 4,
    "Site 4": Site 5,
    "Site 5": Site 8,
    "Site 6": Site 8,
    "Site 7": Site 8,
    "Site 8": Site 9,
    "Site 9": None})

您可以使用networkx https://pypi.org/project/networkx/来处理人际关系。首先,将您的订单 DataFrame 设置为:

print(df_order)
   source  target
0  Site 1  Site 3
1  Site 2  Site 3
2  Site 3  Site 4
3  Site 4  Site 5
4  Site 5    None

创建有向图

import networkx as nx
G = nx.from_pandas_edgelist(df_order.dropna(), 
                            source='source', target='target', 
                            create_using=nx.DiGraph)

nx.draw(G, with_labels=True)

通过这个有向图,您想要获得所有predecessors。我们可以递归地做到这一点。 (你的图应该是一个有向图Acyclic图,否则递归会遇到麻烦)

def all_preds(G, target):
    preds=[target]
    for p in list(G.predecessors(target)):
        preds += all_preds(G, p)
    return preds

#Ex.
all_preds(G, 'Site 4')
['Site 4', 'Site 3', 'Site 1', 'Site 2']

现在,我们可以为您的所有独特站点创建循环遍历此函数输出的列的下游总和。

pd.concat([
    df[all_preds(G, target)].sum(1).rename(target)
    for target in df_order['source'].unique()
    ], axis=1)

输出使用np.random.seed(42)

     Site 1    Site 2    Site 3    Site 4    Site 5
0  0.374540  0.020584  1.006978  1.614522  1.736561
1  0.950714  0.969910  2.060118  2.230642  2.725819
2  0.731994  0.832443  1.856581  1.921633  1.956021
3  0.598658  0.212339  1.177359  2.126245  3.035565
4  0.156019  0.181825  0.793914  1.759546  2.018326
5  0.155995  0.183405  1.124575  1.932972  2.595495
6  0.058084  0.304242  0.562000  0.866613  1.178324
7  0.866176  0.524756  1.905167  2.002839  2.522907
8  0.601115  0.431945  1.625475  2.309708  2.856418
9  0.708073  0.291229  1.045752  1.485905  1.670759
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建自定义累积总和,计算给定位置列表及其顺序的下游数量 的相关文章

随机推荐

  • Windows 10 中“mvn”未被识别为内部或外部命令、可操作程序或批处理文件错误

    我读过有关此问题的类似问题 但无论如何它都不起作用 我已将 Maven 3 3 3 提取到 D Maven Java 已安装并且工作正常 然后添加了 2 个系统变量 Variable Value M2 M2 HOME bin M2 HOME
  • 我可以在端口 443 上安全地运行 Tomcat 而在 8080 上不安全地运行 Tomcat

    让我解释一下我的情况 目前 我有很多应用程序在 Tomcat 6 上运行 默认端口为 8080 我刚刚创建了一些需要登录的应用程序 我将购买 SSL 证书以安装在此服务器上 我不喜欢使用端口 8443 因为它使 URL 更加复杂 如果我在端
  • Autohotkey:重新映射 Win 键 - 单独按下时

    由于疯狂的笔记本电脑键盘布局和无法映射 Fn 组合 我想做一些重新映射 我想使用 LWin 键作为修饰符 例如 LWin Right gt End 等 它工作得很好 但是 我想在单独按下并释放时停止 LWin 以调出 Windows 菜单
  • 如何在 javascript 正则表达式匹配中将多个匹配 (/g) 与反向引用结合起来

    当使用 g 获取多个匹配 和括号 获取反向引用 时 我对正则表达式匹配返回的数组感到困惑 我不清楚如何获取反向引用 因为匹配数组的下标似乎引用了多个匹配项 而不是反向引用 例如 string abc bcd cde re2 a z p ne
  • MySQL Group By 自定义时间戳

    我想从按日期分组的数据库中获取结果 生成的元组应按日期分组 日期范围为上午 5 点到凌晨 5 点 换句话说 截止时间应该是凌晨 5 点 而不是午夜 12 点 我可以GROUP BY DAY timestamp 按正常日期分组 但如果我必须改
  • Pandas 从日期类型列获取星期几

    我正在使用 Python 3 6 和 Pandas 0 20 3 我有一列已从日期时间转换为日期类型 我所需要的只是日期 为了便于使用 我将其作为派生列 但我希望通过一周中的某一天的计算来进行一些进一步的操作 我可以从日期时间类型获取星期几
  • 更改 MKOverlayView 的 MKOverlay 坐标

    我在地图上有一个叠加层 我想更改其坐标 为了无缝地做到这一点 我将调用设置需要显示地图矩形 http developer apple com library ios documentation MapKit Reference MKOver
  • 如何增加BottomNavigationView的宽度以填充屏幕

    如何增加 BottomNavigationView 菜单的宽度 以下是当前场景 我无法增加整个屏幕的宽度 Menu xml
  • MySQL 日期时间 <-> Java 日期

    我使用 Hibernate 并且 MySQL 数据库中有一个日期时间 现在我想将 java util Date 的日期 时间存储到数据库中 所以我可以写 SimpleDateFormat df new SimpleDateFormat yy
  • 如何将 ArangoDB 嵌入桌面应用程序

    我想在我的应用程序中嵌入一个图形数据库 适用于 Windows Linux 和 MAC 我将搜索范围缩小到 ArangoDB 和 OrientDB 我能够让嵌入式 OrientDB 工作 但我仍然想尝试 ArangoDB 来做出明智的决定
  • 元组结构构造函数抱怨私有字段

    我正在开发一个基本的 shell 解释器来熟悉 Rust 在处理 shell 中存储挂起作业的表时 我遇到了以下编译器错误消息 error cannot invoke tuple struct constructor with privat
  • 请确认:Windows Workflow Foundation 现在是一匹值得支持的好马吗?

    我们正在为一家端到端使用 Microsoft 产品的公司选择工作流程解决方案 鉴于 WF4 的消息 它似乎本质上是对以前版本的重写 支持当前版本是明智之举还是我们应该寻找其他地方 即 当前版本是否太糟糕以至于我们不明智地尝试使用它 Haii
  • TensorFlow 和 Numpy 之间的不同结果

    我有以下代码片段 许多西格玛矩阵是由神经网络生成的 并且这些矩阵必须是正定的 所以这是在调试功能中检查的 奇怪的是 Sigma2 没有给出 LinAlgError Matrix is not Positive Defined Error 而
  • JavaScript 用回调替换 - 性能问题

    在 JavaScript 中 您可以在正则表达式字符串替换操作中定义回调处理程序 str replace str 123 etc replaceCallback 假设您有一个字符串和替换的查找对象 var lookup str1 repl1
  • 永远等待 启动

    我无法再在模拟器或 iPhone 上运行我的程序 它编译得很好 没有任何问题 但后来我收到消息 等待启动 它永远发生 这种情况只发生在一个项目中 我终于通过使用 xproj 文件的备份解决了这个问题 问题出在 xproj 文件中 不过 我不
  • Linux 上的 pthread 执行

    我开始在 Linux 上进行 pthread 编程 在第一个程序中我完全感到困惑 下面是我正在运行的程序 include
  • 单击 JButton 时如何删除 JTable 中的当前行?

    我有很多行JTable每行都有删除按钮 我想在单击该行的删除按钮时删除当前行 我怎样才能做到这一点 private JButton button public MyTableButtonEditor1 button new JButton
  • MySQL:使用另一个表中的值作为列别名?

    我们有一张非常时髦的表格 我试图从中得到一个描述性的结果集 该表存储紧密相关但不同的数据类型集合 并且有意义的列 名称 存储在单独的表中 我认为展示比解释更容易 一个简化和抽象的例子 CREATE TABLE IF NOT EXISTS s
  • Xrm 在 Dynamics CRM 2011 中未定义

    当我创建 js 代码时 我似乎无法让 Xrm 变量工作 是否有我需要包含的库或我需要先运行的函数 我是否需要确保正确引用 ClientGlobalContext js aspx 我处于 C 心态 只是想知道是否有任何类型的 include
  • 创建自定义累积总和,计算给定位置列表及其顺序的下游数量

    我试图想出一些代码 基本上可以计算其下方位置的累积值 采用累积总和几乎可以完成此任务 但某些位置对相同的下游点有贡献 此外 最上游的点 或起始点 不会有任何贡献值 并且可以在最终的累积 DataFrame 中保留其起始值 假设每个站点都有以