في هذه المقالة ، لن نتطرق إلى الجوانب القانونية للإخطارات المقدمة حول CFC ، حول المشاركة في CFC ، سننظر في الجانب التقني من المشكلة.
مما لا شك فيه ، إذا كانت الحيازة المعنية تقدم نفسها على أنها هياكل بسيطة من النوع LLC-> KIK-> روسي ، فلا يُنصح ببناء شيء هنا بمشاركة آلة ، فهذه مسألة أخرى إذا كانت فروع الهيكل تتضاعف ولا يوجد عدد من هذه التشابكات.
دعنا نلقي نظرة على العديد من حلول الرسومات الحالية التي من شأنها تبسيط عملك.
لسهولة التصور ، سيتم استخدام دفتر jupyter وبيئة بيثون.
الشبكة x
هذا الحل هو الأقدم من بين الحلول المقدمة ولا يمكن أن يتباهى بتفاعله. توجد نفس المقالة القديمة حول هذه الحزمة عن حبري.
ومع ذلك ، فإن القديم لا يعني أنه سيء ، وهذا الخيار هو من أنجح الخيارات سواء من حيث الرسم أو الحوسبة.
قم بتثبيت واستيراد الوحدة عبر jupyter:
!pip install networkx
import networkx as nx
نحن أيضا نستورد إضافة أخرى. الوحدات التي ستساعدك على رسم الأشكال:
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams.update({
'figure.figsize': (7.5, 7.5),
'axes.spines.right': False,
'axes.spines.left': False,
'axes.spines.top': False,
'axes.spines.bottom': False})
لنقم ببناء أول شبكة باستخدام networkx:
from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = nx.read_edgelist('example.edgelist')
# Draw network
#pos = nx.spring_layout(G)
pos = nx.spectral_layout(G)
#pos = nx.planar_layout(G)
nx.draw_networkx(G, pos)
plt.gca().margins(0.15, 0.15)
إليك ما حدث:
كما ترى ، يمتلك إيفانوف اثنين من مركبات الكربون الكلورية فلورية ، والتي بدورها تمتلك كيانات قانونية روسية. من قبل الأشخاص.
دعنا نحلل الكود أعلاه.
استوردنا الوحدة وحددنا المكان الذي سنقرأ فيه البيانات الموجودة على القرص من:
from pathlib import Path
data_dir = Path('.') / 'data'
تم اعتبار الدليل الحالي "example.edgelist":
G = nx.read_edgelist('example.edgelist')
* example.edgelist هو ملف نصي عادي مثل هذا:
# source target
1
2
1 2
1 _
2 _
يتم تسجيل القيم من قبل شخص مع وجود مسافة بينهما.
بعد ذلك ، حددنا كيف ستبدو الشبكة:
pos = nx.spectral_layout(G)
إذا غيرنا إلى pos = nx.spring_layout (G) ، فسيأخذ الشكل:
والغريب أن هذا الترتيب هو الأنسب للهياكل الأكبر.
أخيرًا ، رسمنا الشبكة ، ووضعنا علامات على المسافات البادئة:
nx.draw_networkx(G, pos)
plt.gca().margins(0.15, 0.15)
من السهل حفظ الصورة:
plt.savefig('plot.png')
كيفية رسم مقطع في networkx
#
H = G.subgraph(['', '1', '_'])
plt.subplot(212)
print(":")
nx.draw_networkx(H)
لم نضع
مسافة بادئة هنا ، والأسماء "يسار": تعمل Networkx بمفاهيم العقد والروابط بينها. في حالتنا ، العقد هي Ivanov و KIK1 و KIK2 و Romashka_OOO و Bucket_AO. والروابط هي ما يوجد في ملف example.edgelist.
يمكنك ببساطة عرض كلاهما بالرجوع إلى أساليب Gnodes و G.edges:
الرسم البياني الاتجاهي في networkx (قائمة الحافة الموجهة)
دعنا نوضح الشبكة المنشأة قليلاً ، أضف الأسهم:
# Read edge list
G = nx.read_edgelist(
str('example.edgelist'),
create_using=nx.DiGraph)
pos = nx.spectral_layout(G)
# Draw network
nx.draw_networkx(G, pos, arrowsize=20)
plt.gca().margins(0.15, 0.15)
جعلت التغييرات الصغيرة من الممكن رسم صورة أوضح لمن يمتلك من:
في الكود ، كما ترى ، فإن التغييرات طفيفة.
تتمثل الخطوة التالية في إنشاء رسم بياني يظهر فيه حجم حزم الملكية.
للقيام بذلك ، تحتاج إلى التعرف على مفهوم الوزن (الوزن) وهو المعلمة الرئيسية الثالثة التي يمكن أن يعمل بها networkx. لتضمينها في العمل ، تحتاج إلى إضافة نفس هذه الأوزان إلى ملف نصي ، على سبيل المثال:
# source target
1 100
2 100
1 2 50
1 _ 100
2 _ 100
لنقم الآن بإعادة بناء الشبكة باستخدام الأوزان وتعيينها على الرسم البياني:
# Read edge list
G = nx.read_weighted_edgelist(
str('example2.edgelist'))
# Extract weights
weights = [d['weight'] for s, t, d in G.edges(data=True)]
nx.draw_networkx(G,pos)
labels = nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels)
plt.gca().margins(0.15, 0.15)
* example2.edgelist هو الملف الذي تم إنشاؤه أعلاه باستخدام أوزان.
نحصل على الصورة التالية:
من يملك من وكيف ، networkx
نحن الآن ، كمبرمجين - محامين ، نحتاج إلى فهم التسلسل والمبلغ الذي يمتلكه إيفانوف ، على سبيل المثال ، Bucket_AO ، وما إذا كان يمتلكها على الإطلاق. هذا مطلوب من أجل تحديد حقيقة الملكية في الحيازة المتفرعة وجميع السلاسل إلى شركة LLC المستهدفة (JSC) ، بحيث يمكن تسجيل هذه السلاسل لاحقًا في إشعار CFC.
باستخدام networkx ، يمكنك القيام بذلك على النحو التالي:
list(nx.all_simple_paths(G,'', '_'))
الوسيطة الأولى هي عقدة المالك ، والثانية هي العقدة التي سنبني عليها المسارات.
باستخدام هذه الطريقة ، يمكنك أن ترى أن Bucket_AO الخاص بإيفانوف ينتمي إلى السلاسل التالية:
[['', '1', '2', '_'], ['', '2', '_']]
هذا مؤكد بيانيا.
يمكنك معرفة حصة الملكية بضرب الأوزان بين العقد المقابلة: 1 * 0.5 * 1 = 0.5 ، 1 * 1 = 1. حصة تزيد عن 25٪ ، يجب إرسال الإخطار.
في الكود ، يتم الضرب بالعكازات التالية (لم يتم العثور على طريقة أكثر أناقة بعد):
x=0
b=0
c=[]
for i in list(nx.all_simple_paths(G,'', '_')):
for a in i:
if x>len(i)-2:
pass
else:
b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#
x+=1
c.append(b/100)
print(c)
import numpy as np
print(np.prod(c))
x=0
b=0
c=[]
for i in list(nx.all_shortest_paths(G,'', '_')):
for a in i:
if x>len(i)-2:
pass
else:
b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#
x+=1
c.append(b/100)
print(c)
import numpy as np
print(np.prod(c))
في الحالة الأولى ، ستعرض جزءًا من 0.5 ، في الحالة الثانية 1.
ما هي خيارات التصور الأخرى المتاحة؟ على سبيل المثال ، Netwulf.
نت وولف
التوثيق هنا .
الشبكة نفسها تفاعلية ، وهذه هي ميزتها الرئيسية. بعد تثبيت حزمة python ، لنقم ببناء الشبكة:
import netwulf as nw
plt.figure(figsize=(200,200))
G = nx.read_weighted_edgelist(str('example2.edgelist'),create_using=nx.DiGraph)
pos = nx.spring_layout(G)
nw.visualize(G)
بعد تشغيل الكود ، يتجمد jupyter ، وفي نافذة متصفح إضافية تفتح ، يمكنك رؤية النتيجة:
على الجانب الأيمن من اللوحة ، يمكنك رؤية الخيارات التي تؤثر على الشبكة المبنية عبر الإنترنت.
عيب هذه الحزمة هو أنه ليس من الممكن بعد عرض الأوزان والسهام بين العقد ، لكن المؤلفين وعدوا بتنقيحها.
* للعودة إلى jupyter ، تحتاج إلى النقر فوق خيار "post to python": خيار
آخر جيد لمثل هذا التصور للبيثون هو مشروع الويب الصغير.
ويب ويب
التوثيق هنا .
تم بناء الشبكة بطريقة مماثلة:
from webweb import Web
web = Web(title='kitchen_sink')
web.display.networkName = 'tree'
web.display.networkLayer = 2
web.display.colorBy = 'ring'
web.display.sizeBy = 'degree'
web.display.gravity = .3
web.display.charge = 30
web.display.linkLength = 15
web.display.colorPalette = 'Greens'
web.display.scaleLinkOpacity = False
web.display.scaleLinkWidth = True
from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = nx.read_edgelist('example.edgelist',create_using=nx.DiGraph)
plt.figure(figsize=(200,200))
# Draw network
pos = nx.spring_layout(G)
Web(list(G.edges)).show()
من المزايا الواضحة على netwulf: القدرة على إبراز العقد الرئيسية بالألوان ، والبحث عن نص عن العقد مع إبراز على الشبكة:
باختصار ، يمكننا القول أن المتحدرين من networkx - netwulf و webweb جيدون لبناء صورة سريعة لهيكل عقد صغير. تحتوي كلتا الوحدتين على وضع التجميد لتجميد العقد التي تلتصق ببعضها البعض في كومة واحدة بسبب تفاعل الرسم البياني. ومع ذلك ، حتى عند استخدامها ، ليس من السهل العمل مع الهياكل واسعة النطاق حيث يزيد عدد العقد عن 200.
"الركيزة" من وزارة المالية ، ملكية صليب وحلقة
كل شيء سيكون جيدًا جدًا عند إنشاء مثل هذه الهياكل ، إن لم يكن لشيء واحد يفسد الصورة بأكملها. ومع ذلك ، يكمن هذا في حقيقة أن ممتلكات الشركة تمتلك نفسها من خلال كيانات قانونية أخرى. الوجوه وهذا ما يسمى بالملكية المتقاطعة أو الحلقية.
في الصور الموجودة في رسائل من وزارة المالية (على سبيل المثال ، من 02.07.2013 -4-13 / 11912) يبدو هكذا.
الملكية المشتركة: على شكل حلقة
:
لنرى كيف تحدد networkx الروابط الخاصة بنظام الملكية المشتركة لمشاركة D في B.
لننشئ قائمة edgelist بروابط:
# source target
D B 45
B A 40
A B 55
E A 60
بعد بناء شبكة بأوزان ، يمكنك أن ترى أن التغذية المرتدة بين A و B لا تنعكس:
يمكن رؤيتها إذا قمت ببناء شبكة بدون أوزان ، مع أسهم:
ماذا عن الحسابات؟ ما هي الحصة التراكمية لـ D في B؟
كل شيء يبدو شفافًا هنا ، 45٪
ويعطي networkx قائمة الأوامر (nx.all_simple_paths (G، 'D'، 'B')):
[['D'، 'B']]
لكن ليس كل شيء بهذه البساطة.
وتقول وزارة المالية إن الحصة الإجمالية لـ D في B يتم تحديدها بالصيغة التالية:
وستكون 57.69٪.
ماذا أفعل؟ Networkx ضعيف؟
لا على الإطلاق ، ستكشف networkx عن مثل هذه المواقف ، لكن صيغة الحساب ستكون مختلفة ، وفقًا لـ "حرف القانون".
يمكن حل المشكلة جزئيًا عن طريق إضافة مدخلات
AA
BB إلى قائمة الحافة
علاوة على ذلك ، من خلال قائمة الأوامر (nx.nodes_with_selfloops (G)) ، يمكنك عرض العقد بالمشاركة في حد ذاتها ، ولكن هذا لا يزال غير مأخوذ في الاعتبار عند تحديد المسارات من D إلى B.
تحميل دفتر jupyter - هنا .