3.3. To JSON

  • File paths works also with DATAs

3.3.1. SetUp

>>> import pandas as pd
>>>
>>>
>>> df = pd.DataFrame([
...     {'firstname': 'Mark',    'lastname': 'Watney',   'role': 'botanist'},
...     {'firstname': 'Melissa', 'lastname': 'Lewis',    'role': 'commander'},
...     {'firstname': 'Rick',    'lastname': 'Martinez', 'role': 'pilot'},
... ])
>>>
>>> df
  firstname  lastname       role
0      Mark    Watney   botanist
1   Melissa     Lewis  commander
2      Rick  Martinez      pilot

3.3.2. Example

>>> df.to_json('/tmp/myfile.json')
$ cat /tmp/myfile.json
{"firstname":{"0":"Mark","1":"Melissa","2":"Rick"},"lastname":{"0":"Watney","1":"Lewis","2":"Martinez"},"role":{"0":"botanist","1":"commander","2":"pilot"}}

3.3.3. Formatting

>>> df.to_json('/tmp/myfile.json',
...            indent=2,
...            date_format='iso',
... )
$ cat /tmp/myfile.json
{
  "firstname":{
    "0":"Mark",
    "1":"Melissa",
    "2":"Rick"
  },
  "lastname":{
    "0":"Watney",
    "1":"Lewis",
    "2":"Martinez"
  },
  "role":{
    "0":"botanist",
    "1":"commander",
    "2":"pilot"
  }
}

3.3.4. Assignments

# FIXME: Zrobić jakiś dataframe z prostszymi danymi bez .head() i .tail(). np. martian. W danych powinny być: str, int, bool, float, datetime oraz None

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -v myfile.py`

# %% About
# - Name: DataFrame Export JSON
# - Difficulty: easy
# - Lines: 3
# - Minutes: 3

# %% English
# 1. Read data from `DATA` as `result: pd.DataFrame`
# 2. While reading use `header=0` parameter
# 3. Select 146 head rows, and last 11 from it
# 4. Export data from column `Event` to file the `FILE`
# 5. Data has to be in JSON format
# 6. Run doctests - all must succeed

# %% Polish
# 1. Wczytaj dane z `DATA` jako `result: pd.DataFrame`
# 2. Przy wczytywaniu użyj parametru `header=0`
# 3. Wybierz pierwszych 146 wierszy, a z nich ostatnie 11
# 4. Wyeksportuj dane z kolumny `Event` do pliku `FILE`
# 5. Dane mają być w formacie JSON
# 6. Uruchom doctesty - wszystkie muszą się powieść

# %% Tests
"""
>>> import sys; sys.tracebacklimit = 0
>>> from os import remove
>>> import json

>>> result = open(FILE).read()
>>> remove(FILE)

>>> assert result is not Ellipsis, \
'Assign result to variable: `result`'
>>> assert type(result) is str, \
'Variable `result` has invalid type, should be `str`'

>>> json.loads(result)  # doctest: +NORMALIZE_WHITESPACE
{'135': 'LM lunar landing.',
 '136': 'LM powered descent  engine cutoff.',
 '137': 'Decision made to  proceed with EVA prior to first rest period.',
 '138': 'Preparation for EVA  started.',
 '139': 'EVA started (hatch  open).',
 '140': 'CDR completely outside  LM on porch.',
 '141': 'Modular equipment  stowage assembly deployed (CDR).',
 '142': 'First clear TV picture  received.',
 '143': 'CDR at foot of ladder  (starts to report, then pauses to listen).',
 '144': 'CDR at foot of ladder  and described surface as almost like a powder.',
 '145': "1st step  taken lunar surface (CDR). That\'s one small step for a man...one giant leap  for mankind."}
"""

import pandas as pd

DATA = 'https://python3.info/_static/apollo11.html'
FILE = r'_temporary.json'

# Dump DATA to FILE in JSON format
# type: pd.DataFrame
result = ...