Python做风险控制|找出形成环状投资的公司

article/2025/8/22 17:22:54

大家好,我是小小明。

今天我将带大家利用python找到关系数据的环。先说下需求和背景:

需求描述

某投资机构需要考虑各公司的投资风险,手上一份各公司投资方向的数据,主要字段是投资者和被投资者。

而有部分公司并不是真的投资,而是买通一大堆作为僚机的公司,最终投资的钱还是会变成投资自己,于是我们就需要找出这样的环状结果,把处于这个环的所有公司都找出来。

例如,ABCDEFG这7个公司的投资关系如下:

image-20210712221821460

那么很明显,ABD和ABCD构成了环,我们最终的目标就是找出这两个环并输出。

原始数据形式

首先,读取测试数据(已脱敏):

image-20210712222318498

数值编码

为了提升后续程序处理的速度,我们给每个公司创建一个唯一的数值编码:

n = df.shape[0]
codes, labels = pd.factorize(np.r_[df.values[:, 0], df.values[:, 1]])
print(codes[:10])
print(labels[:10])
[0 1 2 3 4 1 5 6 7 8]
['GD1' 'GD2' 'GD3' 'GD4' 'GD5' 'GD6' 'GD7' 'GD8' 'GD9' 'GD10']

此时两列数据已合并到一列进行了统一的编码,codes前n个数据是第一列的编码,后n个数据是第二列的编码。

而labels就是对应的原始标签,我们可以随时通过labels和对应的编码查询到原始的数据。

设计数据结构存储图

下面我们设计一个数据结构来存储图,考虑到引用关系,我想到了直接用链表存储图,通过巧妙的处理,它自动就能形成环状的结构,完美的原样表达我们想表达的结构:

class Node:def __init__(self, data, children=None):self.in_degree = 0self.data = dataif children is None:children = set()self.children = childrendef __repr__(self):return f"{self.data}->{self.out_degree}"@propertydef out_degree(self):return len(self.children)

咱们先一次性把所有可能的节点一次性找出来并存储起来:

nodes_cache = [Node(code) for code in range(len(labels))]

然后我们就可以根据编码后的边数据来构造每个节点的子节点信息:

for s, d in zip(codes[:n], codes[n:]):nodes_cache[s].children.add(nodes_cache[d])

然后处理每个节点的入度信息(被多少个公司投资):

for parent in nodes_cache:for node in parent.children:node.in_degree += 1

找出所有入度为0的顶点

为了减少重复查找的概率,我们从所有被被投资的公司开始找起,首先找出所有入度为0的节点保存起来:

vertexs = []
for node in nodes_cache:if node.in_degree == 0:vertexs.append(node)

注意:由于都是边数据,不可能存在入度和出度都为0的离群点,所以无需做多余的判断。

回溯算法找出环

可能大部分读者都打算使用图论中的算法来查找,但本人只找到判断是否存在环算法,有些说能够实现找出具体的环却看不到具体的实现代码。

所以本人按照自己的思维去完成这个找环的过程:

def get_ciyle(vertexs, max_lenth=10, max_count=None):"""max_lenth:路径超过指定个数的环都忽略max_count:每个顶点至少要找出多少个环,传None表示全部找出"""def dfs(node):visited.append(node.data)if len(visited) <= max_lenth:for child_node in node.children:if child_node.data in visited:ciyle_data = visited[visited.index(child_node.data):]i = ciyle_data.index(min(ciyle_data))result.add(tuple(ciyle_data[i:]+ciyle_data[:i]))if max_count and len(result) >= max_count:# 超过最大限度则结束returncontinuedfs(child_node)visited.pop()total = set()for node in vertexs:result = set()visited = []dfs(node)total = total.union(result)return totalciyle_codes = get_ciyle(vertexs)

经过实测发现部分节点形成的环达到67那么长,从风险控制的角度来说,形成那么长的环已经几乎不可能是要投资自己了。所以我们的程序限制每个环最长10个公司,超过10个公司的环会自动被忽略掉。当然我们还可以限制每个顶点最多找出多少个环来防止程序运行时间过长。

数据整理

在计算出环数据后,我们就可以将其整理展示了:

image-20210713092120021

然后可以看一下形成环出境最多的前10个公司。

image-20210712233328184

至此我们就完成了用Python找环的操作。本人对图论的算法不够熟悉,或许广大读者有更好的解法,欢迎交流。


http://chatgpt.dhexx.cn/article/H7sjJ2Dr.shtml

相关文章

如何用Python做好友管理系统

--------------------------------------------------------总代码在最下面----------------------------------------------------------- &#xff08;1&#xff09;好友管理系统中不仅需要保存好友名称&#xff0c;还需要保存分组以及分组中的好友&#xff0c;因此&#xf…

怎么用python做网站?

python做网站方法步骤&#xff1a; 1、导入django包 可直接在pycharm下载&#xff0c;或者pip/easy_install Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦…

用python做一个简单GUI小软件

用python做一个简单软件 前言 这是一个课设&#xff0c;用python做一个扫描王软件 我主要做的GUI部分&#xff0c;记录分享一下。也是第一次用python做小软件&#xff0c;python的方便果然是名不虚传 遇到问题 1.python版本 下载了python3.7的编译器 由于最终软件要在wi…

手把手教你使用Python做数据分析

一、数据分析是什么 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;将它们加以汇总和理解并消化&#xff0c;以求最大化地开发数据的功能&#xff0c;发挥数据的作用&#xff0c;使得数据的价值最大化 二、数据分析是做什么的 数据分析是为了提取…

你究竟能用Python做什么?

中英文模式阅读 中文模式阅读 英文模式阅读 What exactly can you do with Python? Here are Pythons 3 main applications. 你究竟能用Python做什么&#xff1f;这是Python的3个主要应用。 If youre thinking of learning Python --- or if you recently started learnin…

用Python做图像处理

用Python做图像处理 最近在做一件比较 evil 的事情——验证码识别&#xff0c;以此来学习一些新的技能。因为我是初学&#xff0c;对图像处理方面就不太了解了&#xff0c;欲要利吾事&#xff0c;必先利吾器&#xff0c;既然只是做一下实验&#xff0c;那用 Python 来作原型开发…

python都能做什么

前言 一、python&#xff1a; Python具有丰富和强大的库。它常被昵称为胶水语言&#xff0c;能够把用其他语言制作的各种模块&#xff08;尤其是C/C&#xff09;很轻松地联结在一起。常见的一种应用情形是&#xff0c;使用Python快速生成程序的原型&#xff08;有时甚至是程序…

你都用 Python 来做什么?

你们都用python做些什么呢&#xff1f; 在开发中 python 这一个语言就像是小叮当&#xff0c;而 python 的第三方库则是“百宝箱”&#xff0c;你只要想着对某一个方向进行开发&#xff0c;那么这个“百宝箱”就会给你想要的东西。 由于我是在开发多年后接触到的 python&#…

怎样利用python做一个软件,python可以自己做软件吗

python能做什么软件&#xff1f; 主要可以做小程序&#xff0c;爬虫程序&#xff0c;用于系统编程等等还是很广泛的。Python 的应用领域分为下面几类。下文将介绍一些Python 具体能帮我们做的事情。 但我们不会对各个工具进行深入探讨&#xff0c;如果你对这些话题感兴趣&…

python可以做什么工作-python都能干什么用

一、Python可以做什么&#xff1f; 1、数据库&#xff1a;Python在数据库方面很优秀&#xff0c;可以和多种数据库进行连接&#xff0c;进行数据处理&#xff0c;从商业型的数据库到开放源码的数据库都提供支持。例如&#xff1a;Oracle, My SQL Server等等。有多种接口可以与…

学了python能干啥举例-Python主要用来做什么?

Python主要用来做什么&#xff1f;Python可以做web应用开发、网络爬虫、AI人工智能与机器学习、处理数据用来分析、数据科学&#xff1a;包括机器学习、数据分析和数据可视化、脚本等方面开发。 Python用来开发的有&#xff1a; 1、做Web应用开发 在国内豆瓣一开始就使用Pyth…

python怎么算列表的平方_总算明了python如何求平方

总算明了python如何求平方 日期:2019-08-25 12:22:17 浏览:341 核心提示:打开电脑上的计算器一看,居然没法求平方,是不是就没办法了呢?用python就可以啦,那么python如何求平方呢?一起来了解下吧: python如何求平方 1.计算乘方 pow(4,3) #结果64 2.计算平方 import…

Python 计算平方根

Python 计算平方根 文章目录 Python 计算平方根平方根封装为函数相关博客 平方根 平方根&#xff0c;又叫二次方根&#xff0c;表示为〔√&#xffe3;〕&#xff0c;一个正数有两个实平方根&#xff0c;它们互为相反数&#xff0c;负数没有平方根&#xff0c;0的平方根是0 …

python中平方_python里平方

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 我正在写一个函数&#xff0c;它将返回一个平方数列表&#xff0c;但如果该函数使用参数&#xff08;appl…

python平方和计算技巧,python平方和计算技巧 Python算法练习题:四平方和

全栈记事交流群内一个同学的问题&#xff0c;正好收集一下解决方案&#xff1b; 四平方和的定理又称拉格朗日定理&#xff1a;每个正整数都可以表示至多4个正整数的平方和。如果把0包括进去&#xff0c;就可以表示为4个数的平方和。 比如&#xff1a; 50^20^21^22^2 71^21^21^2…

python中平方根_如何在Python中找到平方根

python中平方根 Hello everyone, in this tutorial, I’ll show 3 ways to find square root in Python. 大家好,在本教程中,我将展示3种在Python中找到平方根的方法。 Let’s see how to do it. 让我们来看看如何做。 1. Using Exponent 1.使用指数 number = int(input(&…

python编程a的x次方_python平方-Python,平方

本教程分享&#xff1a;《python平方》&#xff0c;Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开…

python里的平方_python中平方和

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 为什么python给出了“错误”的答案? x= 16 sqrt= x**(.5)returns 4 sqrt= x**(12)returns 1... 方法一:使用内置模块>>> import math >>> …

python平方数_python数字平方

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 还是要强调一下python的变量和数据类型的关系,变量只是对某个对象的引用或者说代号、名字、调用等等,变量本身没有数据类型的概念 。 只有1,hello这一类对象…

python中平方_python中平方

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 为什么python给出了“错误”的答案&#xff1f; x 16 sqrt x**(.5)returns 4 sqrt x**(12)returns 1... …