Взятие среднего значения каждого n элементов в массиве и преобразование кода MATLAB в Python - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь преобразовать программу MATLAB в Python и наткнулся на препятствие с определенным циклом: у меня есть матрица 5868x3500, включающая 5868 ежедневных наблюдений, соотношение возвратов и объемы 3500 акций, эти данные используются для получениямера рыночной ликвидности, принимая ежемесячные средние значения отношения доходности каждой акции к ее объему.У меня есть вектор 5868x1 с именем Dummymonth, который присваивает целое число каждому месяцу от 1 до 270 с ~ 22 торговыми днями в месяце (1,1,1,1,1,1,1,1,1,1,1... 2,2,2,2,2,2... 270,270,270).

Цикл, в котором я застрял, должен преобразоватьматрицу 5868x3500 в матрицу 270x3500, взяв среднемесячное значение в соответствии со значениями Dummymonth (т. е. в основном взяв среднее из каждых 22 значений).

Я попытался преобразовать код максимально чисто (подставив MATLAB *Функция 1007 * для Python * .argwhere()), но я относительно новичок в Python (и действительно в MATLAB), поэтому проблемы с кодом не кажутся мне сразу очевидными.

Вот раздел кода MATLAB Iя пытаюсь эмулировать:

numberofmonth=Dummymonth(size(Ret,1));
i=1;
for di=1:numberofmonth
    v=find(Dummymonth==di);
    for j=1:size(Ret, 2)
        Amihud2(i,j)=nanmean(Amihud1(v,j));
    end
    i=i+1;
end

И вот что у меня есть в Python:

import numpy as np
Amihud2 = np.empty((270, len(Amihud1)))
for month_num in range(0, 270):
    v = np.argwhere(dummy == month_num)
    for i in range(1, len(Amihud1)):
        for j in range(1, len(Amihud1[0])):
            Amihud2[i][j] = np.mean(Amihud1[v][j])

Ошибки, которые я обычно вижу, это «ошибки индексации за пределами».

1 Ответ

0 голосов
/ 23 июня 2019

Я думаю, что одна из ошибок связана с индексацией Python 0.Если вы зацикливаетесь на чем-то и начинаете с 1, вы пропускаете первые (индекс 0) значения.Вот одно решение (их много):

#Create Dummy index
dummy =np.array([np.repeat(i,22) for i in np.arange(270)+1]).flatten()

#Make Dataset for example
dat = np.random.random((len(dummy),3500))

#Calculate average per month
dat2 = np.empty((270,3500))
i=-1
for m in np.unique(dummy):
    i=i+1
    dat2[i,:]=dat[dummy==m].mean(axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...