Skip to content

Commit 43064f0

Browse files
authored
IRVE : script de profiling des doublons sur le consolidé dynamique (#5526)
1 parent cf09ac3 commit 43064f0

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# DataProfiling id_pdc_itinerance duplication in the dynamic IRVE consolidated feed.
2+
3+
Mix.install([
4+
{:req, "~> 0.5.15"},
5+
{:explorer, "~> 0.11.0"}
6+
])
7+
8+
defmodule DataProfiling do
9+
require Explorer.DataFrame
10+
alias Explorer.{DataFrame, Series}
11+
12+
@url "https://proxy.transport.data.gouv.fr/resource/consolidation-nationale-irve-dynamique?format=parquet&include_origin=1"
13+
@path Path.join(__DIR__, "../../cache-dir/consolidation-nationale-irve-dynamique.parquet")
14+
15+
def run do
16+
IO.puts("# #{DateTime.utc_now() |> DateTime.to_iso8601()}")
17+
IO.puts("# #{@url}\n")
18+
File.mkdir_p!(Path.dirname(@path))
19+
unless File.exists?(@path), do: %{status: 200} = Req.get!(@url, into: File.stream!(@path))
20+
21+
df = DataFrame.from_parquet!(@path)
22+
total = DataFrame.n_rows(df)
23+
distinct = df["id_pdc_itinerance"] |> Series.distinct() |> Series.size()
24+
IO.puts("rows=#{total} distinct_pdc=#{distinct} dup_rate=#{Float.round((total - distinct) / total * 100, 2)}%\n")
25+
26+
df
27+
|> DataFrame.group_by("origin")
28+
|> DataFrame.summarise(rows: count(col("id_pdc_itinerance")), distinct_pdc: n_distinct(col("id_pdc_itinerance")))
29+
|> DataFrame.sort_by(desc: col("rows"))
30+
|> DataFrame.print(limit: :infinity)
31+
32+
IO.puts("\nTop origin-set patterns (PDC partagé par plusieurs feeds) :")
33+
34+
df
35+
|> DataFrame.select(["id_pdc_itinerance", "origin"])
36+
|> DataFrame.distinct()
37+
|> DataFrame.to_rows(atom_keys: true)
38+
|> Enum.group_by(_key = & &1.id_pdc_itinerance, _value = & &1.origin)
39+
|> Enum.map(fn {_pdc, origins} -> origins |> Enum.sort() |> Enum.join(" + ") end)
40+
|> Enum.frequencies()
41+
|> Enum.sort_by(fn {_origin_set, count} -> count end, :desc)
42+
|> Enum.take(30)
43+
|> Enum.each(fn {origin_set, count} ->
44+
IO.puts(" #{String.pad_leading(to_string(count), 7)} #{origin_set}")
45+
end)
46+
end
47+
end
48+
49+
DataProfiling.run()

0 commit comments

Comments
 (0)