Это короткий, полный пример более сложного реального приложения.
Используемые библиотеки :
import numpy as np
import scipy as sp
import scipy.stats as scist
import matplotlib.pyplot as plt
from itertools import zip_longest
Данные :
У меня есть массив с нерегулярными ячейками, определенными с началом и концом, например, вот так ( в реальном случае этот формат является заданным, поскольку он является выходом другого процесса ):
bin_starts = np.array([0, 93, 184, 277, 368])
bin_ends = np.array([89, 178, 272, 363, 458])
который я объединяю с:
bns = np.stack(zip_longest(bin_starts, bin_ends)).flatten()
bns
>>> array([ 0, 89, 93, 178, 184, 272, 277, 363, 368, 458])
давая регулярно чередующиеся последовательности длинных и коротких интервалов, все неправильной длины
Это схематичное представление заданных длинных и коротких интервалов:
![Bins_sketch](https://i.stack.imgur.com/fTH5O.png)
У меня есть куча данных временных рядов, аналогичных случайным данным, созданным ниже:
# make some random example data to bin
np.random.seed(45)
x = np.arange(0,460)
y = 5+np.random.randn(460).cumsum()
plt.plot(x,y);
![Data to bin](https://i.stack.imgur.com/oczXt.png)
Цель
Я хотел бы использовать последовательность интервалов для сбора статистики (среднее значение, процентили, и т. Д. ) на данных - но только с использованием длинных интервалов, то есть желтых на эскизе.
Допущения и уточнения:
Края длинных интервалов никогда не пересекаются; другими словами, между длинными интервалами всегда есть короткий интервал. Кроме того, первый интервал всегда длинный.
Текущее решение:
Один из способов сделать это - использовать scipy.stats.binned_statistic
на всех интервалах, а затем нарезать результат, чтобы сохранить только все остальные (т. Е. [::2]
), как это (отличная помощь для некоторой статистики, например, np.percentile
, читал этот SO ответ от @ ali_m ):
ave = scist.binned_statistic(x, y,
statistic = np.nanmean,
bins=bns)[0][::2]
, что дает мне желаемый результат:
plt.plot(np.arange(0,5), ave);
![binned_data](https://i.stack.imgur.com/hVJCY.png)
Вопрос :
Есть ли более Pythonic способ сделать это (используя любой из Numpy
, Scipy
или Pandas
)?