CoolFace
Datasetpublic

data-sci-project/full-ev-infrastrucutre

EV Charging Stations in Finland — Merged Dataset File: ev_stations_merged.csv Rows: 5,410 (one row per charging location) · Columns: 25 Companion file: merge_review.csv (3,158 rows - the matched pairs only, for manual review) This dataset combines two independently collected lists of public EV charging locations in Finland into a single table. It is the base table for the DSP project: recommending 50 new fast-charging locations. 1. Source datasets Google… See the full description on the dataset page: https://huggingface.co/datasets/data-sci-project/full-ev-infrastrucutre.

sourceHugging Faceupdated 11h agoView on Hugging Face
0likes39downloads
Dataset Card

EV Charging Stations in Finland — Merged Dataset

File: ev_stations_merged.csv Rows: 5,410 (one row per charging location) · Columns: 25 Companion file: merge_review.csv (3,158 rows - the matched pairs only, for manual review)

This dataset combines two independently collected lists of public EV charging locations in Finland into a single table. It is the base table for the DSP project: recommending 50 new fast-charging locations.


1. Source datasets

Google Places APIDigitraffic
Records4,9443,848
UnitOne Google placeOne operator-listed charging station
StrengthsAddress, opening hours, ratings, reviewsOperator, connector counts, AC/DC split, max power
ID usedGoogle Place ID (ChIJ…)Operator's own station ID
Columns prefixed/namedgoogle_name, formattedAddress, rating, …hf_*, total_*, operator_name, max_power_kw, …

The two datasets describe the same physical sites from different angles, so they were matched by location and name and combined.

Naming note: in column names and source values, the prefix hf refers to the Digitraffic dataset (hf_only, hf_station_ids, hf_rows, …).


2. How the merge works

Each Google place was matched to Digitraffic stations that lie within 100 m of it (the largest matched distance is 99.8 m). Name similarity was recorded as well, but it is low for almost all pairs (median 0.29). That's because Google names are brand labels ("Virta Charging Station"), while Digitraffic names are site names ("Turun Toriparkki - K1"). In practice, distance is what decided the matches.

Every record from both datasets ends up in the merged file. Nothing was dropped.

`source`RowsGoogle recordsDigitraffic recordsMeaning
both3,1583,1583,382Google place matched to ≥1 Digitraffic station
google_only1,7861,786Google place with no match in Digitraffic data
hf_only466466Digitraffic station with no match in Google data
Total5,4104,9443,848

Why the mismatch in Digitraffic:

3,848 - 3,158 = 690, but there are only 466 hf_only rows. The other 224 Digitraffic records weren't lost. 175 Google places matched 2–9 Digitraffic stations each, and those stations were folded into the one row:

  • names and IDs are joined with ; in hf_station_names / hf_station_ids
  • connector and EVSE counts are summed
  • hf_rows records how many Digitraffic records were combined (1–9)

Example: one Google place at Turun Toriparkki carries 5 Digitraffic records (separate parking levels), totalling 34 connectors.

Reconciliation checks

python
import pandas as pd
ev = pd.read_csv('ev_stations_merged.csv')

ev['source'].value_counts()                               # both 3158, google_only 1786, hf_only 466
(ev['source'] != 'hf_only').sum()                         # 4944  = Google total
ev['hf_rows'].sum()                                       # 3848  = Digitraffic total
ev.loc[ev.source == 'both', 'hf_rows'].sum()              # 3382  Digitraffic records inside matches

3. Columns

Where each column comes from: G = Google Places API · D = Digitraffic (the hf_* columns) · Merge = created during the merge

Identity & location

ColumnFromTypeDescription
place_keyMergestrRow identifier. Google Place ID for both and google_only rows. For hf_only rows, the Digitraffic station ID copied as-is. Not fully unique, see §5.
sourceMergestrboth, google_only or hf_only (see §2).
nameG / DstrDisplay name. Google's name for both/google_only rows. Digitraffic station name for hf_only rows. Google names are brand labels ("K-Lataus Charging Station"), not site names.
lat, lngG / DfloatWGS84 coordinates. Always filled. For matched rows it isn't documented which dataset supplied them.
cityDstrMunicipality/town. Null for all `google_only` rows, but recoverable from formattedAddress.
postalCodeG / Dstr5-digit Finnish postal code. Missing on 27% of hf_only rows.
formattedAddressGstrFull Google address, e.g. Kauppamiehentie 1, 21710 Pargas.

Google attributes (Google Places API)

ColumnTypeRangeDescription
google_namestrGoogle's place name (same as name where present).
openingHoursstrWeekly hours as text. 4,022 rows are "Open 24 hours" every day.
ratingfloat1.0–5.0Average Google rating. Only filled on 28% of rows.
userRatingCountfloat1–2,880Number of Google reviews. Median is 2, so most ratings are based on very few reviews.
connectorCountfloat1–367Google's count of connectors.

Charger attributes (Digitraffic)

ColumnTypeRangeDescription
operator_namestr70 valuesCharging operator, e.g. Liikennevirta, eParking, ABC, K Auto Oy.
total_evsesfloat1–264Charge points (EVSEs), summed across folded records.
total_connectorsfloat1–264Connectors, summed across folded records.
total_dc_connectorsfloat0–40DC (fast) connectors.
total_ac_connectorsfloat0–264AC (slow/medium) connectors.
max_power_kwfloat0.9–1,200Highest charging power at the site, in kW. Median is 22.
highest_power_typestrPower class: AC_SLOW, AC_MEDIUM, DC_SLOW, DC_FAST, DC_ULTRA_FAST_LEVEL_1, DC_ULTRA_FAST_LEVEL_2. Folded rows can list several classes separated by ; .
hf_station_namesstrDigitraffic station name(s), ; -separated if folded.
hf_station_idsstrDigitraffic station ID(s), ; -separated if folded.
hf_rowsfloat1–9Number of Digitraffic records combined into this row.

Match diagnostics (both rows only)

ColumnTypeRangeDescription
dist_mfloat0–99.8Distance in metres between the Google place and the Digitraffic station. Median is 1.5.
name_simfloat0–1Name similarity score. Mostly low because of brand-vs-site naming, so it's weak evidence for or against a match.

4. What's missing, and where

Columns are missing in blocks, depending on source. Filter on source before treating a missing value as zero.

Columns`both``google_only``hf_only`
Charger attributes (operator_name, total_*, max_power_kw, …)all empty
Google attributes (formattedAddress, openingHours, rating, …)all empty
cityall empty
dist_m, name_simemptyempty
rating / userRatingCount37% filled20% filledempty

Power is unknown for 1,789 rows (33%). These are the google_only rows, plus 3 hf_only rows.


5. Known issues

  1. 1.Most rows aren't fast chargers. Only 1,266 rows have `max_power_kw` ≥ 50 (829 are ≥ 150). The most common value is 7.36 kW (1,182 rows). For fast-charging analysis, filter first, for example with total_dc_connectors > 0 or max_power_kw >= 50. Treat the power-unknown rows as a separate group rather than dropping them.
  2. 2.`place_key` has 6 duplicates (232, 234, 235, 236, 373, 900). Some operators number their stations with plain integers, and two operators can use the same number. Each pair is two different sites 85–333 km apart. Fix by adding the operator name to the Digitraffic IDs:
python
   ev['place_key'] = ev['place_key'].where(ev.source != 'hf_only',
                                           ev.operator_name + ':' + ev.place_key.astype(str))

The same collision affects 30 IDs inside hf_station_ids.

  1. 1.Brand names are spelled inconsistently. Virta / VIRTA / Virta Global Charging Station together cover 1,607 rows of one brand. Similar pairs appear in operator_name (Helen Oy / Helen, Neste MY / Neste My). name calls the brand "Virta", while operator_name calls it "Liikennevirta".
  2. 2.`highest_power_type` values in a different order count as different values. AC_SLOW; DC_FAST and DC_FAST; AC_SLOW are the same thing. Split the string, sort, and rejoin before grouping.
  3. 3.Folded rows can hide separate sites. 175 rows combine 2–9 Digitraffic stations. If those stations are far apart, the row overstates one location. Check rows where hf_rows > 1.
  4. 4.Matches 30 m or more apart: there are 562. Their connector counts agree with Google's about as often as closer matches do (90% vs 89%), so distance alone doesn't mark a match as wrong.
  5. 5.`connectorCount` (G) and `total_connectors` (D) disagree on about 11% of matched rows. Pick a rule for which one to trust, and record which source each value came from.
  6. 6.Minor: 2 rows are outside Finland's bounding box. 14 coordinate pairs are shared by 28 rows. 6 names have leading/trailing spaces. 2 postal codes aren't 5 digits.

6. merge_review.csv

Contains the same 3,158 matched pairs as the source == 'both' rows, sorted by name_sim ascending so the least similar names come first. Columns: google_name, hf_station_names, dist_m, name_sim, operator_name.

It has no `place_key`, and google_name only has 97 distinct values. So don't join it back to the merged file on names. Filter the merged file's own dist_m / name_sim columns instead.


7. Compatibility with other datasets

Can be combined with the OSM - Point of Interest dataset or with the traffic volume dataset for exploring demand.