Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Personen einer Gruppe zuordnen abhängig vom Standort
Druckversion
Druckversion
Autor
Universität/Hochschule J Python: Personen einer Gruppe zuordnen abhängig vom Standort
rambo3
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 14.11.2008
Mitteilungen: 1174
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-04-02


Angenommen, wir haben ein pandas dataframe (siehe unten) mit Angaben zur räumlichen Lage (Längengrad, Breitengrad, Etage im Haus) von zufällig ausgewählten Personen.Ich möchte jede Person in eine (und nicht mehr!) Gruppe zuordnen. In welcher Gruppe dir Person kommt, ist erstmal beliebig, jedoch sollen ein paar Punkte berücksichtigt werden:

Die Anforderungen:

Das pandas dataframe ist immer ein Vielfaches von 9 Personen (z.B. 18 oder 27 Personen). Jede Gruppe soll aus 3 Personen bestehen.In anderen Worten: Wenn das dataframe 27 Personen hat, gibt es 9 Gruppen mit jeweils 3 Personen.


Personen in derselben Gruppe leben an unterschiedlichen Standorten. Das heißt, sie haben unterschiedliche Werte für den Breiten- und Längengrad  sowie die Etagen-Nummer.

Bis hier hin ist es eigentlich nocht relativ leicht. Jetzt wird es etwas tricky:
Leute in der selben Gruppe, sollten möglichst nah zueinander wohnen! Es gibt keine strenge Definition dieser Anforderung.Ich möchte nur verhindern, dass Leute in einer Gruppe sind, die an zwei völlig unterschiedlichen Orten in der Stadt leben.

Den Abstand der Personen kann man ausrechnen, da wir die Längen- und Breitengrade kennen.

Im Idealfall sieht das Ergebnis so aus, dass wir eine neue Spalte haben, ich der die Gruppenummer der jeweiligen Person steht. Zum Beispiel Person A ist in Grupper 1, Person B ist in Gruppe 6,...

Wie würdet ihr das machen?

Hier sind Beispielsdaten:

Python
array_data=([[ 50.56419  ,   8.67667  ,   2.       , 160.       ],
   [ 50.5740356,   8.6718179,   1.       ,   5.       ],
   [ 50.5746321,   8.6831284,   3.       , 202.       ],
   [ 50.5747453,   8.6765588,   4.       , 119.       ],
   [ 50.5748992,   8.6611471,   2.       , 260.       ],
   [ 50.5748992,   8.6611471,   3.       , 102.       ],
   [ 50.575    ,   8.65985  ,   2.       , 267.       ],
   [ 50.5751   ,   8.66027  ,   2.       ,   7.       ],
   [ 50.5751   ,   8.66027  ,   2.       ,  56.       ],
   [ 50.57536  ,   8.67741  ,   1.       , 194.       ],
   [ 50.57536  ,   8.67741  ,   1.       , 282.       ],
   [ 50.5755255,   8.6884584,   0.       , 276.       ],
   [ 50.5755273,   8.674282 ,   3.       , 167.       ],
   [ 50.57553  ,   8.6826   ,   2.       , 273.       ],
   [ 50.5755973,   8.6847492,   0.       , 168.       ],
   [ 50.5756757,   8.6846139,   4.       , 255.       ],
   [ 50.57572  ,   8.65965  ,   0.       ,  66.       ],
   [ 50.57591  ,   8.68175  ,   1.       , 187.       ]])
 
all_persons = pd.DataFrame(data=array_data) # convert back to dataframe
 
all_persons.rename(columns={0: 'latitude', 1: 'longitude', 2:'floor', 3:'id'}, inplace=True) # rename columns
 

Das Dataframe heißt all_persons.

Mein Lösungsansatz:
Ich habe die Abstände der Personen berechnet. Wenn der Abstand ungleich Null ist, habe ich sie in eine Gruppe gesteckt. Wenn die Gruppe bereits 3 Leute enthält, habe ich die Person in eine neue Gruppe gesteckt. Am Ende sollte jede Person in eine Gruppe sein.

Probleme:
- vermutlich viel zu kompliziert gelöst. Geht bestimmt einfacher
- Es kommt vor, dass einige Personen (aus mir nicht bekannten Gründen) in die selbe Gruppe kommen, obwohl sie den selben Standort teilen

Falls erwünscht, kann ich näher auf meine Lösung eingehen und sie hier im Detail vorstellen! So lang ist die Lösung nicht.

Da die Umsetzung meiner Lösung nicht zu 100% klappt, hoffe ich hier im Forum Hilfe zu bekommen. Ich habe meine Frage bereits auf Stackoverflow gestellt:

Link zu Frage auf stackoverflow




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27287
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-04-02


Verteile zunächst mal die Personen mit gleicher Lokalität auf unterschiedliche Gruppen. Das verhindert schon mal dein beschriebenes Problem.
a) Dann nimm die nördlichste Person, die nicht einer vollständigen(!) Gruppe angehört. Ist sie schon in einer Gruppe, fülle die Gruppe auf. Sonst starte eine neue Gruppe und fülle auf.
b) Auffüllen: nimm die Person(en) mit dem kleinsten Abstand zu der Startperson.
c) Wenn noch nicht alle Personen zugeordnet, weiter bei a)

Gruß vom ¼


-----------------
Bild



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
rambo3
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 14.11.2008
Mitteilungen: 1174
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-04-05


Alles klar. Vielen Dank. Es hat ein bisschen gebraucht, aber damit konnte ich es tatsächlich besser umsetzten :-) Danke!!!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
rambo3 hat die Antworten auf ihre/seine Frage gesehen.
rambo3 hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]