объединение CSV файлов из Covid-данных - PullRequest
0 голосов
/ 03 августа 2020

Я хочу объединить CSV-файлы из данных Johns Hopkins Covid (например, https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/05-10-2020.csv и https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-23-2020.csv).

Мне уже удалось загрузить файлы в DataFrame, а также очистка заголовка (_ vs. / в некоторых именах). Теперь я хочу выбрать один столбец (например, «Подтверждено»), переименовать его в день создания файла, а затем объединить эти CSV-файлы, чтобы получить прогресс с течением времени.

Это слияние должно выполняться с помощью state_province. В обоих кадрах ключ может отсутствовать. Как я могу это сделать? Я экспериментировал с правым соединением и внешним соединением, но безуспешно. Может кто-нибудь указать мне правильный путь, пожалуйста?

Сначала я не хотел делиться кодом, который у меня есть, потому что я не хотел указывать на конкретное решение c - но вот он . Он скопирован вместе из нескольких ячеек Jupyter.

using Dates

start = Dates.Date(2020,1,22) #begin of recording
now = Dates.Date(Dates.now())- Dates.Day(1) #today
date_range = collect(start:Dates.Day(1):now) #create a date range with 1 element per day
prefix = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
suffix = ".csv"

function create_url(date)
    return prefix * Dates.format(date, "mm-dd-YYYY") * suffix
end

function cleanup_column_names(name)
   if name == "Country/Region" || name == "Country_Region" 
        return "country"
    elseif name == "Province/State" || name == "Province_State"
        return "state"
    else
        return name
    end
end

using CSV
using HTTP
using DataFrames

selected_data = "Confirmed"
date = date_range[1]

data = DataFrame(CSV.File(HTTP.get(create_url(date)).body))
DataFrames.rename!(cleanup_column_names, data)
DataFrames.select!(data,["state", "country", selected_data])
DataFrames.rename!(data, 3 => Dates.format(date, "YYYY-mm-dd"))

С уважением, Тобиас

1 Ответ

0 голосов
/ 24 августа 2020

Я относительно новичок в Джулии, поэтому отнеситесь к моему ответу с небольшим скептицизмом:

Сначала мы превращаем создание DataFrame в функцию:

function prepare_date_df(date)
    data = DataFrame(CSV.File(HTTP.get(create_url(date)).body))
    DataFrames.rename!(cleanup_column_names, data)
    DataFrames.select!(data,["state", "country", selected_data])
    DataFrames.rename!(data, 3 => Dates.format(date, "YYYY-mm-dd"))
    return data
end

Давайте создадим наш первый Фрейм данных:

df = prepare_date_df(date_range[1])

Теперь давайте переберем все другие даты, создадим фрейм данных для каждой даты и объединим его с нашим первым фреймом данных:

for date in date_range[2:end]
    df_new = prepare_date_df(date)
    df = outerjoin(df, df_new, on = [:state, :country])
end 

Это отлично работает для первого два месяца, но с ростом Dataframes он внезапно становится очень медленным (и даже зависает?). Так что я был бы очень заинтересован в более перформативном ответе!

...