Python Programm für Master Thesis...Ich brauche bitte Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RQGoldstyle
User
Beiträge: 1
Registriert: Donnerstag 7. Oktober 2021, 08:02

Hallo zusammen,

ich muss in einem Monat meine Master Thesis abgeben und mein Betreuer meint ich soll jetzt nochmal was mit Python machen, obwohl ich keine Ahnung davon habe.
Deshalb erhoffe ich mir Hilfe von euch.
Im Folgenden ist ein Ausschnitt der Daten, welche ich aus einer JSON Datei in Python einlesen lasse zu sehen.
Vor diesem Datensatz stehen noch einige allgemeine Daten der Simulation, aber ich hoffe das ist erstmal unwichtig.
In meiner Datenreihe werden dabei verschiedene Events dargestellt. Hier ist der erste Datensatz dargestellt, wobei bei "0" mit zählen begonnen wird (bis zum Ende können es über 10.000 sein).
Ich möchte aus dem Teil danach lediglich die erste ID (von sat1) und die zweite ID (von sat2) sowie das ergebnis von "same_operator" (true/false) auslesen und vllt. wie in Excel in eine Zeile einer Tabelle schreiben.
Ganz am Ende des Datensatzes kommt anschließend noch ein Teil, in dem den ID´s verschiedene Eigenschaften zugeordnet werden (Beispiel weiter unten abgebildet).
Aus diesem unteren Teil würde ich gerne die dick makierten Eigenschaften herausfiltern jedem Event weiter zuordnen.
Das Script muss dabei erkennen, dass der "event data" Teil zu Ende ist und der "satellite_data" Teil beginnt.
Am Ende soll eine Art Tabelle entstehen, welche nacheinander alle Events auflistet:

Event Nummer / ID1 / ID2 / operator_group_no1 / operator_country_no1 / orbit_type / satellite_type / expected_life_time

Ich hoffe sehr, dass mir jemand helfen kann, da ich eigentlich nicht die Zeit habe mich jetzt noch in Python einzuarbeiten.
Vielen Lieben Dank schonmal im voraus!


"event_data": {
"0": {
"sim_time": "830 seconds",
"time": "2021-01-01T00:13:50",
"same_operator": "True",
"miss_distance": "0.1556",
"sat1": {
"ID": "100043574",
"state": {
"x": -525.11474,
"y": -42.72384,
"z": 7125.88384,
"vx": 4.39253,
"vy": -6.03871,
"vz": 0.28718
},
"kepler": {
"a": 7152.77135,
"e": 0.00104062,
"i": 1.50785,
"RAAN": 2.2021,
"aPer": 1.57084,
"f": 6.24458
},
"mass": "860.0",
"propellantMass": "160.0",
"mission_phase": "1"
},
"sat2": {
"ID": "100043929",
"state": {
"x": -525.10253,
"y": -42.87892,
"z": 7125.88759,
"vx": -3.36969,
"vy": -6.6637,
"vz": -0.28811
},
"kepler": {
"a": 7152.77568,
"e": 0.0010407,
"i": 1.50793,
"RAAN": 1.10019,
"aPer": 1.57086,
"f": 0.03861
},
"mass": "860.0",
"propellantMass": "160.0",
"mission_phase": "1"
}
},
"1": {
"sim_time": "1841 seconds",
"time": "2021-01-01T00:30:41",
"same_operator": "False",
"miss_distance": "0.6642",
"sat1": {
"ID": "100043167",
"state": {
"x": -960.02371,

-------------------------------------------------------------------------------------

"100043574": {
"name": "IRIDIUM 154",
"norad_id": "43574",
"operator_no1": "Iridium Communications, Inc.",
"operator_group_no1": "Commercial",
"operator_country_no1": "US",
"operator_no2": "Iridium Communications, Inc.",
"operator_group_no2": "nan",
"operator_country_no2": "nan",
"country_UN_register": "UNITED STATES OF AMERICA",
"mission_type": "Communication",
"mission_type_specification": "Niche Communication",
"orbit_type": "Polar",
"satellite_type": "Medium Satellite",
"launch_date": "2018-07-25T00:00:00.000000",
"expected_life_time": "473040000.0",
"mass_init": "860.0",
"dimension": {
"x": "1.5",
"y": "3.1",
"z": "9.4"
},
"av_crosssection": "6.6628",
"drag_coef": "2.2",
"ballistic_coef": "1.704e-08",
"propellant_mass_init": "160.0",
"initial_propellant_mass_fraction": "0.18604651162790697",
"propulsion_type": "1.0",
"specific_impulse": "None",
"thrust_average": "None",
"mission_phase": "1",
"station_keeping_threshold": "[None, 0.3333333333333333, None, None]"
},
"100043575": {
"name": "IRIDIUM 163",
"norad_id": "43575",
"operator_no1": "Iridium Communications, Inc.",
"operator_group_no1": "Commercial",
"operator_country_no1": "US",
"operator_no2": "Iridium Communications, Inc.",
"operator_group_no2": "nan",
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

@RQGoldstyle: wenn Dein Betreuer meint, dass das Teil Deiner Meisterarbeit ist, dann mußt Du Dich wohl oder übel soweit in Python einarbeiten, um diese Aufgabe zu erledigen.
Hast Du Dir schon die Datenstruktur angeschaut, die Du bekommst, wenn Du die json-Datei mit json.load lädst?
Wie sieht Dein Python-Programm bisher aus und wo kommst Du konkret nicht weiter?
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RQGoldstyle: Du willst also was mit Python machen ohne was mit Python machen zu wollen. Das wird nicht gehen. Du wirst nicht darum herum kommen die Grundlagen zu lernen, es sei denn, das schreibt jemand anderes für Dich.

Grundlagen sind hier mindestens mal die üblichen Kontrollstrukturen wie Schleifen & Co, und die Grunddatentypen von Python, denn da hast Du ja mindestens mal mit Wörterbüchern (`dict`), Listen (`list`), und Zeichenketten zu tun. Falls Listen nicht schon von der JSON-Struktur vorkommen, werden die beim vorbereiten der Daten in Form einer 2D-Tabelle interessant. Und vielleicht auch Zahlen, denn JSON garantiert keine Reihenfolge von Schlüsseln bei JSON-Objekten. Also auch wenn das alles zufällig richtig sortiert erscheinen sollte, würde ich das Ergebnis explizit nach der Event-Nummer sortieren, bevor es in eine Datei geschrieben wird. Es sei denn es wäre auch okay, wenn die nicht zwingen in aufsteigender Reihenfolge gespeichert werden müssen.

Das erkennen das er "event_data"-Teil zuende ist, ist kein Problem, denn das sind ja strukturierte Daten. Deswegen nimmt man ja JSON für solche Sachen.

Konkret zum Zugriff kann man nichts sagen, denn wir kennen die Struktur oberhalb des gezeigten nicht.

Also: Python-Grundlagen lernen. Da gibt's ein Tutorial in der Python-Dokumentation. Dann die Daten einlesen (`json`-Modul), Code schreiben, der die Ereignisse durchgeht und die nötigen Daten zusammensammelt und in verschachtelte Listen überführt, also eine Liste für die Datensätze, mit einer Liste pro Datensatz. Und diese Daten dann mit hilfe des `csv`-Moduls in eine Datei schreiben.

So als Grundgerüst (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import json


def main():
    with open("test.json", "rb") as file:
        data = json.load(file)

    event_id_to_event_data = ...
    satellite_id_to_satellite_data = ...
    
    rows = []
    for event_id, event_data in event_id_to_event_data.items():
        satellite_id = event_data["sat1"]["ID"]
        satellite_data = satellite_id_to_satellite_data[satellite_id]
        rows.append(
            [
                event_id,
                event_data["same_operator"],
                satellite_id,
                event_data["sat2"]["ID"],
                satellite_data["operator_group_no1"],
                satellite_data["operator_country_no1"],
                satellite_data["orbit_type"],
                satellite_data["satellite_type"],
                satellite_data["expected_life_time"],
                satellite_data["propulsion_type"],
            ]
        )

    rows.sort(key=lambda row: int(row[0]))

    with open("test.csv", "w", encoding="utf-8", newline="") as file:
        csv.writer(file).writerows(rows)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten