|
| 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