<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Tech - JSON - XML
Transmettre l'information d'une machine à une autre, d'un logiciel à un autre, d'une base de données à une autre est un problème récurrent. Le format le plus simple pour des données est le format csv. Ca marche bien pour les tables mais cela ne permet de transmettre aisément des données non structurées.
Step1:  Enoncé
Step2:  Q1 
Step3:  Q2 
Step4:  Q3 
Step5:  La question sous-jacente est 
Step6:  Q2 
Step7:  Q3 
Step8:  Q4 
Step9:  Q5 
Step10:  Q6 
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Explanation: Tech - JSON - XML
Transmettre l'information d'une machine à une autre, d'un logiciel à un autre, d'une base de données à une autre est un problème récurrent. Le format le plus simple pour des données est le format csv. Ca marche bien pour les tables mais cela ne permet de transmettre aisément des données non structurées.
End of explanation
from sklearn.datasets import load_iris as load_data
from pandas import DataFrame
data = load_data()
df = DataFrame(data.data, columns=data.feature_names)
df['fleur'] = [data.target_names[t] for t in data.target]
df.tail()
Explanation: Enoncé
End of explanation
from io import StringIO
buffer = StringIO()
df.to_csv(buffer, index=False)
text = buffer.getvalue()
text[:300]
Explanation: Q1 : écriture des données au format CSV
Le plus simple...
End of explanation
r = df.to_json(orient='records')
r[:400]
Explanation: Q2 : écriture des données au format JSON
End of explanation
locations = {'virginica': ['Florida', 'Georgia'],
             'setosa': ['Maine', 'Alaska', 'Quebec'],
             'versicolor': ['Quebec', 'Georgia', 'Ireland', 'Main']}
Explanation: Q3 : relire les données avec le module json
Q4 : essayez avec les format XML (ou HTML), SQL, SAS, Excel...
Q5 : données non structurées
On ajoute les endroits où ces fleurs sont présentes. On voudrait que toutes les informations soient présentes dans le même fichier. Comment fait-on ?
End of explanation
from io import StringIO
buffer = StringIO()
df.to_csv(buffer, index=False)
text = buffer.getvalue()
text[:300]
df.to_csv("fleurs.csv", index=False)
import os
os.listdir(".")
import pandas
df2 = pandas.read_csv("fleurs.csv")
df2.head()
virtuel = StringIO(text)
df3 = pandas.read_csv(virtuel)
df3.head()
Explanation: La question sous-jacente est : vaut-il mieux avoir deux fichiers plats, l'un pour les données décrivant les fleurs, l'autre pour les localisations ou un seul fusionnant les deux informations ?
Q6 : le texte, ça prend trop de place, zippons
Avec le module zipfile.
Q7 : que vous inspire protobuf ?
Ou flatbuffers, MessagePack
Réponses
Q1 : écriture des données au format CSV
End of explanation
json_text = df.to_json(orient='records')
json_text[:400]
Explanation: Q2 : écriture des données au format JSON
End of explanation
import json
res = json.loads(json_text)
for i, r in enumerate(res):
    print(i, type(r), r)
    if i >= 5:
        break
res[3]['sepal width (cm)']
virtuel = StringIO(json_text)
res2 = json.load(virtuel)
res2[:3]
Explanation: Q3 : relire les données avec le module json
End of explanation
html_text = df.to_html(index=False)
print(html_text[:500])
df_html = pandas.read_html(html_text)
df_html[0].tail()
df_html = pandas.read_html(html_text + html_text)
len(df_html)
Explanation: Q4 : essayez avec les format XML (ou HTML), SQL, SAS, Excel...
End of explanation
df.head()
locations = {'virginica': ['Florida', 'Georgia'],
             'setosa': ['Maine', 'Alaska', 'Quebec'],
             'versicolor': ['Quebec', 'Georgia', 'Ireland', 'Main']}
obs = []
for fleur, loc in locations.items():
    for l in loc:
        obs.append({"fleur": fleur, "location": l})
obs
df_locations = pandas.DataFrame(obs)
df_locations
merged = df.merge(df_locations, left_on="fleur", right_on="fleur")
merged.head(10)
merged.shape
locations
obs2 = []
for fleur, loc in locations.items():
    obs2.append({"fleur": fleur, "location": loc})
obs2
df_locations2 = pandas.DataFrame(obs2)
df_locations2
merged = df.merge(df_locations2, left_on="fleur", right_on="fleur")
merged.head(10)
json_text = merged.to_json(orient='records')
json_text[:200]
df.to_excel("data.xlsx", index=False)
dfe = pandas.read_excel("data.xlsx", engine='openpyxl')
dfe.tail()
Explanation: Q5 : données non structurées
End of explanation
from zipfile import ZipFile
with ZipFile('data.zip', 'w') as myzip:
    myzip.write('data.xlsx')
    myzip.write("2020_json_xml.ipynb")
import glob
glob.glob("*.zip")
Explanation: Q6 : le texte, ça prend trop de place, zippons
End of explanation
<END_TASK>