Реструктуризация фреймов данных (хранится в словаре)

#pandas #dictionary

Вопрос:

у меня есть данные о футболе, хранящиеся в словаре, составленном по лигам за разные сезоны. Так, например, у меня есть результаты 1 лиги за сезоны 2017-2020 годов в одном фрейме данных, хранящемся в словаре. Теперь мне нужно создавать новые кадры данных по сезонам, чтобы у меня были все результаты с 2019 года в одном кадре данных. Каков наилучший способ сделать это?

Спасибо!

Комментарии:

1. Вы должны предоставить нам некоторый образец ваших данных и написать, что вы пробовали до сих пор.

Ответ №1:

  • предполагая, что вы используете открытый футбол в качестве источника
  • используйте API GitHub для получения всех файлов в репозитории
  • функция для нормализации JSON
  • просто сгенерировать либо объединенный DF, либо диктант всех результатов
 import requests
import pandas as pd

# normalize footbal scores data into a dataframe
def structuredf(res):
    js = res.json()

    if "rounds" not in res.json().keys():
        return (pd.json_normalize(js["matches"])
                .pipe(lambda d: d.loc[:,].join(d["score.ft"].apply(pd.Series).rename(columns={0:"home",1:"away"})))
                .drop(columns="score.ft")
                .rename(columns={"round":"name"})
                .assign(seasonname=js["name"], url=res.url)
               )
    df = (pd.json_normalize(pd.json_normalize(js["rounds"])
                            .explode("matches").to_dict("records"))
          .assign(seasonname=js["name"], url=res.url)
          .pipe(lambda d: d.loc[:,].join(d["matches.score.ft"].apply(pd.Series).rename(columns={0:"home",1:"away"})))
          .drop(columns="matches.score.ft")
          .pipe(lambda d: d.rename(columns={c:c.split(".")[-1] for c in d.columns}))
         )
    return df

# get listing of all datafiles that we're interested in
res = requests.get("https://api.github.com/repos/openfootball/football.json/git/trees/master?recursive=1")
dfm = pd.DataFrame(res.json()["tree"])

# concat into one dataframe
df = pd.concat([structuredf(res) 
                for p in dfm.loc[dfm["path"].str.contains(r".en.[0-9] .json"), "path"].iteritems()
               for res in [requests.get(f"https://raw.githubusercontent.com/openfootball/football.json/master/{p[1]}")]])

# dictionary of dataframe
d = {res.json()["name"]:structuredf(res) 
                for p in dfm.loc[dfm["path"].str.contains(r".en.[0-9] .json"), "path"].iteritems()
               for res in [requests.get(f"https://raw.githubusercontent.com/openfootball/football.json/master/{p[1]}")]}