ما هي بنية بيانات الرسم البياني الصحيحة للتمييز بين العقد التي تحمل الاسم نفسه?

StackOverflow https://stackoverflow.com/questions/8828349

سؤال

أنا أتعلم عن الرسوم البيانية (تبدو مفيدة للغاية) وكنت أتساءل عما إذا كان بإمكاني الحصول على بعض النصائح حول طريقة ممكنة لهيكلة الرسوم البيانية الخاصة بي.

ببساطة ، دعنا نقول أنني أحصل على بيانات أمر الشراء كل يوم وبعض الأيام هي نفسها كما في اليوم السابق وفي أيام أخرى مختلفة.على سبيل المثال ، بالأمس كان لدي طلب من أقلام الرصاص والمحايات ، أقوم بإنشاء العقدتين لتمثيلهما ، ثم أحصل اليوم على طلب لممحاة وعلامة ، وما إلى ذلك.بعد كل يوم ، برنامجي يبدو أيضا لمعرفة من الذي أمر ما ، وإذا أمر بوب قلم رصاص أمس ثم ممحاة اليوم ، فإنه يخلق حافة الموجهة.منطقي لهذا هو أنني أستطيع أن أرى من اشترى ما في كل يوم ويمكنني تتبع سلوك شراء بوب(وربما استخدامه لاستنتاج أنماط مع نفسه أو المستخدمين الآخرين).

مشكلتي هي ، أنا باستخدام نيتورككس (بيثون) وخلق عقدة 'قلم رصاص' للأمس ثم عقدة أخرى 'قلم رصاص' ليوم 2 وأنا لا يمكن التفريق بينها.

فكرت (وقد تم) تسمية ذلك اليوم 2-قلم رصاص ومن ثم مسح الرسم البياني بأكمله وتجريد من 'اليوم 2 -' لتتبع أوامر قلم رصاص.هذا يبدو خطأ بالنسبة لي (ناهيك مكلفة على المعالج).أعتقد أن المفتاح سيكون إذا كان بإمكاني تحديد كل يوم بطريقة ما على أنه رسم بياني فرعي خاص به ، لذلك عندما أرغب في دراسة يوم معين أو بضعة أيام ، لا يتعين علي مسح الرسم البياني بالكامل.

كما يحصل بيانات الاختبار بلدي أكبر, في الحصول على أكثر وأكثر مربكة لذلك أنا أتساءل ما هي أفضل الممارسات?أي اقتراحات توليد سيكون كبيرا (كما نيتورككس يبدو تماما كامل المواصفات لذلك ربما لديهم وسيلة للقيام بذلك).

شكرا مقدما!

تحديث:لا يوجد حتى الآن الحظ ، ولكن هذا ربما مفيدة:

import networkx as nx
G=nx.Graph()
G.add_node('pencil', day='1/1/12', colour='blue')
G.add_node('eraser', day='1/1/12', colour='rubberish colour. I know thats not a real colour')
G.add_node('pencil', day='1/2/12', colour='blue')

النتيجة أحصل على كتابة الأمر التالي G.node هو:

{'pencil': {'colour': 'blue', 'day': '1/2/12'}, 'eraser': {'colour': 'rubberish colour. I know thats not a real colour', 'day': '1/1/12'}}

من الواضح أن الكتابة فوق قلم الرصاص من 1/1/12 مع 1/2/12 واحد ، لست متأكدا مما إذا كان بإمكاني عمل قلم رصاص.

هل كانت مفيدة؟

المحلول

هذا يعتمد في الغالب على هدفك في الواقع.ما تريد تحليله هو العامل النهائي في تصميم الرسم البياني الخاص بك.ولكن ، بالنظر إلى الهيكل الخاص بك ، فإن الهيكل العام سيكون العقد ل Customers و Products, ، التي ترتبط بها Days (أنا لا أعرف إذا كان هذا من شأنه أن تساعدك على أي أفضل ولكن هذا هو في الواقع الرسم البياني الثنائي).

لذلك سيكون الهيكل الخاص بك شيئا من هذا القبيل:

node(Person) --- edge(Day) ---> node(Product)

دعنا نقول ، بوب يشتري قلم رصاص في 1/1/12:

node(Bob) --- 1/1/12 ---> node(Pencil)

حسنا ، الآن يذهب بوب ويشتري قلم رصاص آخر في 1/2/12:

          -- 1/1/12 --
         /            \
node(Bob)              > node(Pencil)
         \            /
          -- 1/2/12 --

هكذا...

هذا ممكن بالفعل مع networkx.نظرا لأن لديك حواف متعددة بين العقد ، عليك الاختيار بين MultiGraphمور MultiDiGraph اعتمادا على توجيه نيس من حوافك.

In : g = networkx.MultiDiGraph()

In : g.add_node("Bob")
In : g.add_node("Alice")

In : g.add_node("Pencil")

In : g.add_edge("Bob","Pencil",key="1/1/12")
In : g.add_edge("Bob","Pencil",key="1/2/12")

In : g.add_edge("Alice","Pencil",key="1/3/12")
In : g.add_edge("Alice","Pencil",key="1/2/12")

In : g.edges(keys=True)
Out:
[('Bob', 'Pencil', '1/2/12'),
 ('Bob', 'Pencil', '1/1/12'),
 ('Alice', 'Pencil', '1/3/12'),
 ('Alice', 'Pencil', '1/2/12')]

حتى الآن ، ليس سيئا.يمكنك الاستعلام فعلا أشياء مثل " أليس شراء قلم رصاص على 1/1/12?".

In : g.has_edge("Alice","Pencil","1/1/12")
Out: False

In : g.has_edge("Alice","Pencil","1/2/12")
Out: True

قد تسوء الأمور إذا كنت تريد جميع الطلبات في أيام محددة.سيئة ، وأنا لا أقصد رمز الحكمة ، ولكن حساب الحكمة.رمز الحكيم هو بسيط نوعا ما:

In : [(from_node, to_node) for from_node, to_node, key in g.edges(keys=True) if key=="1/2/12"]
Out: [('Bob', 'Pencil'), ('Alice', 'Pencil')]

لكن هذا يمسح جميع الحواف في الشبكة ويقوم بتصفية الحواف التي تريدها.لا أعتقد networkx لديه أي طريقة أفضل.

نصائح أخرى

الرسوم البيانية ليست أفضل نهج لهذا.قاعدة بيانات علائقية مثل الخلية هي الأداة المناسبة لتخزين هذه البيانات وأداء مثل هذه الاستعلامات كما الذي اشترى ماذا متى.

جرب هذا:

امنح كل عقدة معرف عدد صحيح فريد.ثم ، قم بإنشاء قاموس ، عقد ، مثل ذلك:

العقد ['قلم رصاص'] = [1,4,...] <- حيث كل هذه تتوافق مع عقدة مع سمة قلم رصاص.استبدال 'قلم رصاص' مع أي سمات أخرى كنت مهتما في.

فقط تأكد من أنه عند إضافة عقدة مع 'قلم رصاص' ، يمكنك تحديث القاموس:

عقدة ['قلم رصاص'].إضافة (معرف جديد).وبالمثل مع حذف العقدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top