- Python Pandas: вычислить скользящее среднее (скользящее среднее) по переменному количеству строк
- 2 ответа
- Python | Панды dataframe.rolling ()
- Панды: скользящее среднее по интервалу времени
- 8 ответов
- Создание набора инструментов для финансовой торговли в Python: простая скользящая средняя
- Представляем скользящую среднюю
- Наглядный пример
- Использование одной скользящей средней
- Построение двух средних и выбор диапазонов дат
- Использование двух скользящих средних
- Использование трех скользящих средних
Python Pandas: вычислить скользящее среднее (скользящее среднее) по переменному количеству строк
Скажем, у меня есть следующий датафрейм
Дает фрейм данных
Как я могу рассчитать среднее значение столбца скорости по скользящей сумме столбца расстояния? В приведенном выше примере создайте скользящую сумму по последним N строкам, чтобы получить минимальное совокупное расстояние, равное 5, а затем вычислите среднюю скорость по этим строкам.
Тогда мой целевой результат будет таким:
Обновление : на языке Pandas мой код должен найти индекс обратной совокупной суммы расстояний обратно из моей текущей записи (такой, чтобы он был 5 или больше), а затем использовать этот индекс для вычисления начала скользящей средней.
2 ответа
Не особо удачное решение, но похоже, что вы хотите сделать что-то вроде
Обновление : после этого ответа OP заявил, что им нужно «действительное решение Pandas (например, без циклов)». Если мы считаем, что это означает, что они хотят чего-то более производительного, чем приведенное выше, то, возможно, по иронии судьбы с учетом комментария, первая оптимизация, которая приходит на ум, — избегать фрейма данных, если это не нужно:
Более того, как предлагает @JohnE, numba быстро пригодится для дальнейшей оптимизации. Хотя для первого решения, описанного выше, это мало что значит, второе решение можно украсить готовым @numba.jit с немедленными выгодами. Тестирование всех трех решений на
Получаю следующие результаты:
Даже невинно выглядящего mean достаточно, чтобы отбросить онумбу; если мы избавимся от этого и пойдем с
Тогда тест сокращается до 158 мкс ± 8,41 мкс.
Теперь, если вы знаете больше о структуре df[‘distance’] , цикл while , вероятно, можно оптимизировать дальше. (Например, если значения всегда оказываются намного меньше 5, будет быстрее вырезать накопительную сумму из ее хвоста, чем все пересчитывать.)
Источник
Python | Панды dataframe.rolling ()
Python — отличный язык для анализа данных, в первую очередь благодаря фантастической экосистеме пакетов Python, ориентированных на данные. Pandas является одним из таких пакетов и значительно упрощает импорт и анализ данных.
Функция Pandas dataframe.rolling() предоставляет возможность вычисления скользящего окна. Концепция расчета скользящего окна чаще всего используется при обработке сигналов и данных временных рядов. Проще говоря, мы берем размер окна k за раз и выполняем некоторые математические операции над ним. Окно размером k означает k последовательных значений одновременно. В очень простом случае все значения «k» имеют одинаковый вес.
Syntax : DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
Parameters :
window : Size of the moving window. This is the number of observations used for calculating the statistic. Each window will be a fixed size. If its an offset then this will be the time period of each window. Each window will be a variable sized based on the observations included in the time-period. This is only valid for datetimelike indexes.
min_periods : Minimum number of observations in window required to have a value (otherwise result is NA). For a window that is specified by an offset, this will default to 1.
freq : Frequency to conform the data to before computing the statistic. Specified as a frequency string or DateOffset object.
center : Set the labels at the center of the window.
win_type : Provide a window type. See the notes below.
on : For a DataFrame, column on which to calculate the rolling window, rather than the index
closed : Make the interval closed on the ‘right’, ‘left’, ‘both’ or ‘neither’ endpoints. For offset-based windows, it defaults to ‘right’. For fixed windows, defaults to ‘both’. Remaining cases not implemented for fixed windows.
axis : int or string, default 0
Примечание. Ключевое слово freq используется для подтверждения данных временного ряда на заданной частоте путем повторной выборки данных. Это делается с параметрами по умолчанию resample() (то есть с использованием среднего значения).
Если win_type = none, тогда все значения в окне равномерно взвешены. Существуют различные другие типы окон подвижного типа. Чтобы узнать больше о другом типе скользящего окна, обратитесь к этой документации.
Для ссылки на CSV-файл, используемый в коде, нажмите здесь . Это данные о цене акций Apple за период в 1 год с (13-11-17) по (13-11-18)
Пример # 1: скользящая сумма с окном размера 3 в столбце цены закрытия акций
# импорт панд как pd
import pandas as pd
# По умолчанию столбец «дата» был в строковом формате,
# нам нужно конвертировать его в формат даты и времени
# parse_dates = [«date»], преобразует столбец «date» в формат даты и времени
# Повторная выборка работает только с данными временных рядов
# поэтому конвертируем столбец «дата» в индекс
# index_col = «date», создает столбец «date»
df = pd.read_csv( «apple.csv» , parse_dates = [ «date» ], index_col = «date» )
# Печать первых 10 строк данных
№ 3 указывает размер окна
# мы выбрали окно типа «треугольник»
# который возвращает окно треугольного типа
Функция # sum () находит сумму за
# все окна в нашем фрейме данных
df.close.rolling( 3 , win_type = ‘triang’ ). sum ()
Выход :
Пример № 2: скользящее окно означает размер окна больше 3. Мы используем тип окна по умолчанию, который не равен ни одному. Таким образом, все значения будут равномерно взвешены.
# импорт панд как pd
import pandas as pd
df = pd.read_csv( «apple.csv» , parse_dates = [ «date» ], index_col = «date» )
# close — столбец, по которому
# мы выполняем операцию
Функция # mean () находит среднее значение для каждого окна
df.close.rolling( 3 ).mean()
Выход :
Источник
Панды: скользящее среднее по интервалу времени
Я новичок в Pandas . У меня есть куча данных опроса; Я хочу вычислить скользящее среднее, чтобы получить оценку для каждого дня на основе трехдневного окна. Как я понял из этого вопроса, функции roll_ * вычисляют окно основано на указанном количестве значений, а не на конкретном диапазоне даты и времени.
Есть ли другая функция, которая реализует эту функцию? Или я застрял писать свой собственный?
Пример исходных данных:
Вывод будет иметь только одну строку для каждой даты.
РЕДАКТИРОВАТЬ x2: исправлена опечатка
8 ответов
Тем временем была добавлена возможность временного окна. Смотрите ссылку ниже:
Этот пример, кажется, требует взвешенного среднего значения, как предлагается в комментарии @ andyhayden. Например, есть два опроса 10/25 и один каждый 10/26 и 10/27. Если вы просто измените выборку, а затем возьмете среднее, это даст вдвое больший вес опросам 10/26 и 10/27 по сравнению с опросами 10/25.
Чтобы придать равный вес каждому опросу , а не равный вес для каждого дня , вы можете сделать что-то вроде следующего.
Это дает вам необработанные ингредиенты для создания среднего по опросам вместо среднего по дням. Как и прежде, опросы усредняются 10/25, но вес для 10/25 также сохраняется и вдвое превышает вес для 10/26 или 10/27, чтобы отразить, что два опроса были проведены 10/25.
Обратите внимание, что скользящее среднее для 10/27 теперь составляет 0,51500 (взвешенное по опросам), а не 52,1667 (взвешенное по дням).
Также обратите внимание, что в версии API resample и rolling были изменения в версии 0.18.0.
А как насчет этого:
Сначала пересчитайте кадр данных в 1D интервалы. Это принимает среднее значение для всех повторяющихся дней. Используйте параметр fill_method , чтобы заполнить пропущенные значения даты. Затем передайте пересчитанный кадр в pd.rolling_mean с окном 3 и min_periods = 1:
ОБНОВЛЕНИЕ . Как отмечает Бен в комментариях, с пандами 0,18 .0 синтаксис изменился. С новым синтаксисом это будет:
Убедитесь, что ваш индекс действительно datetime , а не str Может быть полезно:
Код user2689410 был именно тем, что мне было нужно. Предоставление моей версии (кредиты для user2689410), которая быстрее из-за одновременного вычисления среднего значения для целых строк в DataFrame.
Надеюсь, что мои суффиксные соглашения доступны для чтения: _s: строка, _i: int, _b: bool, _ser: Series и _df: DataFrame. Где вы найдете несколько суффиксов, тип может быть как.
Для простоты я использовал цикл и что-то вроде этого, чтобы вы начали (мой индекс datetime):
А затем вы можете запустить функции на этом слайсе. Вы можете видеть, как добавление итератора, чтобы сделать начало окна чем-то отличным от первого значения в вашем индексе фреймов данных, затем перевернет окно (например, вы можете использовать правило> для начала).
Обратите внимание, что это может быть менее эффективно для СУПЕР больших данных или очень маленьких приращений, поскольку ваша нарезка может стать более напряженной (мне подходит достаточно для сотен тысяч строк данных и нескольких столбцов, хотя для почасовых окон в течение нескольких недель)
У меня был тот же вопрос, но с нерегулярно расположенными точками данных. Resample здесь не вариант. Поэтому я создал свою собственную функцию. Может быть, это будет полезно и другим:
Я обнаружил, что код user2689410 сломался, когда я попытался с window = ‘1M’, поскольку дельта в рабочем месяце выдавала эту ошибку:
Я добавил опцию для прямой передачи относительной дельты времени, чтобы вы могли делать подобные вещи для определенных пользователем периодов.
Спасибо за указатели, вот моя попытка — надеюсь, что она полезна.
И пример с 3-дневным временным окном для вычисления среднего значения:
Источник
Создание набора инструментов для финансовой торговли в Python: простая скользящая средняя
Дата публикации Sep 16, 2019
Python, с его мощным пакетом анализа данныхпанд, взял штурмом мир анализа финансовых рынков. Это позволяет исследователям выполнять сложный анализ, который когда-то требовал специальных и дорогих пакетов.
С этим постом мы собираемся углубиться в анализ финансового рынка с использованием Python и панд. Мы построим ряд рыночных цен и добавим базовый индикатор. В следующих статьях мы узнаем, как плавать шаг за шагом, создав полный набор инструментов, который можно использовать для создания систем для торговли акциями или другими финансовыми активами.
Большинство концепций, которые мы собираемся реализовать, относятся к области, известной какТехнический анализдисциплина, нацеленная на оценку инвестиций и выявление возможностей путем анализа данных, генерируемых торговой деятельностью, таких как цена и объем.
Представляем скользящую среднюю
скользящее среднееявляется одним из простейших технических индикаторов, но его можно использовать и комбинировать различными способами, чтобы обеспечить основу торговых систем и структур для принятия инвестиционных решений.
Скользящие средние, как и все технические индикаторы, основаны на ценовом ряду финансового инструмента. В нашем примере мы рассмотрим дневную ценовую сериюSPDR S & P 500 ETF Trust(символ: шпион),Биржевой фонд(ETF) торгуется на бирже NYSE Arca. Этот ETF имитирует работу индекса фондового рынка S & P 500. Мы хотим использовать скользящие средние для принятия инвестиционных решений — чтобы решить, когда покупать или продавать акции SPY.
Существуют разные виды скользящих средних. Три наиболее часто используемые:
- Простая скользящая средняя
- Линейно взвешенное скользящее среднее
- Экспоненциально сглаженное скользящее среднее
Примеры в этом посте будут сосредоточены наПростая скользящая средняя (SMA), Его конструкция довольно проста: сначала мы определяем скользящее окно длиныN(в нашем примере количество дней — давайте использоватьп = 5). Затем мы начнем с 5-го дня и рассмотрим все цены с 1-го по 5-й день (включены). Мы вычисляем среднее арифметическое этих цен (суммируя их и деля на 5): это значение нашего SMA для дня 5. Затем мы переходим к дню 6, вынимаем цену в день 1 и включаем цена на 6-й день и вычисление следующего SMA. Мы продолжаем повторять процесс, пока не достигнем последней цены в нашей серии. Смотрите таблицу:
Вы заметили, что первые 4 значения нашего скользящего среднего значения не рассчитываются: до 5-го дня не хватает дней для заполнения 5-дневного окна.
Наглядный пример
Давайте применим эту концепцию к работе и создадим несколько практических примеров, используя Python,панд, а такжеMatplotlib, Я предполагаю, что у вас есть хотя бы некоторые базовые знания Python и вы знаете, что такое DataFrame и объект Series. Если это не так, вы можете найти нежное введениеВот, Я также предлагаю вам использоватьJupyterзаписная книжка, чтобы следовать вместе со следующим кодом. Здесь вы можете найти удобныйУчебник по Jupyter, Однако вы всегда выполняете код своим любимым способом, через IDE или интерактивную подсказку. Начнем с загрузки необходимых библиотек и проверки их версий:
Если вы используетеJupyterРекомендуется отобразить диаграмму в блокноте:
В этом случае вы можете опустить все plt.show() заявления во всем коде в этом посте.
Далее мы загружаем данные в DataFrame. Я получил CSV-файл ежедневных данных для SPY отYahoo! финансов, Вы можете скачатьмой CSV файл здесь,
Вывод в Jupyter показывает, как выглядят наши данные:
Наш фрейм данных состоит из шести столбцов, один для цен открытия, максимума, минимума, закрытия, скорректированного закрытия и объема соответственно. Для простоты в наших примерах мы будем использовать только скорректированные цены закрытия. Это ценовой ряд, который отражает дивиденды, дробление акций и другие корпоративные события, которые влияют на доходность акций.
Мы можем легко построить ценовой ряд для визуального осмотра:
Если тыиспользуя Jupyterпомните, что вы можете бросить plt.show() строка, здесь и в следующих строках кода. Мы получаем:
Pandas позволяет легко рассчитать скользящее среднее за 50 дней. Используяпрокатки ()Методом мы устанавливаем 50-дневное окно, по которому мы вычисляем среднее арифметическое (среднее), используяозначать()метод:
Как и следовало ожидать, первые 49 значений ряда пусты:
Теперь мы можем построить нашу первую скользящую среднюю на графике. Чтобы улучшить внешний вид, мы можем использовать предопределенный стиль:
Вы можете экспериментировать с разными стилями, проверить, что доступноВот Теперь мы можем построить наш график:
Вот наша скользящая средняя, построенная против цены:
Использование одной скользящей средней
Наша простая скользящая средняя делает хорошую работу, сглаживая ценовые движения и помогая нам визуально идентифицировать тренд: когда средняя линия поднимается, мы имеем восходящий тренд. Когда среднее указывает вниз, мы находимся в нисходящем тренде.
Мы можем сделать больше, чем это: возможно генерировать торговые сигналы, используя одну скользящую среднюю. Когда цена закрытия движется выше скользящей средней снизу, у нас есть сигнал на покупку:
Аналогично, когда цена пересекает скользящую среднюю сверху, генерируется сигнал на продажу:
Построение двух средних и выбор диапазонов дат
Давайте сравним две скользящие средние с разной продолжительностью 20 и 50 дней соответственно:
Наш график теперь немного переполнен: было бы неплохо иметь возможность увеличить диапазон дат по нашему выбору. Мы могли бы использоватьplt.xlim ()инструкция (например, plt.xlim(‘2017-01-01′,’2018-12-31’) просто попробуйте добавить его в код выше). Тем не менее, я хочу исследовать другой маршрут: создать новый фрейм данных, который включает цену и скользящие средние:
Объединение всех наших рядов в одном фрейме данных позволяет легко создать мгновенный график:
Хотя создание мгновенного графика с собственным фреймом данныхсюжет()Метод удобен, я предпочитаю настраивать свою диаграмму, используя отдельные вызовы функций. Еще одним преимуществом того, что все наши серии находятся в одном кадре данных, является то, что мы можем легко выбратьдиапазон дат(например, даты в 2017 и 2018 гг. включены) и нанесите на график только данные в этом диапазоне:
Нарезка данных по диапазону дат — одна из замечательных особенностей панд. Все следующие заявления работают:
- priceSma_df[‘2017-04-01′:’2017-06-15’] : диапазон, определенный двумя конкретными датами
- priceSma_df[‘2017-01] : цены за месяц
- priceSma_df[‘2017] : цены за данный год
Использование двух скользящих средних
Комбинируя две скользящие средние, мы можем использовать технику, которая называетсяметод двойного кроссовера, С этой настройкой сигнал на покупку генерируется всякий раз, когда короткая скользящая средняя пересекает длинную снизу. Точно так же сигнал на продажу генерируется всякий раз, когда более короткая скользящая средняя пересекает длинную сверху:
По сравнению с техникой, которая использует только одну скользящую среднюю и цену, метод двойного кроссовера дает меньше быстрых разворотов. С другой стороны, он может генерировать сигналы с некоторой задержкой.
Использование трех скользящих средних
Если мы можем использовать две скользящие средние вместе, тогда почему не три?
Вы можете видеть, как долгосрочные 200 SMA помогают нам очень легко идентифицировать тенденцию.
Это подводит нас кметод тройного кроссовера, Набор скользящих средних, которые мы использовали, с продолжительностью 20, 50 и 200 дней соответственно, широко используется среди аналитиков. Мы можем рассмотреть сигнал на покупку, когда 20 SMA пересекает 50 SMA снизу, но только когда оба средних значения выше 200 SMA. Все кроссы на покупку, которые происходят ниже 200 SMA, будут игнорироваться.
Примеры в этом посте — лишь некоторые из множества возможностей, которые можно сгенерировать, комбинируя цену и скользящие средние разной длины. Также, цена и скользящие средние могут быть объединены с другими доступнымитехнические индикаторыили показатели, которые мы можем создать сами. Python и pandas обеспечивают всю мощь и гибкость, необходимые для исследования и построения прибыльной торговой системы.
Источник