Оранжевый - перезапись данных путем создания новых строк на основе значений столбцов - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь обработать данные по случаям covid-19

(источник, для интереса: https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv)

Данные формируют матрицу, перечисляя даты в столбцах и страны в строках. Упрощенное представление:

country 1/20/20 1/21/20 1/22/20 ... etc. ...
China   100     120     144     ... etc. ...
US      0       0       1       ... etc. ...
...
etc.
...

Я пытаюсь превратить столбцы даты и цифры в две новые функции, скажем, «дата» и «подтверждено», как в:

country date     confirmed
China   1/20/20  100
China   1/21/20  120
China   1/22/20  144
US      1/20/20  0
US      1/21/20  0
US      1/22/20  1
...  etc.  ...

Меня интересует любое решение, которое встраивается в Orange, хотя, конечно же, мы можем подготовить данные перед их импортом!

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы пытаетесь сделать это в сценарии или с помощью canvas? С (чистым) холстом, я думаю, вы не можете. Конечно, вы всегда можете использовать виджет скрипта Python и делать это там.

В скрипте (автономном или в пределах canvas) вы должны рассматривать Orange.data.Table как неизменяемый, хотя это не применяется самим Orange. В нескольких версиях были удалены устаревшие методы, которые могли изменить количество строк. Вы все еще можете изменить данные на месте, но я бы не советовал.

Вам нужно будет создать новую таблицу, которая будет иметь соответствующий размер с самого начала. Я предполагаю, что самый простой способ сделать это - собрать все необходимые данные в список Python (списков), а затем передать его в Table.from_list.

Раскрытие информации: я один из Orange разработчики и я в процессе написания поста в блоге, используя именно эти данные. Это будет серия, и мы также покажем несколько таких сценариев через неделю или две.

0 голосов
/ 04 апреля 2020

Ответ Янеза дал именно ту информацию, которая мне была нужна, спасибо.

Здесь я публикую код для скрипта python в Orange, чтобы дать полное решение проблемы.

from Orange.data import Domain, TimeVariable, ContinuousVariable, StringVariable, Table

# toISODate: parse the date string and returns it in ISO format
def toISODate(s):
    bits = s.split('/')
    year = '20'+bits[2];
    day = bits[1]
    day = day if len(day)==2 else '0'+day
    month = bits[0]
    month = month if len(month)==2 else '0'+month
    return year+'-'+month+'-'+day

# Prepare output domain
tmVar = TimeVariable.make("Date");

out_domain = Domain([ContinuousVariable.make("Lat"),
                     ContinuousVariable.make("Long"),
                     tmVar,
                     ContinuousVariable.make("Count")],
                    [],
                    [StringVariable.make("Country"),
                     StringVariable.make("Region")]
                   )

# Prepare output source - list of lists
out_source = []

in_domain = in_data.domain # not really needed
in_width = len(in_domain) # oops - thank you @community for the reminder

# outer loop through original data rows
for in_row in in_data:
   lat, long = in_row[0], in_row[1] # grab latitute, longitude
   country, region = in_row.metas[1], in_row.metas[0]
   # inner loop through dates in each row
   for j in range(2,in_width):
      date = tmVar.parse(toISODate(in_domain[j].name)) # find date (in clolumn names), parse to UNIX
      # make new row: lat, long, date, number of cases, country, region
      out_row = [lat, long, date, in_row[j], country, region]
      out_source.append(out_row)
   # end
# end in_row

# Make data from the list
out_data = Table.from_list(out_domain,out_source)

В идеале код должен быть написан так, чтобы в общем случае иметь дело с любой матрицей (превращение столбца x, строки y, значения в высокую таблицу с тремя столбцами x, y, значением; затем работа с дополнительными столбцами). Мой Python не до этого (пока).

Кроме того, можно заменить значение «in_width» во внутреннем l oop на «in_data.domain.attributes». это гарантирует, что l oop покроет постоянно увеличивающийся nb столбцов (один новый каждый день)

...