%% Copyright 2021-2024 Tobias Enderle
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\usepackage{pyluatex}
\usepackage{booktabs}

\usepackage{url}
\urldef\dataurl\url{https://population.un.org/wpp/Download/Files/1_Indicators%20(Standard)/CSV_FILES/WPP2019_TotalPopulationBySex.csv}

\begin{python}
import pandas as pd
import datetime

def pgf_coords(x, y):
    return ' '.join(f'({a},{b})' for a, b in zip(x, y))

file = 'population.csv'
df = pd.read_csv(file)
data = df.set_index(['Location', 'Time']).sort_index()
world_data = data.loc['World']

year = datetime.datetime.now().year
current_pop = world_data.loc[year].PopTotal

diffs = world_data.PopTotal.diff()
highest_increase_year = diffs.idxmax()
highest_increase = diffs.max() / 1e3
\end{python}

\title{PyLuaTeX Example -- Data Visualization}
\author{Tobias Enderle}

\begin{document}

\maketitle

This document demonstrates how data can be visualized flexibly in a \LaTeX{}
document with the help of the Python package \emph{pandas} and the \LaTeX{}
package \emph{pgfplots}.

We show some statistics of the United Nations' \emph{World Population Prospects}%
\footnote{United Nations, Department of Economic and Social Affairs, Population
Division (2019). World Population Prospects 2019, Online Edition. Rev.\ 1.} in the
form of plots, tables or individual values.
The data file \texttt{\py{file}} is a subset of the file
\texttt{WPP2019\_TotalPopulationBySex.csv}\footnote{\dataurl{} (last accessed:
2021/07/04)}.

The following plot shows the estimated world population between \py{df.Time.iloc[0]}
and \py{df.Time.iloc[-1]}. The red lines mark the current year and population.

\begin{center}
\begin{tikzpicture}
\begin{axis}[
    width=\textwidth,
    height=0.7\textwidth,
    enlarge x limits=false,
    ymin=0,
    ylabel={Estimated world population in billions},
    xlabel={Year},
    xticklabel style={/pgf/number format/1000 sep=},
    grid=both,
]
\addplot[no marks,black,thick] coordinates {
    \py{pgf_coords(world_data.index, world_data.PopTotal / 1e6)}
};
\draw[red,thick] (axis cs:\py{year},0) |- (axis cs:0,\py{current_pop / 1e6});
\end{axis}
\end{tikzpicture}
\end{center}

The year with the highest increase of \py{round(highest_increase)} million people
was \py{highest_increase_year}. The world population is expected to reach a value
of \py{round(world_data.loc[2100].PopTotal / 1e6, 2)} billion by 2100.

The following table shows the total as well as the male and female population at
the beginning of each decade. The values are given in thousands.
\begin{center}
\begin{python}
table_data = world_data.iloc[::10].reset_index()
table_data = table_data[['Time', 'PopTotal', 'PopMale', 'PopFemale']]
table_data.columns = ['Year', 'Total (thousands)', 'Male (thousands)', 'Female (thousands)']
table = table_data.style.hide(axis='index').format(
    formatter={
        'Total (thousands)': '{:,.0f}',
        'Male (thousands)': '{:,.0f}',
        'Female (thousands)': '{:,.0f}'
    }
).to_latex(hrules=True)
print(table)
\end{python}
\end{center}

The plot below shows the estimated population of China and the United States
of America (USA). The numbers are given in millions.
\begin{center}
\begin{python}
marker_year = 2030
plots = [
    ('China', data.loc['China'].PopTotal / 1e3),
    ('USA', data.loc['United States of America'].PopTotal / 1e3)
]
\end{python}
\begin{tikzpicture}
\begin{axis}[
    width=\textwidth,
    height=0.55\textwidth,
    enlarge x limits=false,
    ymin=0,
    ylabel={Estimated population in millions},
    xlabel={Year},
    xticklabel style={/pgf/number format/1000 sep=},
    grid=both,
]
\pgfplotsinvokeforeach{0,1}{
    \addplot[no marks,black,thick] coordinates {
        \py{pgf_coords(plots[#1][1].index, plots[#1][1])}
    };
    \node[below] at (axis cs:\py{marker_year},\py{plots[#1][1].loc[marker_year]})
        {\py{plots[#1][0]}};
}
\end{axis}
\end{tikzpicture}
\end{center}

\end{document}
