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.
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
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.
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
;inhf_station_names/hf_station_ids - connector and EVSE counts are summed
hf_rowsrecords 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
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 matches3. Columns
Where each column comes from: G = Google Places API · D = Digitraffic (the hf_* columns) · Merge = created during the merge
Identity & location
Google attributes (Google Places API)
Charger attributes (Digitraffic)
Match diagnostics (both rows only)
4. What's missing, and where
Columns are missing in blocks, depending on source. Filter on source before treating a missing value as zero.
Power is unknown for 1,789 rows (33%). These are the google_only rows, plus 3 hf_only rows.
5. Known issues
- 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 > 0ormax_power_kw >= 50. Treat the power-unknown rows as a separate group rather than dropping them. - `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:
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.
- Brand names are spelled inconsistently.
Virta/VIRTA/Virta Global Charging Stationtogether cover 1,607 rows of one brand. Similar pairs appear inoperator_name(Helen Oy/Helen,Neste MY/Neste My).namecalls the brand "Virta", whileoperator_namecalls it "Liikennevirta". - `highest_power_type` values in a different order count as different values.
AC_SLOW; DC_FASTandDC_FAST; AC_SLOWare the same thing. Split the string, sort, and rejoin before grouping. - 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. - 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.
- `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.
- 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.
