<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ time series - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ time series - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 24 Jun 2026 15:10:43 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/time-series/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Visualize Air Pollution using Folium Maps - An In Depth Tutorial ]]>
                </title>
                <description>
                    <![CDATA[ By Bert Carremans In my previous story on forecasting air pollution, I looked into using recurrent neural networks (RNN and LSTM) to forecast air pollution in Belgium. As a small side project, I thought it would be interesting to plot the air polluti... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/visualizing-air-pollution-folium-maps/</link>
                <guid isPermaLink="false">66d45de3c7632f8bfbf1e405</guid>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ data visualization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Folium ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GeoJSON ]]>
                    </category>
                
                    <category>
                        <![CDATA[ time series ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 03 Jan 2020 21:59:44 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/01/0_PlMoYJ9MPTjB_2Ju.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Bert Carremans</p>
<p>In my previous story on <a target="_blank" href="https://www.freecodecamp.org/news/forecasting-air-pollution-recurrent-neural-networks/">forecasting air pollution</a>, I looked into using recurrent neural networks (RNN and LSTM) to forecast air pollution in Belgium. As a small side project, I thought it would be interesting to <strong>plot the air pollution over time on a map</strong>. The <a target="_blank" href="http://python-visualization.github.io/folium/">Folium package</a> is a great tool for doing that.</p>
<p>We will plot the quantities of 6 air pollutants in Belgium:</p>
<ul>
<li><strong>Ozone (O3)</strong></li>
<li><strong>Nitrogen Dioxide (NO2)</strong></li>
<li><strong>Carbon Monoxide (CO)</strong></li>
<li><strong>Sulphur Dioxide (SO2)</strong></li>
<li><strong>Particulate Matter (PM10)</strong></li>
<li><strong>Benzene (C6H6)</strong></li>
</ul>
<p>The data is downloaded from the website of the <a target="_blank" href="https://www.eea.europa.eu/data-and-maps/data/aqereporting-2/be">European Environment Agency (EEA)</a>. If you want to use data from other European countries, I encourage you to visit their website. It has datasets for many EU countries and is very well documented.</p>
<p>The datasets we will use are:</p>
<ul>
<li>BE<strong></strong>2013–2015_aggregated_timeseries.csv</li>
<li>BE_2013–2015_metadata.csv</li>
</ul>
<p>The pollutant IDs are described in the <a target="_blank" href="http://dd.eionet.europa.eu/vocabulary/aq/pollutant">EEA’s vocabulary of air pollutants</a>.</p>
<ul>
<li>1 = Sulphur Dioxide</li>
<li>5 = Particulate Matter</li>
<li>7 = Ozone</li>
<li>8 = Nitrogen Dioxide</li>
<li>10 = Carbon Monoxide</li>
<li>20 = Benzene</li>
</ul>
<h1 id="heading-project-set-up">Project set-up</h1>
<h2 id="heading-importing-packages">Importing packages</h2>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> pathlib <span class="hljs-keyword">import</span> Path
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np

<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">import</span> folium
<span class="hljs-keyword">from</span> folium.plugins <span class="hljs-keyword">import</span> TimestampedGeoJson

project_dir = Path(<span class="hljs-string">'/Users/bertcarremans/Data Science/Projecten/air_pollution_forecasting'</span>)
</code></pre>
<h2 id="heading-air-pollutants">Air pollutants</h2>
<p>We’ll make a dictionary of the air pollutants and their dataset number, scientific notation, name, and bin edges. The bin edges are based on the scale on this <a target="_blank" href="https://nl.wikipedia.org/wiki/Luchtvervuiling">Wikipedia page</a>.</p>
<pre><code class="lang-python">pollutants = {
    <span class="hljs-number">1</span>: {
        <span class="hljs-string">'notation'</span> : <span class="hljs-string">'SO2'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Sulphur dioxide'</span>,
        <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">15</span>,<span class="hljs-number">30</span>,<span class="hljs-number">45</span>,<span class="hljs-number">60</span>,<span class="hljs-number">80</span>,<span class="hljs-number">100</span>,<span class="hljs-number">125</span>,<span class="hljs-number">165</span>,<span class="hljs-number">250</span>])
    },
    <span class="hljs-number">5</span>: {
        <span class="hljs-string">'notation'</span> : <span class="hljs-string">'PM10'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Particulate matter &lt; 10 µm'</span>,
        <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">10</span>,<span class="hljs-number">20</span>,<span class="hljs-number">30</span>,<span class="hljs-number">40</span>,<span class="hljs-number">50</span>,<span class="hljs-number">70</span>,<span class="hljs-number">100</span>,<span class="hljs-number">150</span>,<span class="hljs-number">200</span>])
    },
    <span class="hljs-number">7</span>: {<span class="hljs-string">'notation'</span> : <span class="hljs-string">'O3'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Ozone'</span>,
        <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">30</span>,<span class="hljs-number">50</span>,<span class="hljs-number">70</span>,<span class="hljs-number">90</span>,<span class="hljs-number">110</span>,<span class="hljs-number">145</span>,<span class="hljs-number">180</span>,<span class="hljs-number">240</span>,<span class="hljs-number">360</span>])
    },
    <span class="hljs-number">8</span>: {<span class="hljs-string">'notation'</span> : <span class="hljs-string">'NO2'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Nitrogen dioxide'</span>,
        <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">25</span>,<span class="hljs-number">45</span>,<span class="hljs-number">60</span>,<span class="hljs-number">80</span>,<span class="hljs-number">110</span>,<span class="hljs-number">150</span>,<span class="hljs-number">200</span>,<span class="hljs-number">270</span>,<span class="hljs-number">400</span>])
    },
    <span class="hljs-number">10</span>: {<span class="hljs-string">'notation'</span> : <span class="hljs-string">'CO'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Carbon monoxide'</span>,
         <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">1.4</span>,<span class="hljs-number">2.1</span>,<span class="hljs-number">2.8</span>,<span class="hljs-number">3.6</span>,<span class="hljs-number">4.5</span>,<span class="hljs-number">5.2</span>,<span class="hljs-number">6.6</span>,<span class="hljs-number">8.4</span>,<span class="hljs-number">13.7</span>])
    },
    <span class="hljs-number">20</span>: {<span class="hljs-string">'notation'</span> : <span class="hljs-string">'C6H6'</span>,
        <span class="hljs-string">'name'</span> :<span class="hljs-string">'Benzene'</span>,
         <span class="hljs-string">'bin_edges'</span> : np.array([<span class="hljs-number">0.5</span>,<span class="hljs-number">1.0</span>,<span class="hljs-number">1.25</span>,<span class="hljs-number">1.5</span>,<span class="hljs-number">2.75</span>,<span class="hljs-number">3.5</span>,<span class="hljs-number">5.0</span>,<span class="hljs-number">7.5</span>,<span class="hljs-number">10.0</span>])
    }
}
</code></pre>
<h2 id="heading-loading-the-metadata">Loading the metadata</h2>
<p>In the metadata, we have the <strong>coordinates</strong> for every SamplingPoint. We’ll need that information to plot the SamplingPoints on the map.</p>
<pre><code class="lang-python">meta = pd.read_csv(project_dir / <span class="hljs-string">'data/raw/BE_2013-2015_metadata.csv'</span>, sep=<span class="hljs-string">'\t'</span>)
</code></pre>
<h2 id="heading-color-scale">Color scale</h2>
<p>There are 10 bin edges for which we will use a different color. These colors were created with <a target="_blank" href="http://colorbrewer2.org/#type=diverging&amp;scheme=RdBu&amp;n=10">ColorBrewer</a>.</p>
<pre><code class="lang-python">color_scale = np.array([<span class="hljs-string">'#053061'</span>,<span class="hljs-string">'#2166ac'</span>,<span class="hljs-string">'#4393c3'</span>,<span class="hljs-string">'#92c5de'</span>,<span class="hljs-string">'#d1e5f0'</span>,<span class="hljs-string">'#fddbc7'</span>,<span class="hljs-string">'#f4a582'</span>,<span class="hljs-string">'#d6604d'</span>,<span class="hljs-string">'#b2182b'</span>,<span class="hljs-string">'#67001f'</span>])
sns.palplot(sns.color_palette(color_scale))
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/01/1_ymG4157cHZa4dIatJQldwg.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h1 id="heading-data-preparation">Data Preparation</h1>
<h2 id="heading-loading-the-time-series-data">Loading the time series data</h2>
<p>We convert the date variables to datetime. That way we can easily use them later to slice the Pandas DataFrame.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">load_data</span>(<span class="hljs-params">pollutant_ID</span>):</span>
    print(<span class="hljs-string">'&gt; Loading data...'</span>)
    date_vars = [<span class="hljs-string">'DatetimeBegin'</span>,<span class="hljs-string">'DatetimeEnd'</span>]
    filename = <span class="hljs-string">'data/raw/BE_'</span> + str(pollutant_ID) + <span class="hljs-string">'_2013-2015_aggregated_timeseries.csv'</span>
    agg_ts = pd.read_csv(project_dir / filename, sep=<span class="hljs-string">'\t'</span>, parse_dates=date_vars, date_parser=pd.to_datetime)
    <span class="hljs-keyword">return</span> agg_ts
</code></pre>
<h2 id="heading-data-cleaning">Data cleaning</h2>
<p>We’ll do some basic cleaning of the data:</p>
<ul>
<li>Keep only records with DataAggregationProcss of P1D to have daily data</li>
<li>Remove records with UnitOfAirPollutionLevel of count</li>
<li>Remove variables redundant for the visualization</li>
<li>Remove SamplingPoints which have less than 1000 measurement days</li>
<li>Insert missing dates and imputing the AirpollutionLevel with the value of the next valid date</li>
</ul>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">clean_data</span>(<span class="hljs-params">df</span>):</span>
    print(<span class="hljs-string">'&gt; Cleaning data...'</span>)
    df = df.loc[df.DataAggregationProcess==<span class="hljs-string">'P1D'</span>, :] 
    df = df.loc[df.UnitOfAirPollutionLevel!=<span class="hljs-string">'count'</span>, :]
    ser_avail_days = df.groupby(<span class="hljs-string">'SamplingPoint'</span>).nunique()[<span class="hljs-string">'DatetimeBegin'</span>]
    df = df.loc[df.SamplingPoint.isin(ser_avail_days[ser_avail_days.values &gt;= <span class="hljs-number">1000</span>].index), :]
    vars_to_drop = [<span class="hljs-string">'AirPollutant'</span>,<span class="hljs-string">'AirPollutantCode'</span>,<span class="hljs-string">'Countrycode'</span>,<span class="hljs-string">'Namespace'</span>,<span class="hljs-string">'TimeCoverage'</span>,<span class="hljs-string">'Validity'</span>,<span class="hljs-string">'Verification'</span>,<span class="hljs-string">'AirQualityStation'</span>,
               <span class="hljs-string">'AirQualityStationEoICode'</span>,<span class="hljs-string">'DataAggregationProcess'</span>,<span class="hljs-string">'UnitOfAirPollutionLevel'</span>, <span class="hljs-string">'DatetimeEnd'</span>, <span class="hljs-string">'AirQualityNetwork'</span>,
               <span class="hljs-string">'DataCapture'</span>, <span class="hljs-string">'DataCoverage'</span>]
    df.drop(columns=vars_to_drop, axis=<span class="hljs-string">'columns'</span>, inplace=<span class="hljs-literal">True</span>)

    dates = list(pd.period_range(min(df.DatetimeBegin), max(df.DatetimeBegin), freq=<span class="hljs-string">'D'</span>).values)
    samplingpoints = list(df.SamplingPoint.unique())
    new_idx = []
    <span class="hljs-keyword">for</span> sp <span class="hljs-keyword">in</span> samplingpoints:
        <span class="hljs-keyword">for</span> d <span class="hljs-keyword">in</span> dates:
            new_idx.append((sp, np.datetime64(d)))

    df.set_index(keys=[<span class="hljs-string">'SamplingPoint'</span>, <span class="hljs-string">'DatetimeBegin'</span>], inplace=<span class="hljs-literal">True</span>)
    df.sort_index(inplace=<span class="hljs-literal">True</span>)
    df = df.reindex(new_idx)
    df[<span class="hljs-string">'AirPollutionLevel'</span>] = df.groupby(level=<span class="hljs-number">0</span>).AirPollutionLevel.bfill().fillna(<span class="hljs-number">0</span>)
    <span class="hljs-keyword">return</span> df
</code></pre>
<h2 id="heading-plotting-air-pollution-over-time">Plotting air pollution over time</h2>
<p>Loading all of the dates for all sampling points would be too heavy for the map. Therefore, we will <strong>resample</strong> the data by taking the last day of each month.</p>
<p><strong>Note</strong>: The bin edges that we use in this notebook should normally be applied on (semi-)hourly averages for O3, NO2 and CO. In the datasets we are using in this notebook, we have only daily averages. As this notebook is only to illustrate how to plot time series data on a map, we will continue with the daily averages. On the EEA website, you can, however, download hourly averages as well.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">color_coding</span>(<span class="hljs-params">poll, bin_edges</span>):</span>    
    idx = np.digitize(poll, bin_edges, right=<span class="hljs-literal">True</span>)
    <span class="hljs-keyword">return</span> color_scale[idx]

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">prepare_data</span>(<span class="hljs-params">df, pollutant_ID</span>):</span>
    print(<span class="hljs-string">'&gt; Preparing data...'</span>)
    df = df.reset_index().merge(meta, how=<span class="hljs-string">'inner'</span>, on=<span class="hljs-string">'SamplingPoint'</span>).set_index(<span class="hljs-string">'DatetimeBegin'</span>)
    df = df.loc[:, [<span class="hljs-string">'SamplingPoint'</span>,<span class="hljs-string">'Latitude'</span>, <span class="hljs-string">'Longitude'</span>, <span class="hljs-string">'AirPollutionLevel'</span>]]
    df = df.groupby(<span class="hljs-string">'SamplingPoint'</span>, group_keys=<span class="hljs-literal">False</span>).resample(rule=<span class="hljs-string">'M'</span>).last().reset_index()
    df[<span class="hljs-string">'color'</span>] = df.AirPollutionLevel.apply(color_coding, bin_edges=pollutants[pollutant_ID][<span class="hljs-string">'bin_edges'</span>])
    <span class="hljs-keyword">return</span> df
</code></pre>
<p>To show the pollution evolving over time, we will use the <strong>TimestampedGeoJson</strong> <a target="_blank" href="https://python-visualization.github.io/folium/plugins.html">Folium plugin</a>. This plugin requires GeoJSON input features. In order to convert the data of the dataframe, I created a small function <strong>create_geojson_features</strong> that does that.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create_geojson_features</span>(<span class="hljs-params">df</span>):</span>
    print(<span class="hljs-string">'&gt; Creating GeoJSON features...'</span>)
    features = []
    <span class="hljs-keyword">for</span> _, row <span class="hljs-keyword">in</span> df.iterrows():
        feature = {
            <span class="hljs-string">'type'</span>: <span class="hljs-string">'Feature'</span>,
            <span class="hljs-string">'geometry'</span>: {
                <span class="hljs-string">'type'</span>:<span class="hljs-string">'Point'</span>, 
                <span class="hljs-string">'coordinates'</span>:[row[<span class="hljs-string">'Longitude'</span>],row[<span class="hljs-string">'Latitude'</span>]]
            },
            <span class="hljs-string">'properties'</span>: {
                <span class="hljs-string">'time'</span>: row[<span class="hljs-string">'DatetimeBegin'</span>].date().__str__(),
                <span class="hljs-string">'style'</span>: {<span class="hljs-string">'color'</span> : row[<span class="hljs-string">'color'</span>]},
                <span class="hljs-string">'icon'</span>: <span class="hljs-string">'circle'</span>,
                <span class="hljs-string">'iconstyle'</span>:{
                    <span class="hljs-string">'fillColor'</span>: row[<span class="hljs-string">'color'</span>],
                    <span class="hljs-string">'fillOpacity'</span>: <span class="hljs-number">0.8</span>,
                    <span class="hljs-string">'stroke'</span>: <span class="hljs-string">'true'</span>,
                    <span class="hljs-string">'radius'</span>: <span class="hljs-number">7</span>
                }
            }
        }
        features.append(feature)
    <span class="hljs-keyword">return</span> features
</code></pre>
<p>After that, the input features are created and we can create a map to add them to. The TimestampedGeoJson plugin provides some neat options for the time slider, which are self-explanatory.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">make_map</span>(<span class="hljs-params">features</span>):</span>
    print(<span class="hljs-string">'&gt; Making map...'</span>)
    coords_belgium=[<span class="hljs-number">50.5039</span>, <span class="hljs-number">4.4699</span>]
    pollution_map = folium.Map(location=coords_belgium, control_scale=<span class="hljs-literal">True</span>, zoom_start=<span class="hljs-number">8</span>)

    TimestampedGeoJson(
        {<span class="hljs-string">'type'</span>: <span class="hljs-string">'FeatureCollection'</span>,
        <span class="hljs-string">'features'</span>: features}
        , period=<span class="hljs-string">'P1M'</span>
        , add_last_point=<span class="hljs-literal">True</span>
        , auto_play=<span class="hljs-literal">False</span>
        , loop=<span class="hljs-literal">False</span>
        , max_speed=<span class="hljs-number">1</span>
        , loop_button=<span class="hljs-literal">True</span>
        , date_options=<span class="hljs-string">'YYYY/MM'</span>
        , time_slider_drag_update=<span class="hljs-literal">True</span>
    ).add_to(pollution_map)
    print(<span class="hljs-string">'&gt; Done.'</span>)
    <span class="hljs-keyword">return</span> pollution_map
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">plot_pollutant</span>(<span class="hljs-params">pollutant_ID</span>):</span>
    print(<span class="hljs-string">'Mapping {} pollution in Belgium in 2013-2015'</span>.format(pollutants[pollutant_ID][<span class="hljs-string">'name'</span>]))
    df = load_data(pollutant_ID)
    df = clean_data(df)
    df = prepare_data(df, pollutant_ID)
    features = create_geojson_features(df)
    <span class="hljs-keyword">return</span> make_map(features), df
</code></pre>
<p>Below are the maps per air pollutant. You can click on the image to go to a web page with the interactive map. By clicking on the <em>play</em> button, you can see the evolution of the air pollutant over time.</p>
<h2 id="heading-sulphur-dioxide">Sulphur dioxide</h2>
<pre><code class="lang-python">pollution_map, df = plot_pollutant(<span class="hljs-number">1</span>)
pollution_map.save(<span class="hljs-string">'../output/pollution_so2.html'</span>)
pollution_map
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/01/1_BQ7PJfWRkH3Mud3CxMvKfQ.png" alt="Image" width="600" height="400" loading="lazy">
_<a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_c6h6.html">https://bertcarremans.github.io/air_pollution_viz/pollution_so2.html</a>_</p>
<h2 id="heading-particulate-matter">Particulate matter</h2>
<pre><code class="lang-python">pollution_map, df = plot_pollutant(<span class="hljs-number">5</span>)
pollution_map.save(<span class="hljs-string">'../output/pollution_pm.html'</span>)
pollution_map
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/01/1_BQ7PJfWRkH3Mud3CxMvKfQ-1.png" alt="Image" width="600" height="400" loading="lazy">
_<a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_c6h6.html">https://bertcarremans.github.io/air_pollution_viz/pollution_pm.html</a>_</p>
<p>The other visualizations can be found at:</p>
<ul>
<li><a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_c6h6.html">https://bertcarremans.github.io/air_pollution_viz/pollution_c6h6.html</a></li>
<li><a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_co.html">https://bertcarremans.github.io/air_pollution_viz/pollution_co.html</a></li>
<li><a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_no2.html">https://bertcarremans.github.io/air_pollution_viz/pollution_no2.html</a></li>
<li><a target="_blank" href="https://bertcarremans.github.io/air_pollution_viz/pollution_o3.html">https://bertcarremans.github.io/air_pollution_viz/pollution_o3.html</a></li>
</ul>
<h1 id="heading-conclusion">Conclusion</h1>
<p>With this story, I want to demonstrate how easy it is to visualize time series data on a map with Folium. The maps for all the pollutants and the Jupyter notebook can be found on <a target="_blank" href="https://github.com/bertcarremans/air_pollution_forecasting/blob/master/notebooks/Visualizing%20Air%20Pollution%20in%20Belgium.ipynb">GitHub</a>. Feel free to re-use it to map the air pollution in your home country.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
