Home > Software engineering >  JSON iteration with different format Python
JSON iteration with different format Python

Time:10-29

I have a JSON feed i need to collect data from but I am running into some issues with iterating and parsing the API data.

The function below collects what I need but some horses get scratched (dont race) and the format of their JSON is different to horses who's status is "Starter".

def race_data():

    for race_key in races_list():
        data = requests.get(f'{Base_url}events/{race_key}.json?app_id={AppID}&app_key={AppKey}').text

        # parse race data
        data = json.loads(data)

        for race_odds in data['competitors']:
            horse_name = race_odds['name']
            jockey_name = race_odds['jockey']
            jockey_weight = race_odds['weight']
            trainer_name = race_odds['trainer']
            fixed_win_odds = race_odds['prices'][2]['price']
            fixed_place_odds = race_odds['prices'][0]['price']
            race_key = data['eventKey']
            race_time = data['eventDateTimeUtc']
            horse_status = race_odds['status']

            print(f'{race_key} {horse_name} {jockey_name} {jockey_weight} {trainer_name} {fixed_win_odds} {fixed_place_odds} {race_time} {horse_status}')


if __name__ == "__main__":
    race_data()

which produces

202210290200.T.AUS.quirindi.1 Ponte Pietra Jai Williams 0 Nikki Pollock 1.1 16.0 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Gundawarra Vad Bolozhinskyi 0 G A O'brien 4.5 35.0 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Cemented Ms Chelsea Hillier 0 Sally Torrens 2.5 35.0 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Jack Duggan Ms Madeline Owen 0 J C Deamer 1.1 2.7 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Northern Borders Ms Zara Lewis 0 W T Martyn 9.6 68.1 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Iffland Ms Amelia Denby 0 K A Lees 1.9 19.4 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 La Brea Benjamin Osmond 0 K A Lees 2.1 14.0 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 My Gem Jacob Golden 0 Ms S Grills 2.8 16.1 2022-10-29T02:55:00Z Starter
202210290200.T.AUS.quirindi.1 Another Super Patrick Scorse 0 M J Dwyer 4.9 87.5 2022-10-29T02:55:00Z Starter

I run into an issue when one of the runners is scratched (not racing)

the problem is with the odds price field. When a horse is scratched (defined in horse_status)

fixed_win_odds = race_odds['prices'][2]['price']
fixed_place_odds = race_odds['prices'][0]['price']

The JSON below is for a horse that is scratched:

{
    "status": "Scratched",
    "startPos": 3,
    "trainer": "Ms L Selby",
    "shortForm": "0608247373",
    "sequence": 7,
    "weight": "0",
    "name": "Bingo Banko",
    "jockey": "Unknown",
    "prices": 
    [
        {
            "betType": "FixedPlace",
            "code": "FXD",
            "flucs": [],
            "price": 0
        },
        {
            "betType": "FixedWin",
            "code": "FXD",
            "flucs": 
            [
                {
                    "price": 0,
                    "productType": "Current"
                },
                {
                    "price": 16,
                    "productType": "Max"
                },
                {
                    "price": 16,
                    "productType": "Open"
                },
                {
                    "price": 15,
                    "productType": "Last"
                },
                {
                    "price": 16,
                    "productType": "Last"
                }
            ],
            "price": 0
        }
    ],
    "id": "competitor:202210290200.T.AUS.quirindi.1.bingo_banko",
    "competitorKey": "202210290200.T.AUS.quirindi.1.bingo_banko"
}

and this is what the JSON looks like when the horse is a starter (not scratched)

{
    "status": "Starter",
    "startPos": 9,
    "trainer": "M J Dwyer",
    "shortForm": "7626280005",
    "sequence": 6,
    "weight": "0",
    "name": "Another Super",
    "jockey": "Patrick Scorse",
    "prices": 
    [
        {
            "betType": "Win",
            "code": "BT3",
            "flucs": [],
            "price": 85
        },
        {
            "betType": "FixedPlace",
            "code": "FXD",
            "flucs": [],
            "price": 3.9
        },
        {
            "betType": "Place",
            "code": "BT2P",
            "flucs": [],
            "price": 5.7
        },
        {
            "betType": "FixedWin",
            "code": "FXD",
            "flucs": 
            [
                {
                    "price": 17,
                    "productType": "Current"
                },
                {
                    "price": 20,
                    "productType": "Max"
                },
                {
                    "price": 19,
                    "productType": "Open"
                },
                {
                    "price": 17,
                    "productType": "Last"
                },
                {
                    "price": 18,
                    "productType": "Last"
                },
                {
                    "price": 17,
                    "productType": "Last"
                },
                {
                    "price": 16,
                    "productType": "Last"
                },
                {
                    "price": 15,
                    "productType": "Last"
                }
            ],
            "price": 17
        }
    ],
    "id": "competitor:202210290200.T.AUS.quirindi.1.another_super",
    "competitorKey": "202210290200.T.AUS.quirindi.1.another_super"
}

I still need to collect the information on the horses that are scratched, so need some help with formatting the iteration to collect the data without getting key error on horses that are scratched.

you can view the full JSON for a race below for reference:


[
    {
        "status": "Starter",
        "startPos": 5,
        "trainer": "Nikki Pollock",
        "shortForm": "x686623464",
        "sequence": 3,
        "weight": "0",
        "name": "Ponte Pietra",
        "jockey": "Jai Williams",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 15.6
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 2.6
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 1.04
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 10,
                        "productType": "Current"
                    },
                    {
                        "price": 16,
                        "productType": "Max"
                    },
                    {
                        "price": 16,
                        "productType": "Open"
                    },
                    {
                        "price": 10,
                        "productType": "Last"
                    },
                    {
                        "price": 9,
                        "productType": "Last"
                    },
                    {
                        "price": 9,
                        "productType": "Last"
                    },
                    {
                        "price": 8,
                        "productType": "Last"
                    },
                    {
                        "price": 8,
                        "productType": "Last"
                    }
                ],
                "price": 10
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.ponte_pietra",
        "competitorKey": "202210290200.T.AUS.quirindi.1.ponte_pietra"
    },
    {
        "status": "Starter",
        "startPos": 4,
        "trainer": "G A O'brien",
        "shortForm": "90x4491",
        "sequence": 4,
        "weight": "0",
        "name": "Gundawarra",
        "jockey": "Vad Bolozhinskyi",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 34
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 1.45
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 11
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 3,
                        "productType": "Current"
                    },
                    {
                        "price": 3,
                        "productType": "Max"
                    },
                    {
                        "price": 3,
                        "productType": "Open"
                    },
                    {
                        "price": 3,
                        "productType": "Last"
                    },
                    {
                        "price": 3,
                        "productType": "Last"
                    },
                    {
                        "price": 3,
                        "productType": "Last"
                    },
                    {
                        "price": 3,
                        "productType": "Last"
                    },
                    {
                        "price": 3,
                        "productType": "Last"
                    }
                ],
                "price": 3.7
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.gundawarra",
        "competitorKey": "202210290200.T.AUS.quirindi.1.gundawarra"
    },
    {
        "status": "Starter",
        "startPos": 6,
        "trainer": "Sally Torrens",
        "shortForm": "7816x64858",
        "sequence": 1,
        "weight": "0",
        "name": "Cemented",
        "jockey": "Ms Chelsea Hillier",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 85
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 3.1
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 3
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 13,
                        "productType": "Current"
                    },
                    {
                        "price": 19,
                        "productType": "Max"
                    },
                    {
                        "price": 19,
                        "productType": "Open"
                    },
                    {
                        "price": 13,
                        "productType": "Last"
                    },
                    {
                        "price": 14,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 15,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    }
                ],
                "price": 13
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.cemented",
        "competitorKey": "202210290200.T.AUS.quirindi.1.cemented"
    },
    {
        "status": "Starter",
        "startPos": 2,
        "trainer": "J C Deamer",
        "shortForm": "75x5456x73",
        "sequence": 2,
        "weight": "0",
        "name": "Jack Duggan",
        "jockey": "Ms Madeline Owen",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 3
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 1.14
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 1.04
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 1,
                        "productType": "Current"
                    },
                    {
                        "price": 1,
                        "productType": "Max"
                    },
                    {
                        "price": 1,
                        "productType": "Open"
                    },
                    {
                        "price": 1,
                        "productType": "Last"
                    },
                    {
                        "price": 1,
                        "productType": "Last"
                    },
                    {
                        "price": 1,
                        "productType": "Last"
                    },
                    {
                        "price": 1,
                        "productType": "Last"
                    },
                    {
                        "price": 1,
                        "productType": "Last"
                    }
                ],
                "price": 1.8
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.jack_duggan",
        "competitorKey": "202210290200.T.AUS.quirindi.1.jack_duggan"
    },
    {
        "status": "Starter",
        "startPos": 10,
        "trainer": "W T Martyn",
        "shortForm": "00409",
        "sequence": 8,
        "weight": "0",
        "name": "Northern Borders",
        "jockey": "Ms Zara Lewis",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 116
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 8
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 9
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 41,
                        "productType": "Current"
                    },
                    {
                        "price": 51,
                        "productType": "Max"
                    },
                    {
                        "price": 34,
                        "productType": "Open"
                    },
                    {
                        "price": 41,
                        "productType": "Last"
                    },
                    {
                        "price": 51,
                        "productType": "Last"
                    },
                    {
                        "price": 41,
                        "productType": "Last"
                    },
                    {
                        "price": 51,
                        "productType": "Last"
                    },
                    {
                        "price": 41,
                        "productType": "Last"
                    }
                ],
                "price": 41
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.northern_borders",
        "competitorKey": "202210290200.T.AUS.quirindi.1.northern_borders"
    },
    {
        "status": "Starter",
        "startPos": 8,
        "trainer": "K A Lees",
        "shortForm": "6",
        "sequence": 9,
        "weight": "0",
        "name": "Iffland",
        "jockey": "Ms Amelia Denby",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 33.5
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 3.3
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 1.7
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 14,
                        "productType": "Current"
                    },
                    {
                        "price": 20,
                        "productType": "Max"
                    },
                    {
                        "price": 17,
                        "productType": "Open"
                    },
                    {
                        "price": 14,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 14,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 14,
                        "productType": "Last"
                    }
                ],
                "price": 14
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.iffland",
        "competitorKey": "202210290200.T.AUS.quirindi.1.iffland"
    },
    {
        "status": "Starter",
        "startPos": 7,
        "trainer": "K A Lees",
        "shortForm": "55x570x58",
        "sequence": 10,
        "weight": "0",
        "name": "La Brea",
        "jockey": "Benjamin Osmond",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 43.3
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 2.6
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 1.9
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 10,
                        "productType": "Current"
                    },
                    {
                        "price": 13,
                        "productType": "Max"
                    },
                    {
                        "price": 11,
                        "productType": "Open"
                    },
                    {
                        "price": 10,
                        "productType": "Last"
                    },
                    {
                        "price": 9,
                        "productType": "Last"
                    },
                    {
                        "price": 9,
                        "productType": "Last"
                    },
                    {
                        "price": 8,
                        "productType": "Last"
                    },
                    {
                        "price": 9,
                        "productType": "Last"
                    }
                ],
                "price": 10
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.la_brea",
        "competitorKey": "202210290200.T.AUS.quirindi.1.la_brea"
    },
    {
        "status": "Starter",
        "startPos": 1,
        "trainer": "Ms S Grills",
        "shortForm": "673410x084",
        "sequence": 5,
        "weight": "0",
        "name": "My Gem",
        "jockey": "Jacob Golden",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 14.9
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 3.7
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 3.2
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 16,
                        "productType": "Current"
                    },
                    {
                        "price": 16,
                        "productType": "Max"
                    },
                    {
                        "price": 13,
                        "productType": "Open"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 15,
                        "productType": "Last"
                    },
                    {
                        "price": 14,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 15,
                        "productType": "Last"
                    }
                ],
                "price": 16
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.my_gem",
        "competitorKey": "202210290200.T.AUS.quirindi.1.my_gem"
    },
    {
        "status": "Starter",
        "startPos": 9,
        "trainer": "M J Dwyer",
        "shortForm": "7626280005",
        "sequence": 6,
        "weight": "0",
        "name": "Another Super",
        "jockey": "Patrick Scorse",
        "prices": 
        [
            {
                "betType": "Win",
                "code": "BT3",
                "flucs": [],
                "price": 85
            },
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 3.9
            },
            {
                "betType": "Place",
                "code": "BT2P",
                "flucs": [],
                "price": 5.7
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 17,
                        "productType": "Current"
                    },
                    {
                        "price": 20,
                        "productType": "Max"
                    },
                    {
                        "price": 19,
                        "productType": "Open"
                    },
                    {
                        "price": 17,
                        "productType": "Last"
                    },
                    {
                        "price": 18,
                        "productType": "Last"
                    },
                    {
                        "price": 17,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    },
                    {
                        "price": 15,
                        "productType": "Last"
                    }
                ],
                "price": 17
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.another_super",
        "competitorKey": "202210290200.T.AUS.quirindi.1.another_super"
    },
    {
        "status": "Scratched",
        "startPos": 3,
        "trainer": "Ms L Selby",
        "shortForm": "0608247373",
        "sequence": 7,
        "weight": "0",
        "name": "Bingo Banko",
        "jockey": "Unknown",
        "prices": 
        [
            {
                "betType": "FixedPlace",
                "code": "FXD",
                "flucs": [],
                "price": 0
            },
            {
                "betType": "FixedWin",
                "code": "FXD",
                "flucs": 
                [
                    {
                        "price": 0,
                        "productType": "Current"
                    },
                    {
                        "price": 16,
                        "productType": "Max"
                    },
                    {
                        "price": 16,
                        "productType": "Open"
                    },
                    {
                        "price": 15,
                        "productType": "Last"
                    },
                    {
                        "price": 16,
                        "productType": "Last"
                    }
                ],
                "price": 0
            }
        ],
        "id": "competitor:202210290200.T.AUS.quirindi.1.bingo_banko",
        "competitorKey": "202210290200.T.AUS.quirindi.1.bingo_banko"
    }
]

thanks for your assistance.

CodePudding user response:

Use a for loop to iterate through the prices, and check the betType key to see if it's either FixedWin or FixedPlace, that way the ordering of the different prices doesn't matter.

Also since the race_key and the race event are always the same you should define them at the top of the function so your implementation doesn't need to keep checking the dictionary for them.


def race_data():
    for race_key in races_list():
        data = requests.get(f'{Base_url}events/{race_key}.json?app_id={AppID}&app_key={AppKey}').text

        # parse race data
        data = json.loads(data)

        race_key = data['eventKey']
        race_time = data['eventDateTimeUtc']
        for race_odds in data:
            horse_name = race_odds['name']
            jockey_name = race_odds['jockey']
            jockey_weight = race_odds['weight']
            trainer_name = race_odds['trainer']
            for price in race_odds['prices']:
                if price["betType"] == "FixedWin":
                    fixed_win_odds = price["price"]
                elif price["betType"] == "FixedPlace":
                    fixed_place_odds = price["price"]
             horse_status = race_odds['status']

             print(f'{race_key} {horse_name} {jockey_name} {jockey_weight} {trainer_name} {fixed_win_odds} {fixed_place_odds} {race_time} {horse_status}')


if __name__ == "__main__":
    race_data()
  • Related