Tourism#

This example highlights how you can actually use a combination of deliberately extracting blank cells along with horizontal conditions to unpick complex (bad) table structures.

Tutorial Structure#

With these example tutorials I’m going to comment heavily and cover nuances in a follow up section (with liberal targetted previews as needed) as it’s the easiest way to grapple with new ideas. It may also be worth opening up these notebooks yourself (they’re in ./jupyterbook in the tidychef github repo) so you can run, alter and generally have a play about with this yourself as part of your learning.

We’ll cover:

  • source data

  • requirements, what we’re aiming to do here

  • show the full script (all logic commented)

  • output the selection preview

  • nuances (where applicable)

  • view the output

This sequencing is necessary as the output for some of the example is really long so that necessitates it coming last. If you’re viewing this via a jupyter book (i.e on the site) you can navigate between the above sections via your right hand menu.

Note - these tutorial scripts might seem verbose due all the comments but that’s ok (this is a tutorial after all). If you take them out you end up with a fairly succinct and human readable encapsulation of what would otherwise (with existing tools) be a rather convoluted and fragile set of instructions to express.

In virtually all cases I’ll make heavy use of preview and bounded to only look at relevant parts of what can be quite large datasets. Downloads links are provided for the source data.

Source#

For this example we’re extracting the table3 from an xlsx dataset dealing with travel and tourism.

from tidychef import acquire, preview
from tidychef.selection import XlsxSelectable

table: XlsxSelectable = acquire.xlsx.http("https://raw.githubusercontent.com/mikeAdamss/tidychef/main/tests/fixtures/xlsx/tourism.xlsx", tables="Table 3")
preview(table, bounded="A1:L20")

Table 3

ABCDEFGHIJKL
13UK residents' visits abroad by month
2thousands
3All VisitsArea of visit
4North AmericaEuropeof whichOther countries
5European UnionOther EUEU15
6NSASANSANSANSANSANSANSA
72018Jan5831.2810225126887450280.18739082391894324.5686336197353946.0897447298166750.03524677454543190.9168968102251226.524998069034
8Feb5071.3720740238997250306.95329319712113704.83453233873163364.8630267535614496.10495827241452870.1683728493921059.584248488046
9Mar5689.6499180244457600335.73199191239344165.6228245170053911.1414280012004524.92283619045853389.94588858753651188.2951015950462
10Apr8018.3243029026427650515.93886041716286078.3560238729035632.226496707873767.78247288711754864.4410540690191424.0294186125757
11May7602.5961628084997520619.10812349189265825.2331448738895534.996301033566761.13920058215584773.7937017929861158.2548944427167
12Jun9025.5295004580787690434.08713210260077648.4683414953567160.806546120463968.49031409264676192.3826004379725942.9740268601215
13Jul8746.3045617722477670382.62211016570167415.5731125867436887.83276782952451035.0840358104495852.751303241683948.1093390198018
14Aug11532.9152084244427790706.0894494346069366.0778655173878929.6388196495281443.2040173345137486.45489511357851460.7478934724468
15Sep9643.896198305527430704.98194838099727382.72663818321056850.0904871914645876.99137559967885973.076447570631556.1876117413126
16Oct8654.7812397107687720702.89895371604786695.9358683623896262.846469929502785.77363893572875469.0230037190671255.946417632332
17Nov5700.3568799287247540339.05927876417054116.8542445096323816.256783133677640.69153729630333182.78449595305851244.4433566549212
18Dec5053.6114372587537330394.76356861737693787.6146320768463513.471412419715512.20639630682343002.0955932718825871.2332365645296
192019Jan6149.1587071440467830434.85145558658164206.86578447863853851.2624224297415855.21874494226072998.93314456534971507.441467078826
20Feb5537.557932116457680230.810364905894574210.3425946421293816.0344742009574584.5154279447993230.49989830704541096.4049725684256

Requirements#

  • Rows 4 and 5 combines as “Country”

  • Column A as “Year”

  • Column B as “Month”.

  • Row 6 as “Seasonal Adjustment”

We’re not gonna take the footer data dealing with three month comparissons for our purposes here.

from typing import Dict, List
from tidychef import acquire, preview
from tidychef.direction import up, down, left, right
from tidychef.output import Column, TidyData
from tidychef.selection import XlsxSelectable

tables: List[XlsxSelectable] = acquire.xlsx.http("https://raw.githubusercontent.com/mikeAdamss/tidychef/main/tests/fixtures/xlsx/tourism.xlsx")
table = tables[3]

# We'll fine seasonal adjustment by looking for the row containing both SA and NSA
seasonal_adjustment = table.row_containing_strings(["SA", "NSA"]).is_not_blank().label_as("Seasonal Adjustment")

# With area, we're going to take all three rows and concatenate them later with a horizontal condition
area1 = seasonal_adjustment.shift(up(3)).label_as("area1")
area2 = seasonal_adjustment.shift(up(2)).label_as("area2")
area3 = seasonal_adjustment.shift(up(1)).label_as("area3")

# Month is things in column B (not row 1) thats not blank
month = table.excel_ref("B2").fill(down).is_not_blank().label_as("Month")

# Year is one cell to the left of month
year = month.shift(left).is_not_blank().label_as("Year")

# Observations are at the intersection of month and seasonal adjustment so we'll just use a waffle.
observations = month.waffle(right, seasonal_adjustment).label_as("Observations")

preview(seasonal_adjustment, area1, area2, area3, month, year, observations, bounded="A1:L20")

# This is the function for the horizontal condition, we'll discuss this in nuances
def create_area(line) -> str:
    """
    A function to create a sensible string from the three areas
    """
    # We need to get rid of any trailing whitespace and remove the non header text mised in with the headers
    area1 = line["area1"].replace("Area of visit", "").strip()
    area2 = line["area2"].replace("of which", "").replace("Other countries", "").strip()
    area3 = line["area3"].strip()
    
    # Combined the header
    # If its blank its column B, so set to all visits
    combined_area = f"{area1} {area2} {area3}"
    return combined_area if combined_area.strip() != "" else "All Visits"
    
tidy_data = TidyData(
    observations,
    Column(seasonal_adjustment.attach_directly(down)),
    Column(area1.attach_directly(down)),
    Column(area2.attach_directly(down)),
    Column(area3.attach_directly(down)),
    Column(month.attach_directly(right)),
    Column(year.attach_closest(down)),
    Column.horizontal_condition("Area", create_area), # this is us using the create_area function to populate a column
    drop=["area1", "area2", "area3"]
)
Seasonal Adjustment
area1
area2
area3
Month
Year
Observations

Table 3

ABCDEFGHIJKL
13UK residents' visits abroad by month
2thousands
3All VisitsArea of visit
4North AmericaEuropeof whichOther countries
5European UnionOther EUEU15
6NSASANSANSANSANSANSANSA
72018Jan5831.2810225126887450280.18739082391894324.5686336197353946.0897447298166750.03524677454543190.9168968102251226.524998069034
8Feb5071.3720740238997250306.95329319712113704.83453233873163364.8630267535614496.10495827241452870.1683728493921059.584248488046
9Mar5689.6499180244457600335.73199191239344165.6228245170053911.1414280012004524.92283619045853389.94588858753651188.2951015950462
10Apr8018.3243029026427650515.93886041716286078.3560238729035632.226496707873767.78247288711754864.4410540690191424.0294186125757
11May7602.5961628084997520619.10812349189265825.2331448738895534.996301033566761.13920058215584773.7937017929861158.2548944427167
12Jun9025.5295004580787690434.08713210260077648.4683414953567160.806546120463968.49031409264676192.3826004379725942.9740268601215
13Jul8746.3045617722477670382.62211016570167415.5731125867436887.83276782952451035.0840358104495852.751303241683948.1093390198018
14Aug11532.9152084244427790706.0894494346069366.0778655173878929.6388196495281443.2040173345137486.45489511357851460.7478934724468
15Sep9643.896198305527430704.98194838099727382.72663818321056850.0904871914645876.99137559967885973.076447570631556.1876117413126
16Oct8654.7812397107687720702.89895371604786695.9358683623896262.846469929502785.77363893572875469.0230037190671255.946417632332
17Nov5700.3568799287247540339.05927876417054116.8542445096323816.256783133677640.69153729630333182.78449595305851244.4433566549212
18Dec5053.6114372587537330394.76356861737693787.6146320768463513.471412419715512.20639630682343002.0955932718825871.2332365645296
192019Jan6149.1587071440467830434.85145558658164206.86578447863853851.2624224297415855.21874494226072998.93314456534971507.441467078826
20Feb5537.557932116457680230.810364905894574210.3425946421293816.0344742009574584.5154279447993230.49989830704541096.4049725684256

Nuances#

The Horizontal Condition + Drop#

At this point it’d be worth having a read of the documentation for Horizontal Conditions (it’s not long). The following will recap that a little, but we are assuming you have read it.

So a column made by Column.horizontal_condition(<column name>, <callable>) just uses passes a dictionary representing the rest of the row to the callable.

To make this clearer lets look at the first line of what the tidy data would look like without dropping any columns.

temporary_tidy_data = TidyData(
    observations,
    Column(seasonal_adjustment.attach_directly(down)),
    Column(area1.attach_directly(down)),
    Column(area2.attach_directly(down)),
    Column(area3.attach_directly(down)),
    Column(month.attach_directly(right)),
    Column(year.attach_closest(down)),
    Column.horizontal_condition("Area", create_area),
    # drop=["area1", "area2", "area3"]   - this is me not dropping the temporary columns
)

# Note: tidychef doesnt transform until the tidy data is needed (usually when you to_csv) so we'll need to prod it along and truncate the outut
# so I can demonstrate what we're working with.
# This is more "under the hood" trickery than intended usage (hence _ prefixes) but we need a quick example.
# i.e don't worry about how I'm doing this, there's no reason for you to
temporary_tidy_data._transform()
temporary_tidy_data._data = temporary_tidy_data._data[:2] 
print("These are the column headers and the first row\n", temporary_tidy_data)
These are the column headers and the first row
 
ObservationsSeasonal Adjustmentarea1area2area3MonthYearArea
5831.281022512688NSAAll VisitsJan2018All Visits


When you use horizontal_condition if has access to the contents of a given row as a dictionary, so the example row would be:

{
    "Observations": "5831.281022512688",
    "Seasonal Adjustment": "NSA",
    "area1": "All Visits",
    "area2": "",
    "area3": "",
    "Month": "Jan",
    "Year": "2018",
}

which hopefully conextualises what this function is doing. tThe line variable is the contents of a row and populates the Area column for that row. i.e in the case of our example first row line would be the contents of the above dictionary.

# This is the function for the horizontal condition, we'll discuss in nuances
def create_area(line) -> str:
    """
    A function to create a sensible string from the three areas
    """
    # Area 2 needs a little extra handling as we don't want "of which"
    area1 = line["area1"].replace("Area of visit", "").strip()
    area2 = line["area2"].replace("of which", "").replace("Other countries", "").strip()
    area3 = line["area3"].strip()
    
    # Combined the header
    # If its blank its column B, soset to all visits
    combined_area = f"{area1} {area2} {area3}"
    return combined_area if combined_area.strip() != "" else "All Visits"

Which for our single example row returns the “All Visits” value which populates the Area column (the horizontal condition column).

All the other rows are calcualted in the same way - the line dictionary goes to the function - the function populate Area.

The drop keyword just gets rid of the intermediary columns at the end (when we’ve no use for them).

Outputs#

The tidy data can be downloaded here and a full inline preview of the tidydata generated is shown below for those people who’d prefer to scroll.

print(tidy_data)
ObservationsSeasonal AdjustmentMonthYearArea
5831.281022512688NSAJan2018All Visits
7450SAJan2018All Visits
280.1873908239189NSAJan2018 North America
4324.568633619735NSAJan2018 Europe
3946.0897447298166NSAJan2018 European Union
750.0352467745454NSAJan2018 Other EU
3190.916896810225NSAJan2018 EU15
1226.524998069034NSAJan2018All Visits
5071.372074023899NSAFeb2018All Visits
7250SAFeb2018All Visits
306.9532931971211NSAFeb2018 North America
3704.8345323387316NSAFeb2018 Europe
3364.8630267535614NSAFeb2018 European Union
496.1049582724145NSAFeb2018 Other EU
2870.168372849392NSAFeb2018 EU15
1059.584248488046NSAFeb2018All Visits
5689.649918024445NSAMar2018All Visits
7600SAMar2018All Visits
335.7319919123934NSAMar2018 North America
4165.622824517005NSAMar2018 Europe
3911.1414280012004NSAMar2018 European Union
524.9228361904585NSAMar2018 Other EU
3389.9458885875365NSAMar2018 EU15
1188.2951015950462NSAMar2018All Visits
8018.324302902642NSAApr2018All Visits
7650SAApr2018All Visits
515.9388604171628NSAApr2018 North America
6078.356023872903NSAApr2018 Europe
5632.226496707873NSAApr2018 European Union
767.7824728871175NSAApr2018 Other EU
4864.441054069019NSAApr2018 EU15
1424.0294186125757NSAApr2018All Visits
7602.596162808499NSAMay2018All Visits
7520SAMay2018All Visits
619.1081234918926NSAMay2018 North America
5825.233144873889NSAMay2018 Europe
5534.996301033566NSAMay2018 European Union
761.1392005821558NSAMay2018 Other EU
4773.793701792986NSAMay2018 EU15
1158.2548944427167NSAMay2018All Visits
9025.529500458078NSAJun2018All Visits
7690SAJun2018All Visits
434.0871321026007NSAJun2018 North America
7648.468341495356NSAJun2018 Europe
7160.806546120463NSAJun2018 European Union
968.4903140926467NSAJun2018 Other EU
6192.3826004379725NSAJun2018 EU15
942.9740268601215NSAJun2018All Visits
8746.304561772247NSAJul2018All Visits
7670SAJul2018All Visits
382.6221101657016NSAJul2018 North America
7415.573112586743NSAJul2018 Europe
6887.8327678295245NSAJul2018 European Union
1035.084035810449NSAJul2018 Other EU
5852.751303241683NSAJul2018 EU15
948.1093390198018NSAJul2018All Visits
11532.915208424442NSAAug2018All Visits
7790SAAug2018All Visits
706.089449434606NSAAug2018 North America
9366.077865517387NSAAug2018 Europe
8929.638819649528NSAAug2018 European Union
1443.204017334513NSAAug2018 Other EU
7486.4548951135785NSAAug2018 EU15
1460.7478934724468NSAAug2018All Visits
9643.89619830552NSASep2018All Visits
7430SASep2018All Visits
704.9819483809972NSASep2018 North America
7382.7266381832105NSASep2018 Europe
6850.0904871914645NSASep2018 European Union
876.9913755996788NSASep2018 Other EU
5973.07644757063NSASep2018 EU15
1556.1876117413126NSASep2018All Visits
8654.781239710768NSAOct2018All Visits
7720SAOct2018All Visits
702.8989537160478NSAOct2018 North America
6695.935868362389NSAOct2018 Europe
6262.846469929502NSAOct2018 European Union
785.7736389357287NSAOct2018 Other EU
5469.023003719067NSAOct2018 EU15
1255.946417632332NSAOct2018All Visits
5700.356879928724NSANov2018All Visits
7540SANov2018All Visits
339.0592787641705NSANov2018 North America
4116.854244509632NSANov2018 Europe
3816.256783133677NSANov2018 European Union
640.6915372963033NSANov2018 Other EU
3182.7844959530585NSANov2018 EU15
1244.4433566549212NSANov2018All Visits
5053.611437258753NSADec2018All Visits
7330SADec2018All Visits
394.7635686173769NSADec2018 North America
3787.614632076846NSADec2018 Europe
3513.471412419715NSADec2018 European Union
512.2063963068234NSADec2018 Other EU
3002.0955932718825NSADec2018 EU15
871.2332365645296NSADec2018All Visits
6149.158707144046NSAJan2019All Visits
7830SAJan2019All Visits
434.8514555865816NSAJan2019 North America
4206.8657844786385NSAJan2019 Europe
3851.2624224297415NSAJan2019 European Union
855.2187449422607NSAJan2019 Other EU
2998.9331445653497NSAJan2019 EU15
1507.441467078826NSAJan2019All Visits
5537.55793211645NSAFeb2019All Visits
7680SAFeb2019All Visits
230.81036490589457NSAFeb2019 North America
4210.342594642129NSAFeb2019 Europe
3816.0344742009574NSAFeb2019 European Union
584.515427944799NSAFeb2019 Other EU
3230.4998983070454NSAFeb2019 EU15
1096.4049725684256NSAFeb2019All Visits
6472.777420667277NSAMar2019All Visits
8300SAMar2019All Visits
204.1398077887444NSAMar2019 North America
5096.350937205022NSAMar2019 Europe
4698.912209429443NSAMar2019 European Union
678.0786402796821NSAMar2019 Other EU
4018.963250021003NSAMar2019 EU15
1172.2866756735107NSAMar2019All Visits
8406.458047220905NSAApr2019All Visits
8010SAApr2019All Visits
492.5850441326407NSAApr2019 North America
6252.06335900314NSAApr2019 Europe
5673.57131498982NSAApr2019 European Union
882.8275034988073NSAApr2019 Other EU
4790.891401381712NSAApr2019 EU15
1661.8096440851239NSAApr2019All Visits
8227.846873140958NSAMay2019All Visits
8120SAMay2019All Visits
564.6967400465334NSAMay2019 North America
6510.243867415863NSAMay2019 Europe
6142.289759783593NSAMay2019 European Union
950.1921450181535NSAMay2019 Other EU
5192.153781046257NSAMay2019 EU15
1152.9062656785604NSAMay2019All Visits
9125.36476257319NSAJun2019All Visits
7760SAJun2019All Visits
557.7374783510787NSAJun2019 North America
7535.839288624718NSAJun2019 Europe
7099.220602169799NSAJun2019 European Union
1083.7845623650892NSAJun2019 Other EU
6015.232283633185NSAJun2019 EU15
1031.7879955973956NSAJun2019All Visits
8646.905240183913NSAJul2019All Visits
7690SAJul2019All Visits
491.17263037192873NSAJul2019 North America
7038.593677443078NSAJul2019 Europe
6567.958732763438NSAJul2019 European Union
1074.629279938596NSAJul2019 Other EU
5492.193034167073NSAJul2019 EU15
1117.1389323689054NSAJul2019All Visits
11627.657439731427NSAAug2019All Visits
7780SAAug2019All Visits
684.9832760909976NSAAug2019 North America
9345.731803312596NSAAug2019 Europe
8597.306476051477NSAAug2019 European Union
1343.758010647838NSAAug2019 Other EU
7253.805036042994NSAAug2019 EU15
1596.9423603278335NSAAug2019All Visits
9724.967870253724NSASep2019All Visits
7620SASep2019All Visits
648.9082183670049NSASep2019 North America
7707.797056938662NSASep2019 Europe
7147.323241407862NSASep2019 European Union
1093.0846413415031NSASep2019 Other EU
6055.118448084731NSASep2019 EU15
1368.2625949480575NSASep2019All Visits
8434.26927736153NSAOct2019All Visits
7520SAOct2019All Visits
531.8441213121608NSAOct2019 North America
6684.57381381964NSAOct2019 Europe
6056.199178390015NSAOct2019 European Union
908.6680577046062NSAOct2019 Other EU
5143.089096839735NSAOct2019 EU15
1217.851342229731NSAOct2019All Visits
5682.9021876901625NSANov2019All Visits
7440SANov2019All Visits
344.51948478594187NSANov2019 North America
4216.342545969421NSANov2019 Europe
3911.778398498632NSANov2019 European Union
749.1143814105311NSANov2019 Other EU
3169.185170859206NSANov2019 EU15
1122.0401569348NSANov2019All Visits
5049.905976823658NSADec2019All Visits
7370SADec2019All Visits
375.9792242682544NSADec2019 North America
3666.159415956298NSADec2019 Europe
3394.9018824159293NSADec2019 European Union
516.4663858687261NSADec2019 Other EU
2876.3563666217588NSADec2019 EU15
1007.7673365991066NSADec2019All Visits
5419.321772602557NSAJan2020All Visits
7050SAJan2020All Visits
339.7153496767159NSAJan2020 North America
3993.2940390814324NSAJan2020 Europe
3696.744588816861NSAJan2020 European Union
791.641354908287NSAJan2020 Other EU
2906.6833432687154NSAJan2020 EU15
1086.3123838444092NSAJan2020All Visits
5231.871561436594NSAFeb2020All Visits
7090SAFeb2020All Visits
299.7590312275555NSAFeb2020 North America
3760.447814448083NSAFeb2020 Europe
3466.032285062617NSAFeb2020 European Union
581.7328027604425NSAFeb2020 Other EU
2883.663129894775NSAFeb2020 EU15
1171.6647157609555NSAFeb2020All Visits
3239.3434490113586NSAMar2020All Visits
5240SAMar2020All Visits
203.6868410704588NSAMar2020 North America
2211.83858774998NSAMar2020 Europe
1957.0236897543152NSAMar2020 European Union
284.1702151354063NSAMar2020 Other EU
1671.9097176661992NSAMar2020 EU15
823.8180201909202NSAMar2020All Visits
219.2520847864024NSAApr2020All Visits
0SAApr2020All Visits
12.200887619546107NSAApr2020 North America
145.02400643890257NSAApr2020 Europe
0NSAApr2020 European Union
0NSAApr2020 Other EU
0NSAApr2020 EU15
62.02719072795372NSAApr2020All Visits
275.1372260407373NSAMay2020All Visits
0SAMay2020All Visits
13.160433736185803NSAMay2020 North America
220.4596252706796NSAMay2020 Europe
0NSAMay2020 European Union
0NSAMay2020 Other EU
0NSAMay2020 EU15
41.51716703387191NSAMay2020All Visits
444.8094369377133NSAJun2020All Visits
0SAJun2020All Visits
17.539940653026814NSAJun2020 North America
379.081467789518NSAJun2020 Europe
0NSAJun2020 European Union
0NSAJun2020 Other EU
0NSAJun2020 EU15
48.1880284951685NSAJun2020All Visits
1359.8024150023NSAJul2020All Visits
0SAJul2020All Visits
16.87810137NSAJul2020 North America
1286.6996804NSAJul2020 Europe
0NSAJul2020 European Union
0NSAJul2020 Other EU
0NSAJul2020 EU15
56.224633232300015NSAJul2020All Visits
2759.1404098408NSAAug2020All Visits
0SAAug2020All Visits
35.63134514NSAAug2020 North America
2579.4039533NSAAug2020 Europe
0NSAAug2020 European Union
0NSAAug2020 Other EU
0NSAAug2020 EU15
144.10511140080004NSAAug2020All Visits
2071.7535994395002NSASep2020All Visits
0SASep2020All Visits
29.685334311NSASep2020 North America
1923.0148303NSASep2020 Europe
0NSASep2020 European Union
0NSASep2020 Other EU
0NSASep2020 EU15
119.05343482850003NSASep2020All Visits
1368.8280350343998NSAOct2020All Visits
0SAOct2020All Visits
27.14673441NSAOct2020 North America
1192.0466092NSAOct2020 Europe
0NSAOct2020 European Union
0NSAOct2020 Other EU
0NSAOct2020 EU15
149.63469142440002NSAOct2020All Visits
658.6233971306999NSANov2020All Visits
0SANov2020All Visits
22.34189827NSANov2020 North America
490.26725469999997NSANov2020 Europe
0NSANov2020 European Union
0NSANov2020 Other EU
0NSANov2020 EU15
146.0142441607NSANov2020All Visits
778.8298855942NSADec2020All Visits
0SADec2020All Visits
38.27815087NSADec2020 North America
510.0432512NSADec2020 Europe
0NSADec2020 European Union
0NSADec2020 Other EU
0NSADec2020 EU15
230.50848352420005NSADec2020All Visits
124.05175648532173NSAJan *2021All Visits
0SAJan *2021All Visits
2.46816519988163NSAJan *2021 North America
73.41512686000965NSAJan *2021 Europe
58.74445445736873NSAJan *2021 European Union
23.475655651509364NSAJan *2021 Other EU
35.06376728982452NSAJan *2021 EU15
48.168464425430464NSAJan *2021All Visits
292.36445146715624NSAFeb *2021All Visits
0SAFeb *2021All Visits
7.993675213291264NSAFeb *2021 North America
143.7781307331963NSAFeb *2021 Europe
118.1885055542001NSAFeb *2021 European Union
65.22372092981047NSAFeb *2021 Other EU
53.3988553399312NSAFeb *2021 EU15
140.5926455206687NSAFeb *2021All Visits
357.0092750475215NSAMar *2021All Visits
0SAMar *2021All Visits
9.771111586827118NSAMar *2021 North America
178.76002440679082NSAMar *2021 Europe
142.09360898842883NSAMar *2021 European Union
62.45652441868018NSAMar *2021 Other EU
79.4080453702439NSAMar *2021 EU15
168.47813905390356NSAMar *2021All Visits
259.84614716159956NSAApr *2021All Visits
0SAApr *2021All Visits
12.890859510294247NSAApr *2021 North America
146.72497012040134NSAApr *2021 Europe
120.57936151932199NSAApr *2021 European Union
57.13620663618857NSAApr *2021 Other EU
63.81102529579257NSAApr *2021 EU15
100.23031753090396NSAApr *2021All Visits
287.02537894215135NSAMay *2021All Visits
0SAMay *2021All Visits
11.476056867274222NSAMay *2021 North America
216.61510478736756NSAMay *2021 Europe
193.77318533394273NSAMay *2021 European Union
76.08361859000829NSAMay *2021 Other EU
117.82243053843341NSAMay *2021 EU15
58.934217287509554NSAMay *2021All Visits
453.37740489624855NSAJun *2021All Visits
0SAJun *2021All Visits
12.883682622431584NSAJun *2021 North America
369.2296230922308NSAJun *2021 Europe
333.8774941467359NSAJun *2021 European Union
106.04285777380301NSAJun *2021 Other EU
227.33390216577644NSAJun *2021 EU15
71.26409918158619NSAJun *2021All Visits
1431.9402711304276NSAJul2021All Visits
0SAJul2021All Visits
38.83405797851471NSAJul2021 North America
1280.5629110901177NSAJul2021 Europe
1208.1626292899666NSAJul2021 European Union
253.88883620283582NSAJul2021 Other EU
954.2737930871292NSAJul2021 EU15
112.5433020617951NSAJul2021All Visits
3043.557616525117NSAAug2021All Visits
0SAAug2021All Visits
56.67669310861133NSAAug2021 North America
2696.039419512003NSAAug2021 Europe
2527.1918261562514NSAAug2021 European Union
621.6742047878647NSAAug2021 Other EU
1905.5176213683837NSAAug2021 EU15
290.8415039045024NSAAug2021All Visits
3632.617093529147NSASep2021All Visits
0SASep2021All Visits
55.55972900214417NSASep2021 North America
3280.761227977521NSASep2021 Europe
3099.2223353700497NSASep2021 European Union
732.4314513963521NSASep2021 Other EU
2366.790883973694NSASep2021 EU15
296.2961365494819NSASep2021All Visits
3262.7526459916426NSAOct2021All Visits
0SAOct2021All Visits
58.790723572107446NSAOct2021 North America
2812.733735100366NSAOct2021 Europe
2592.587227311094NSAOct2021 European Union
400.3685498137048NSAOct2021 Other EU
2192.218677497404NSAOct2021 EU15
391.228187319169NSAOct2021All Visits
2832.9277778455457NSANov2021All Visits
0SANov2021All Visits
136.2117436663172NSANov2021 North America
2276.605988738232NSANov2021 Europe
2062.158305608966NSANov2021 European Union
367.5431978029157NSANov2021 Other EU
1694.6151078060627NSANov2021 EU15
420.1100454409966NSANov2021All Visits
2867.6307105974NSADec2021All Visits
0SADec2021All Visits
212.42685982367118NSADec2021 North America
2093.5303317644994NSADec2021 Europe
1946.6544021444727NSADec2021 European Union
308.4581089399845NSADec2021 Other EU
1638.1962932044994NSADec2021 EU15
561.6735190092294NSADec2021All Visits
2558.456817755075NSAJan2022All Visits
0SAJan2022All Visits
161.2430761291394NSAJan2022 North America
1724.590395923376NSAJan2022 Europe
1497.9286177902143NSAJan2022 European Union
298.21577055762873NSAJan2022 Other EU
1198.2727408359171NSAJan2022 EU15
672.6233457025597NSAJan2022All Visits
2985.3775572996915NSAFeb2022All Visits
0SAFeb2022All Visits
113.06134929415302NSAFeb2022 North America
2311.5253001142682NSAFeb2022 Europe
2053.022280340203NSAFeb2022 European Union
359.1376178753435NSAFeb2022 Other EU
1693.2632530935966NSAFeb2022 EU15
560.7909078912703NSAFeb2022All Visits
4033.946726834535NSAMar2022All Visits
0SAMar2022All Visits
185.96174815765914NSAMar2022 North America
3052.8322413265932NSAMar2022 Europe
2778.991813959057NSAMar2022 European Union
379.6958940190613NSAMar2022 Other EU
2401.357435707944NSAMar2022 EU15
795.1527373502826NSAMar2022All Visits
6233.555816198451NSAApr2022All Visits
0SAApr2022All Visits
315.03952446927957NSAApr2022 North America
4796.148458699103NSAApr2022 Europe
4414.742683837156NSAApr2022 European Union
665.7885871546621NSAApr2022 Other EU
3747.3336133648954NSAApr2022 EU15
1122.367833030068NSAApr2022All Visits
6374.0574301542665NSAMay 2022All Visits
0SAMay 2022All Visits
373.290562147498NSAMay 2022 North America
5036.096256122089NSAMay 2022 Europe
4641.3588416731845NSAMay 2022 European Union
660.269338845349NSAMay 2022 Other EU
3980.7123027053376NSAMay 2022 EU15
964.6706118846795NSAMay 2022All Visits
7815.137910231562NSAJune2022All Visits
0SAJune2022All Visits
307.16921880872616NSAJune2022 North America
6631.503276996713NSAJune2022 Europe
6119.284592571488NSAJune2022 European Union
795.8515283219114NSAJune2022 Other EU
5325.430747689705NSAJune2022 EU15
876.4654144261226NSAJune2022All Visits
7139.335162894174NSAJuly2022All Visits
0SAJuly2022All Visits
437.7147634781608NSAJuly2022 North America
5934.857649441555NSAJuly2022 Europe
5423.123898155981NSAJuly2022 European Union
800.7213971176692NSAJuly2022 Other EU
4622.663671950398NSAJuly2022 EU15
766.7627499744584NSAJuly2022All Visits
9361.1504979698NSAAug2022All Visits
0SAAug2022All Visits
569.713432638865NSAAug2022 North America
7496.653688442763NSAAug2022 Europe
6857.171891710602NSAAug2022 European Union
1048.7669223890437NSAAug2022 Other EU
5808.130933486644NSAAug2022 EU15
1294.7833768881721NSAAug2022All Visits
8451.552541033343NSASep2022All Visits
0SASep2022All Visits
417.9335903060332NSASep2022 North America
6990.964039033216NSASep2022 Europe
6352.519029884341NSASep2022 European Union
955.5556600757029NSASep2022 Other EU
5396.976234731427NSASep2022 EU15
1042.654911694095NSASep2022All Visits
7417.986344853294NSAOct2022All Visits
0SAOct2022All Visits
488.30703334798955NSAOct2022 North America
5990.128941465711NSAOct2022 Europe
5484.282102723588NSAOct2022 European Union
788.8124822563948NSAOct2022 Other EU
4697.462851872835NSAOct2022 EU15
939.5503700395926NSAOct2022All Visits
4490.8082280327335NSANov2022All Visits
0SANov2022All Visits
230.08701039829558NSANov2022 North America
3368.252935900889NSANov2022 Europe
3102.9079804583694NSANov2022 European Union
520.2324771485808NSANov2022 Other EU
2580.887335939972NSANov2022 EU15
892.4682817335489NSANov2022All Visits
4088.7353231739844NSADec†2022All Visits
SADec†2022All Visits
351.69140086976745NSADec†2022 North America
2762.759376993988NSADec†2022 Europe
2578.767073136051NSADec†2022 European Union
399.87252296456904NSADec†2022 Other EU
2178.6894861356254NSADec†2022 EU15
974.2845453102291NSADec†2022All Visits