#matlab #group-by #statistics #mean
#matlab #группировать по #Статистика #имеется в виду
Вопрос:
У меня есть данные, хранящиеся в табличном формате как
data = table(['A';'B';'A';'A';'B'], datetime('now')-days([1;2;1;2;2]), rand(5,1)*100, 'VariableNames', {'Stock','Date','Open'})
Вывод вышеуказанных данных
Stock Date Open
_____ ____________________ ______
A 28-Aug-2020 07:51:36 81.472
B 27-Aug-2020 07:51:36 90.579
A 28-Aug-2020 07:51:36 12.699
A 27-Aug-2020 07:51:36 91.338
B 27-Aug-2020 07:51:36 63.236
Я хочу вычислить среднее значение, Open
сгруппированное по Stock
и Date
.
Желаемый результат был бы
Stock Date GroupCount mean_Open
_____ ____________________ __________ _________
A 27-Aug-2020 16:27:51 1 91.338
A 28-Aug-2020 16:27:51 2 47.086
B 27-Aug-2020 16:27:51 2 76.908
Что я пробовал:
Первая попытка
mu = varfun(@mean, data,'GroupingVariables',{'Stock', 'Date'},'InputVariables','Open')
Ошибка из приведенного выше кода:
Error using tabular/varfun (line 206)
Not enough input arguments.
Если сгруппировать по одной переменной, я могу получить результаты, например, приведенный ниже код работает:
mu = varfun(@mean, data,'GroupingVariables','Stock','InputVariables','Open')
Вывод:
Stock GroupCount mean_Open
_____ __________ _________
A 3 61.836
B 2 76.908
Вывод из
which mean -all
C:Program FilesMATLABR2017btoolboxmatlabdatafunmean.m
C:Program FilesMATLABR2017btoolboxmatlabbigdata@tallmean.m % tall method
C:Program FilesMATLABR2017btoolboxmatlabtimefun@durationmean.m % duration method
C:Program FilesMATLABR2017btoolboxmatlabtimefun@datetimemean.m % datetime method
C:Program FilesMATLABR2017btoolboxdistcompparallel@codistributedmean.m % codistributed method
C:Program FilesMATLABR2017btoolboxdistcompgpu@gpuArraymean.m % gpuArray method
C:Program FilesMATLABR2017btoolboxfinanceftseries@fintsmean.m % fints method
C:Program FilesMATLABR2017btoolboxmbcmbctools@sweepsetmean.m % sweepset method
C:Program FilesMATLABR2017btoolboxstatsstats@ProbDistUnivParammean.m % ProbDistUnivParam method
C:Program FilesMATLABR2017btoolboxmatlabtimeseries@timeseriesmean.m % timeseries method
Вывод из:
which('mean','in','varfun')
C:Program FilesMATLABR2017btoolboxmatlabdatafunmean.m
Вторая попытка
[G,tabout] = findgroups(data(:,{'Stock','Date'}));
tabout.avgOpen = splitapply(@mean,data.Open,G);
ошибка из приведенного выше фрагмента кода:
Error using findgroups (line 86)
Unable to use a character array as a grouping variable. First convert the character array to a cell array of character vectors using cellstr. Then specify the cell array as
a grouping variable.
Комментарии:
1. Не могли бы вы уточнить, каков желаемый результат? Это кажется неполным
2. @Paolo Я добавил желаемый результат вместе со значениями.
3. Прохладный. Эти даты выглядят неправильно, хотя?
4. Вероятно, было бы проще предоставить пример воспроизведения с фиксированными данными вместо случайных
5. @Paolo Меня меньше всего волнуют даты, однако я это исправил. Числа генерируются случайным образом. Если вы можете предоставить решение, используя любые даты, любые цены или любую категорию, этого было бы достаточно, и у меня нет проблем с этим. Проблема здесь в том, что код не работает. Если вы можете сообщить мне, как заставить это работать независимо от данных, я не буду возражать против принятия этого ответа. Но концепция группировки по 2 столбцам должна быть рассмотрена в ответе.