#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]}")]}