Это довольно просто сделать с простым Ruby, что может быть проще, чем пытаться использовать SQL. Вот что вам поможет:
require 'ostruct'
rows = [
OpenStruct.new(name: 'USR-A', office: 'LA-HQ', device: 'MACBOOK'),
OpenStruct.new(name: 'USR-B', office: 'LA-HQ', device: 'MACBOOK'),
OpenStruct.new(name: 'USR-A', office: 'LA-HQ', device: 'IMAC'),
OpenStruct.new(name: 'USR-B', office: 'NY-HQ', device: 'IMAC'),
OpenStruct.new(name: 'USR-B', office: 'NY-HQ', device: 'IPHONE'),
]
groups = rows.group_by { |i| "#{i.name}#{i.office}" }.values
groups = groups.map do |group|
device = group.map(&:device).join(", ")
OpenStruct.new(
name: group.first.name,
office: group.first.office,
device: device
)
end
p groups
=> [#<OpenStruct name="USR-A", office="LA-HQ", device="MACBOOK, IMAC">,
#<OpenStruct name="USR-B", office="LA-HQ", device="MACBOOK">,
#<OpenStruct name="USR-B", office="NY-HQ", device="IMAC, IPHONE">]
Если вы хотите построить месяц, вы можете сделать
data.loc['2018-02',"X"].plot()
6 месяцев
data.loc['2018-02':'2018-08',"X"].plot()
, и та же логика применяется для других диапазонов
Вам может понадобиться сделать еще один шаг обработки для вашего индекса, чтобы убедиться, что вы имеете дело с объектами datetime, а не со строками.
new_data = (
data
.assign(datetime=lambda df: pandas.to_datetime(df.index))
.set_index('datetime')
)
new_data["X"].plot()
Это должно приблизить нас к тому, что вы хотите, но я не проверял это на данных с вашим форматом даты.