добавив ключ к хэшу ruby ​​я создаю - PullRequest
0 голосов
/ 23 января 2019

Итак, я решил улучшить свой Ruby, когда прекратил работу с офтальмологической черепицей.

Я написал этот скрипт для получения данных прогноза из API MetOffice Datapoint.

Бит, на котором я застрял, -

#!/bin/ruby
# frozen_string_literal: true

#
# This script get the list of UK forecast locations
#
require 'pp'
require 'net/http'
require 'json'
require 'uri'

@apikey = 'insert-key-here'
@base_url = 'http://datapoint.metoffice.gov.uk/public/data/'
@format = 'json'

# Make API call to get list of UK locations

def sitelist_data
  res = "val/wxfcs/all/#{@format}/sitelist?"
  url = "#{@base_url}#{res}key=#{@apikey}"
  url = URI.parse(url)
  resp = Net::HTTP.get(url)
  data = ::JSON.parse(resp)
  data['Locations']['Location'] # Step into the array to get location list
end

# All i need from the list is Authority name and Site name
# Create a list to display all available locations
def sitelist
  @fulllist = sitelist_data
  region_list = {}
  @fulllist.map do |k, _v|
    k.each do |key, value|
      @auth = value if key == 'unitaryAuthArea'
      @name = value if key == 'name'
    end
    region_list[@auth] = @name
  end
  region_list # Return list of locations
end

# Get a 3 hrly forecast for the next 5 days for the chosen location

# Get the raw 3hrly data for a specific region 
def three_hourly_forecast_raw(region)
  res = 'val/wxfcs/all/'
  reg = region
  url = "#{@base_url}#{res}#{@format}/#{reg}?res=3hourly&key=#{@apikey}"
  url = URI.parse(url)
  resp = Net::HTTP.get(url)
  data = ::JSON.parse(resp)
  data['SiteRep']['DV']['Location'] # Step into array to get to forecasts data
end

# Get the headders from the data id, name, longitude and latittude
def three_hourly_forecast_headder(region)
  raw_data = three_hourly_forecast_raw(region)
  raw_data.each do |key, value|
    @id = value if key == 'i'
    @reg = value if key == 'name'
    @lon = value if key == 'lon'
    @lat = value if key == 'lat'
  end
end

# Create a hash of the forecast data with new keys as
# the ones provided by met office are not great
def three_hourly_forecast_values(region)
  three_hourly_forecast = {}
  raw_data = three_hourly_forecast_raw(region)
  raw_data['Period'].map do |key, _value|
    @date = key['value']
    key['Rep'].map do |weather_data, _v|
      three_hourly_forecast[@date] = forecast_hash(weather_data)
    end
  end
end

# Compile weather data hash
def forecast_hash(weather_data)
  {
    hr: weather_data["\$"],
    feels_like: weather_data['F'], # unit = c
    w_gust: weather_data['G'], # unit = mph
    rel_humid: weather_data['H'], # unit = %
    temp: weather_data['T'], # unit = c
    visability: weather_data['V'],
    wind_dir: weather_data['D'], # unit = compass
    wind_speed: weather_data['S'], # unit = mph
    max_uv: weather_data['U'],
    type: weather_data['W'],
    percipitation_probability: weather_data['Pp'] # unit = %
  }
end

pp three_hourly_forecast_values('310069')

В тот момент, когда я запускаю скрипт, я получаю это

[{:hr=>"0",
   :feels_like=>"-1",
   :w_gust=>"40",
   :rel_humid=>"76",
   :temp=>"4",
   :visability=>"GO",
   :wind_dir=>"NW",
   :wind_speed=>"22",
   :max_uv=>"0",
   :type=>"7",
   :percipitation_probability=>"13"},
  {:hr=>"180",
   :feels_like=>"-1",
   :w_gust=>"40",
   :rel_humid=>"75",
   :temp=>"4",
   :visability=>"GO",
   :wind_dir=>"NW",
   :wind_speed=>"22",
   :max_uv=>"0",
   :type=>"2",
   :percipitation_probability=>"10"},
  {:hr=>"360",
   :feels_like=>"-1",
   :w_gust=>"40",
   :rel_humid=>"74",
   :temp=>"4",
   :visability=>"VG",
   :wind_dir=>"NW",
   :wind_speed=>"22",
   :max_uv=>"0",
   :type=>"2",
   :percipitation_probability=>"6"},
  {:hr=>"540",
   :feels_like=>"-1",
   :w_gust=>"36",
   :rel_humid=>"74",
   :temp=>"4",
   :visability=>"VG",
   :wind_dir=>"NNW",
   :wind_speed=>"20",
   :max_uv=>"1",
   :type=>"3",
   :percipitation_probability=>"4"},
  {:hr=>"720",
   :feels_like=>"1",
   :w_gust=>"40",
   :rel_humid=>"63",
   :temp=>"6",
   :visability=>"VG",
   :wind_dir=>"NNW",
   :wind_speed=>"22",
   :max_uv=>"1",
   :type=>"3",
   :percipitation_probability=>"3"},
  {:hr=>"900",
   :feels_like=>"1",
   :w_gust=>"34",
   :rel_humid=>"63",
   :temp=>"6",
   :visability=>"VG",
   :wind_dir=>"NW",
   :wind_speed=>"20",
   :max_uv=>"1",
   :type=>"3",
   :percipitation_probability=>"4"},
  {:hr=>"1080",
   :feels_like=>"0",
   :w_gust=>"27",
   :rel_humid=>"71",
   :temp=>"4",
   :visability=>"VG",
   :wind_dir=>"NW",
   :wind_speed=>"16",
   :max_uv=>"0",
   :type=>"0",
   :percipitation_probability=>"3"},
  {:hr=>"1260",
   :feels_like=>"-1",
   :w_gust=>"20",
   :rel_humid=>"77",
   :temp=>"3",
   :visability=>"VG",
   :wind_dir=>"NW",
   :wind_speed=>"13",
   :max_uv=>"0",
   :type=>"0",
   :percipitation_probability=>"3"}]

То, что я хотел бы, это дата в качестве ключа к каждому хешу, чтобы она выглядела так.

[дата => { данные о погоде }

Что я делаю не так ??

Это чисто учебный проект, поэтому он не должен быть сверхэффективным или что-то в этом роде, но если вы заметите что-то, что я могу улучшить, смело указывайте на это.

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Я предполагаю, что вы поместили ваши данные в переменную с именем data

data = [{:hr=>"0",
         :feels_like=>"-1",
         :w_gust=>"40",
         :rel_humid=>"76",
         :temp=>"4",
         :visability=>"GO",
         :wind_dir=>"NW",
         :wind_speed=>"22",
         :max_uv=>"0",
         :type=>"7",
         :percipitation_probability=>"13"},
        ]

 data.each do |f|
   f.merge!(date: "Whether data")
  end

Out put

       [{:hr=>"0",
         :feels_like=>"-1",
         :w_gust=>"40",
         :rel_humid=>"76",
         :temp=>"4",
         :visability=>"GO",
         :wind_dir=>"NW",
         :wind_speed=>"22",
         :max_uv=>"0",
         :type=>"7",
         :percipitation_probability=>"13"},
         :date => "Whether data"
        ]

Это добавится ключ и значение для каждого хэша.Надеюсь, это поможет.

0 голосов
/ 23 января 2019

Вы назначаете three_hourly_forecast [@date] для Forecast_hash (weather_data) внутри функции карты.Функция map возвращает последнюю строку, в этом случае это будет просто хэш прогноз_hash (weather_data).Поменяйте карту на каждую, чтобы исправить это.

 def three_hourly_forecast_values(region)
  three_hourly_forecast = {}
  raw_data = three_hourly_forecast_raw(region)
  raw_data['Period'].each do |key, _value|
    @date = key['value']
    key['Rep'].each do |weather_data, _v|
      three_hourly_forecast[@date] = forecast_hash(weather_data)
    end
  end
end
0 голосов
/ 23 января 2019

Метод three_hourly_forecast_values ​​будет возвращать результат вызова .map, а не ваш новый хеш, который создается внутри блока карты, поскольку он является последним объектом. Вы можете поместить хэш three_hourly_forecast в качестве последней строки в этом методе, чтобы вернуть ваш новый хеш.

def three_hourly_forecast_values(region)
  three_hourly_forecast = {}
  raw_data = three_hourly_forecast_raw(region)
  raw_data['Period'].map do |key, _value|
    @date = key['value']
    three_hourly_forecast[@date] = []
    key['Rep'].map do |weather_data, _v|
      three_hourly_forecast[@date] << forecast_hash(weather_data)
    end
  end
  three_hourly_forecast
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...