Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Labolatorium 5

Lab05/labolatorium_5.livemd

Labolatorium 5

Reading data

lines = File.read!("d:/AGH/Semestr IV/Erlang/Lab05/AirlyData-ALL-50k.csv") 
|> String.split("\n", trim: true) 

trim usuwa na puste stringi z listy, które są na początku lub na końcu listy

Parser module

defmodule DataParse do
  def parseLine(l) do
    [date_time,type,val,station_id,name,cords] = String.split(l,";")
    date = date_time |> String.slice(0..18) 
      |> String.replace("T", "-") 
      |> String.split(["-",":"]) 
      |> Enum.map(&String.to_integer/1) 
      |> then(fn [y,m,d,h,min,s] -> {{y,m,d},{h,min,s}} end)
    [loc1,loc2] = String.split(cords,",")

    %{
      :datetime => date,
      :location => {String.to_float(loc1), String.to_float(loc2)},
      :stationId => String.to_integer(station_id),
      :stationName => name,
      :pollutionType => type,
      :pollutionLevel => String.to_float(val)
    }
  end

  def identifyStation(data) do
    data |> Enum.map(fn record -> {record.location, record.stationId, record.stationName} end) 
    |> Enum.uniq_by(fn x -> x end)
  end
end
data = for line <- lines do
  DataParse.parseLine(line)
end

unique_stations = DataParse.identifyStation(data)
IO.puts("Number of stations: #{unique_stations |> length()}")

data
# Code.append_path(
#   "D:\\AGH\\Semestr IV\\Erlang\\pollution_server\\_build\\default\\lib\\pollution_server\\ebin"
# )

# monitor = :pollution.create_monitor()
# monitor2 = :pollution.add_station("MyStation",{50.1, 50.1},monitor)
# monitor3 = :pollution.add_value("MyStation", {{2024, 2, 10}, {15, 0, 0}}, "PM10", 42,monitor2)
# :pollution.get_station_min("MyStation", "PM10",monitor3)

Empty monitor

Code.append_path(
  "D:\\AGH\\Semestr IV\\Erlang\\pollution_server\\_build\\default\\lib\\pollution_server\\ebin"
)

Application.stop(:pollution_server)
Application.start(:pollution_server)
# :pollution_gen_server.add_station("MyStation", {50.01, 20.01})
# :pollution_gen_server.add_value("MyStation", {{2024, 2, 10}, {15, 0, 0}}, "PM10", 42)
# :pollution_gen_server.get_station_min("MyStation", "PM10")

Loding stations

add_stat = fn -> 
  for {loc,id,name} <- unique_stations do
    stat_name = "#{id} #{name}"
    :pollution_gen_server.add_station(stat_name, loc)
  end
end

insert_data = fn -> 
  for station <- data do
    :pollution_gen_server.add_value(
      station.location,
      station.datetime,
      station.pollutionType,
      station.pollutionLevel
    )
  end
end

get functions

get_st_val = fn ->
  :pollution_gen_server.get_station_min("9910 Polska, Kraków, Studencka", "PM10")
end
get_st_val |> Timer.measure_time_res()
get_st_min = fn ->
  :pollution_gen_server.get_daily_mean("PM25", {2024, 2, 10})
end
get_st_min |> Timer.measure_time_res()

Timers

defmodule Timer do
  def measure_time(function) do
    t = function |> :timer.tc |> elem(0)
    t / 1_000_000
  end

  def measure_time_res(function) do
    {t, res} = function |> :timer.tc
    {t / 1_000_000, res}
  end
end
add_stat |> Timer.measure_time()
insert_data |> Timer.measure_time()
whereis(pollution_gen_server).

Homework (Loader)

defmodule PollutionDataLoader do
  def load(file_arr) do
    data = for line <- file_arr do
      DataParse.parseLine(line)
    end
    data
  end
end