#python #pandas #time-series
#питон #панды
Вопрос:
У меня есть этот фрейм данных:
avg date high low qty
0 16.92 2013-05-27 00:00:00 19.00 1.22 71151.00
1 14.84 2013-05-30 00:00:00 19.00 1.22 42939.00
2 9.19 2013-06-02 00:00:00 17.20 1.23 5607.00
3 23.63 2013-06-05 00:00:00 5000.00 1.22 5850.00
4 13.82 2013-06-10 00:00:00 19.36 1.22 5644.00
5 17.76 2013-06-15 00:00:00 24.00 2.02 16969.00
Каждая строка представляет собой наблюдение за средним значением, максимумом, минимумом и кол-вом, созданным на указанную дату.
Я пытаюсь вычислить экспоненциальное скользящее средневзвешенное значение с интервалом в 60 дней:
df["emwa"] = pandas.ewma(df["avg"],span=60,freq="D")
Но я получаю
TypeError: Only valid with DatetimeIndex or PeriodIndex
Хорошо, так что, возможно, мне нужно добавить DatetimeIndex в мой фрейм данных, когда он будет создан. Позвольте мне изменить мой вызов конструктора с
df = pandas.DataFrame(records) #records is just a list of dictionaries
Для
rng = pandas.date_range(firstDate,lastDate, freq='D')
df = pandas.DataFrame(records,index=rng)
Но теперь я получаю
ValueError: Shape of passed values is (5,), indices imply (5, 1641601)
Есть какие-нибудь предложения о том, как вычислить мой EMWA?
Комментарии:
1. Метод в принятом ответе устарел. Пожалуйста, рассмотрите возможность принятия решения, следующего за принятым ответом, который был обновлен с использованием текущих методов.
Ответ №1:
Вам нужно две вещи: убедиться, что столбец даты состоит из дат (а не из строк) и установить индекс на эти даты.
Вы можете сделать это за один раз, используя to_datetime
:
In [11]: df.index = pd.to_datetime(df.pop('date'))
In [12]: df
Out[12]:
avg high low qty
date
2013-05-27 16.92 19.00 1.22 71151
2013-05-30 14.84 19.00 1.22 42939
2013-06-02 9.19 17.20 1.23 5607
2013-06-05 23.63 5000.00 1.22 5850
2013-06-10 13.82 19.36 1.22 5644
2013-06-15 17.76 24.00 2.02 16969
Затем вы можете вызвать emwa
, как и ожидалось:
In [13]: pd.ewma(df["avg"], span=60, freq="D")
Out[13]:
date
2013-05-27 16.920000
2013-05-28 16.920000
2013-05-29 16.920000
2013-05-30 15.862667
2013-05-31 15.862667
2013-06-01 15.862667
2013-06-02 13.563899
2013-06-03 13.563899
2013-06-04 13.563899
2013-06-05 16.207625
2013-06-06 16.207625
2013-06-07 16.207625
2013-06-08 16.207625
2013-06-09 16.207625
2013-06-10 15.697743
2013-06-11 15.697743
2013-06-12 15.697743
2013-06-13 15.697743
2013-06-14 15.697743
2013-06-15 16.070721
Freq: D, dtype: float64
и если вы установите это как столбец:
In [14]: df['ewma'] = pd.ewma(df["avg"], span=60, freq="D")
In [15]: df
Out[15]:
avg high low qty ewma
date
2013-05-27 16.92 19.00 1.22 71151 16.920000
2013-05-30 14.84 19.00 1.22 42939 15.862667
2013-06-02 9.19 17.20 1.23 5607 13.563899
2013-06-05 23.63 5000.00 1.22 5850 16.207625
2013-06-10 13.82 19.36 1.22 5644 15.697743
2013-06-15 17.76 24.00 2.02 16969 16.070721
Комментарии:
1. к вашему сведению, вы, вероятно, знаете это, но синтаксис ewma был обновлен, поэтому ответ устарел, хотя pandas все еще обрабатывает это вместе с полезным сообщением об устаревании, содержащим новый синтаксис. Просто подумал, что я бы предупредил вас, если вы захотите обновить, поскольку это вопрос довольно большого объема
Ответ №2:
pandas.ewma
с тех пор он устарелpandas 0.17.0
.- Та же функциональность может быть получена путем объединения
pandas.DataFrame.ewm()
иpandas.DataFrame.mean()
- В следующем примере будет вычислено несколько средних значений с экспоненциальными компонентами (
com
= центр масс) для цены закрытия акций Microsoft. - Также смотрите:
import pandas as pd
import matplotlib.pyplot as plt
# plotting style parameters - optional
plt.style.use('seaborn')
plt.rcParams['figure.figsize'] = (16.0, 10.0)
# read `test.csv` data at the bottom of answer
df = pd.read_csv('test.csv', index_col='Date', parse_dates=['Date'])
# display(df.head())
High Low Open Close Volume Adj Close
Date
2020-01-02 160.729996 158.330002 158.779999 160.619995 22622100.0 159.737595
2020-01-03 159.949997 158.059998 158.320007 158.619995 21116200.0 157.748581
2020-01-06 159.100006 156.509995 157.080002 159.029999 20813700.0 158.156342
2020-01-07 159.669998 157.320007 159.320007 157.580002 21634100.0 156.714310
2020-01-08 160.800003 157.949997 158.929993 160.089996 27746500.0 159.210495
# New DataFrame to keep it clean
ewma = pd.DataFrame(index=df.index)
# calculate ewma
ewma['com10'] = df['Close'].ewm(com=10).mean()
ewma['com50'] = df['Close'].ewm(com=50).mean()
ewma['com100'] = df['Close'].ewm(com=100).mean()
# display(ewma.head())
com10 com50 com100
Date
2020-01-02 160.619995 160.619995 160.619995
2020-01-03 159.572376 159.610094 159.615020
2020-01-06 159.374105 159.412887 159.418069
2020-01-07 158.859571 158.940967 158.951671
2020-01-08 159.154647 159.179963 159.183889
# plot
ewma.plot()
Записную книжку Jupyter можно найти здесь: pandas_exponential_average.ipynb
test.csv
Date,High,Low,Open,Close,Volume,Adj Close
2020-01-02,160.72999572753906,158.3300018310547,158.77999877929688,160.6199951171875,22622100.0,159.7375946044922
2020-01-03,159.9499969482422,158.05999755859375,158.32000732421875,158.6199951171875,21116200.0,157.7485809326172
2020-01-06,159.10000610351562,156.50999450683594,157.0800018310547,159.02999877929688,20813700.0,158.15634155273438
2020-01-07,159.6699981689453,157.32000732421875,159.32000732421875,157.5800018310547,21634100.0,156.7143096923828
2020-01-08,160.8000030517578,157.9499969482422,158.92999267578125,160.08999633789062,27746500.0,159.2104949951172
2020-01-09,162.22000122070312,161.02999877929688,161.83999633789062,162.08999633789062,21385000.0,161.1995086669922
2020-01-10,163.22000122070312,161.17999267578125,162.82000732421875,161.33999633789062,20725900.0,160.45364379882812
2020-01-13,163.30999755859375,161.25999450683594,161.75999450683594,163.27999877929688,21626500.0,162.3829803466797
2020-01-14,163.60000610351562,161.72000122070312,163.38999938964844,162.1300048828125,23477400.0,161.2393035888672
2020-01-15,163.94000244140625,162.57000732421875,162.6199951171875,163.17999267578125,21417900.0,162.28353881835938
2020-01-16,166.24000549316406,164.02999877929688,164.35000610351562,166.1699981689453,23865400.0,165.25711059570312
2020-01-17,167.47000122070312,165.42999267578125,167.4199981689453,167.10000610351562,34371700.0,166.1820068359375
2020-01-21,168.19000244140625,166.42999267578125,166.67999267578125,166.5,29517200.0,165.58529663085938
2020-01-22,167.49000549316406,165.67999267578125,167.39999389648438,165.6999969482422,24138800.0,164.78968811035156
2020-01-23,166.8000030517578,165.27000427246094,166.19000244140625,166.72000122070312,19680800.0,165.80409240722656
2020-01-24,167.52999877929688,164.4499969482422,167.50999450683594,165.0399932861328,24918100.0,164.13331604003906
2020-01-27,163.3800048828125,160.1999969482422,161.14999389648438,162.27999877929688,32078100.0,161.3884735107422
2020-01-28,165.75999450683594,163.07000732421875,163.77999877929688,165.4600067138672,24899900.0,164.551025390625
2020-01-29,168.75,165.69000244140625,167.83999633789062,168.0399932861328,34754500.0,167.1168212890625
2020-01-30,174.0500030517578,170.7899932861328,174.0500030517578,172.77999877929688,51597500.0,171.83079528808594
2020-01-31,172.39999389648438,169.5800018310547,172.2100067138672,170.22999572753906,36142700.0,169.2947998046875
2020-02-03,174.5,170.39999389648438,170.42999267578125,174.3800048828125,30149100.0,173.42201232910156
2020-02-04,180.63999938964844,176.30999755859375,177.13999938964844,180.1199951171875,36433300.0,179.13047790527344
2020-02-05,184.1999969482422,178.41000366210938,184.02999877929688,179.89999389648438,39186300.0,178.91168212890625
2020-02-06,183.82000732421875,180.05999755859375,180.97000122070312,183.6300048828125,27751400.0,182.62120056152344
2020-02-07,185.6300048828125,182.47999572753906,182.85000610351562,183.88999938964844,33515600.0,182.8797607421875
2020-02-10,188.83999633789062,183.25,183.5800018310547,188.6999969482422,35844300.0,187.663330078125
2020-02-11,190.6999969482422,183.5,190.64999389648438,184.44000244140625,53159900.0,183.42674255371094
2020-02-12,185.85000610351562,181.85000610351562,185.5800018310547,184.7100067138672,47062900.0,183.69525146484375
2020-02-13,186.22999572753906,182.8699951171875,183.0800018310547,183.7100067138672,35295800.0,182.7007598876953
2020-02-14,185.41000366210938,182.64999389648438,183.25,185.35000610351562,23149500.0,184.3317413330078
2020-02-18,187.6999969482422,185.5,185.61000061035156,187.22999572753906,27792200.0,186.201416015625
2020-02-19,188.17999267578125,186.47000122070312,188.05999755859375,187.27999877929688,29997500.0,186.75985717773438
2020-02-20,187.25,181.10000610351562,186.9499969482422,184.4199981689453,36862400.0,183.90780639648438
2020-02-21,183.5,177.25,183.1699981689453,178.58999633789062,48572600.0,178.093994140625
2020-02-24,174.5500030517578,163.22999572753906,167.77000427246094,170.88999938964844,68311100.0,170.41537475585938
2020-02-25,174.83999633789062,167.64999389648438,174.1999969482422,168.07000732421875,68073300.0,167.6032257080078
2020-02-26,173.25999450683594,168.2100067138672,169.7100067138672,170.1699981689453,56206100.0,169.69737243652344
2020-02-27,167.02999877929688,157.97999572753906,163.32000732421875,158.17999267578125,93033600.0,157.7406768798828
2020-02-28,163.7100067138672,152.0,152.41000366210938,162.00999450683594,97073600.0,161.56004333496094
2020-03-02,172.9199981689453,162.30999755859375,165.30999755859375,172.7899932861328,71030800.0,172.3101043701172
2020-03-03,175.0,162.25999450683594,173.8000030517578,164.50999450683594,71677000.0,164.0531005859375
2020-03-04,170.6999969482422,165.6199951171875,168.49000549316406,170.5500030517578,49814400.0,170.07632446289062
2020-03-05,170.8699951171875,165.69000244140625,166.0500030517578,166.27000427246094,47817300.0,165.80821228027344
2020-03-06,163.11000061035156,156.0,162.61000061035156,161.57000732421875,72821100.0,161.12127685546875
2020-03-09,157.75,150.0,151.0,150.6199951171875,70419300.0,150.20167541503906
2020-03-10,161.02999877929688,152.5800018310547,158.16000366210938,160.9199981689453,65354400.0,160.4730682373047
2020-03-11,157.6999969482422,151.14999389648438,157.1300048828125,153.6300048828125,56371600.0,153.2033233642578
2020-03-12,153.47000122070312,138.5800018310547,145.3000030517578,139.05999755859375,93226400.0,138.6737823486328
2020-03-13,161.91000366210938,140.72999572753906,147.5,158.8300018310547,92727400.0,158.3888702392578
2020-03-16,149.35000610351562,135.0,140.0,135.4199981689453,87905900.0,135.04388427734375
2020-03-17,147.5,135.0,140.0,146.57000732421875,81059800.0,146.16293334960938
2020-03-18,146.0,135.02000427246094,138.0,140.39999389648438,81593200.0,140.0100555419922
2020-03-19,150.14999389648438,139.0,142.77000427246094,142.7100067138672,85922700.0,142.31365966796875
2020-03-20,147.10000610351562,135.86000061035156,146.0,137.35000610351562,84866200.0,136.96853637695312
2020-03-23,140.57000732421875,132.52000427246094,137.00999450683594,135.97999572753906,78975200.0,135.6023406982422
2020-03-24,149.60000610351562,141.27000427246094,143.75,148.33999633789062,82516700.0,147.92800903320312
2020-03-25,154.3300018310547,144.44000244140625,148.91000366210938,146.9199981689453,75638200.0,146.51194763183594
2020-03-26,156.66000366210938,148.3699951171875,148.39999389648438,156.11000061035156,64568100.0,155.6764373779297
2020-03-27,154.88999938964844,149.1999969482422,151.75,149.6999969482422,57042300.0,149.2842254638672
2020-03-30,160.60000610351562,150.00999450683594,152.44000244140625,160.22999572753906,63420300.0,159.7849884033203
2020-03-31,164.77999877929688,156.55999755859375,159.39999389648438,157.7100067138672,77927200.0,157.27198791503906
2020-04-01,157.75,150.82000732421875,153.0,152.11000061035156,57969900.0,151.6875457763672
2020-04-02,155.47999572753906,150.36000061035156,151.86000061035156,155.25999450683594,49630700.0,154.8287811279297
2020-04-03,157.3800048828125,152.19000244140625,155.10000610351562,153.8300018310547,41243300.0,153.40277099609375
2020-04-06,166.5,157.5800018310547,160.32000732421875,165.27000427246094,67111700.0,164.8109893798828
2020-04-07,170.0,163.25999450683594,169.58999633789062,163.49000549316406,62769000.0,163.0359344482422
2020-04-08,166.6699981689453,163.5,165.6699981689453,165.1300048828125,48318200.0,164.67138671875
2020-04-09,167.3699951171875,163.3300018310547,166.36000061035156,165.13999938964844,51431800.0,164.6813507080078
2020-04-13,165.57000732421875,162.3000030517578,164.35000610351562,165.50999450683594,41905300.0,165.05032348632812
2020-04-14,173.75,168.0,169.0,173.6999969482422,52874300.0,173.2175750732422
2020-04-15,173.57000732421875,169.24000549316406,171.1999969482422,171.8800048828125,40940800.0,171.4026336669922
2020-04-16,177.27999877929688,172.89999389648438,174.3000030517578,177.0399932861328,50479600.0,176.5482940673828
2020-04-17,180.0,175.8699951171875,179.5,178.60000610351562,52765600.0,178.10397338867188
2020-04-20,178.75,174.99000549316406,176.6300048828125,175.05999755859375,36669600.0,174.57379150390625
2020-04-21,173.6699981689453,166.11000061035156,173.5,167.82000732421875,56203700.0,167.35391235351562
2020-04-22,174.0,170.82000732421875,171.38999938964844,173.52000427246094,34651600.0,173.0380859375
2020-04-23,175.05999755859375,170.91000366210938,174.11000061035156,171.4199981689453,32790800.0,170.94390869140625
2020-04-24,174.55999755859375,170.7100067138672,172.05999755859375,174.5500030517578,34305300.0,174.06521606445312
2020-04-27,176.89999389648438,173.3000030517578,176.58999633789062,174.0500030517578,33194400.0,173.5666046142578
2020-04-28,175.6699981689453,169.38999938964844,175.58999633789062,169.80999755859375,34392700.0,169.33837890625
2020-04-29,177.67999267578125,171.8800048828125,173.22000122070312,177.42999267578125,51286600.0,176.9372100830078
2020-04-30,180.39999389648438,176.22999572753906,180.0,179.2100067138672,53661300.0,178.7122802734375
2020-05-01,178.63999938964844,174.00999450683594,175.8000030517578,174.57000732421875,39370500.0,174.08517456054688
2020-05-04,179.0,173.8000030517578,174.49000549316406,178.83999633789062,30372900.0,178.34329223632812
2020-05-05,183.64999389648438,179.89999389648438,180.6199951171875,180.75999450683594,36839200.0,180.25796508789062
2020-05-06,184.1999969482422,181.6300048828125,182.0800018310547,182.5399932861328,32139300.0,182.03302001953125
2020-05-07,184.5500030517578,182.5800018310547,184.1699981689453,183.60000610351562,28316000.0,183.090087890625
2020-05-08,185.0,183.36000061035156,184.97999572753906,184.67999267578125,30912600.0,184.1670684814453
2020-05-11,187.50999450683594,182.85000610351562,183.14999389648438,186.74000549316406,30892700.0,186.2213592529297
2020-05-12,187.0399932861328,182.3000030517578,186.8000030517578,182.50999450683594,32038200.0,182.0030975341797
2020-05-13,184.0500030517578,176.5399932861328,182.5500030517578,179.75,44711500.0,179.2507781982422
2020-05-14,180.69000244140625,175.67999267578125,177.5399932861328,180.52999877929688,41873900.0,180.0286102294922
2020-05-15,187.05999755859375,177.0,179.05999755859375,183.16000366210938,46610400.0,182.65130615234375
2020-05-18,186.1999969482422,183.9600067138672,185.75,184.91000366210938,35306600.0,184.3964385986328
2020-05-19,186.60000610351562,183.49000549316406,185.02999877929688,183.6300048828125,26799100.0,183.1199951171875
2020-05-20,185.85000610351562,183.94000244140625,184.80999755859375,185.66000366210938,31261300.0,185.66000366210938
2020-05-21,186.6699981689453,183.2899932861328,185.39999389648438,183.42999267578125,29119500.0,183.42999267578125
2020-05-22,184.4600067138672,182.5399932861328,183.19000244140625,183.50999450683594,20826900.0,183.50999450683594
2020-05-26,186.5,181.10000610351562,186.33999633789062,181.57000732421875,36073600.0,181.57000732421875
2020-05-27,181.99000549316406,176.60000610351562,180.1999969482422,181.80999755859375,39517100.0,181.80999755859375
2020-05-28,184.14999389648438,180.3800048828125,180.74000549316406,181.39999389648438,33810200.0,181.39999389648438
2020-05-29,184.27000427246094,180.41000366210938,182.72999572753906,183.25,42146700.0,183.25
2020-06-01,183.0,181.4600067138672,182.5399932861328,182.8300018310547,22622400.0,182.8300018310547
2020-06-02,185.0,181.35000610351562,184.25,184.91000366210938,30794600.0,184.91000366210938
2020-06-03,185.94000244140625,183.5800018310547,184.82000732421875,185.36000061035156,27311000.0,185.36000061035156
2020-06-04,185.83999633789062,182.3000030517578,184.3000030517578,182.9199981689453,28761800.0,182.9199981689453
2020-06-05,187.72999572753906,182.00999450683594,182.6199951171875,187.1999969482422,39893600.0,187.1999969482422
2020-06-08,188.5500030517578,184.44000244140625,185.94000244140625,188.36000061035156,33211600.0,188.36000061035156
2020-06-09,190.6999969482422,187.25999450683594,188.0,189.8000030517578,29783900.0,189.8000030517578
2020-06-10,198.52000427246094,191.00999450683594,191.1300048828125,196.83999633789062,43872300.0,196.83999633789062
2020-06-11,195.75999450683594,186.07000732421875,193.1300048828125,186.27000427246094,52854700.0,186.27000427246094
2020-06-12,191.72000122070312,185.17999267578125,190.5399932861328,187.74000549316406,43345700.0,187.74000549316406
2020-06-15,190.82000732421875,184.00999450683594,184.5800018310547,188.94000244140625,32770200.0,188.94000244140625
2020-06-16,195.5800018310547,191.4600067138672,192.88999938964844,193.57000732421875,42556700.0,193.57000732421875
2020-06-17,196.32000732421875,193.69000244140625,195.02999877929688,194.24000549316406,25655900.0,194.24000549316406
2020-06-18,196.49000549316406,194.0,194.0,196.32000732421875,23061600.0,196.32000732421875
2020-06-19,199.2899932861328,194.3699951171875,198.58999633789062,195.14999389648438,44441100.0,195.14999389648438
2020-06-22,200.75999450683594,195.22999572753906,195.7899932861328,200.57000732421875,32818900.0,200.57000732421875
2020-06-23,203.9499969482422,201.42999267578125,202.08999633789062,201.91000366210938,30917400.0,201.91000366210938
2020-06-24,203.25,196.55999755859375,201.60000610351562,197.83999633789062,36740600.0,197.83999633789062
2020-06-25,200.61000061035156,195.47000122070312,197.8000030517578,200.33999633789062,27803900.0,200.33999633789062
2020-06-26,199.88999938964844,194.8800048828125,199.72999572753906,196.3300018310547,54675800.0,196.3300018310547
2020-06-29,198.52999877929688,193.5500030517578,195.77999877929688,198.44000244140625,26701600.0,198.44000244140625
2020-06-30,204.39999389648438,197.74000549316406,197.8800048828125,203.50999450683594,34310300.0,203.50999450683594
2020-07-01,206.35000610351562,201.77000427246094,203.13999938964844,204.6999969482422,32061200.0,204.6999969482422
2020-07-02,208.02000427246094,205.0,205.67999267578125,206.25999450683594,29315800.0,206.25999450683594
2020-07-06,211.1300048828125,208.08999633789062,208.8300018310547,210.6999969482422,31897600.0,210.6999969482422
2020-07-07,214.6699981689453,207.99000549316406,210.4499969482422,208.25,33600700.0,208.25
2020-07-08,213.25999450683594,208.69000244140625,210.07000732421875,212.8300018310547,33600000.0,212.8300018310547
2020-07-09,216.3800048828125,211.47000122070312,216.3300018310547,214.32000732421875,33121700.0,214.32000732421875
2020-07-10,214.0800018310547,211.0800018310547,213.6199951171875,213.6699981689453,26177600.0,213.6699981689453
2020-07-13,215.8000030517578,206.5,214.47999572753906,207.07000732421875,38135600.0,207.07000732421875
2020-07-14,208.85000610351562,202.02999877929688,206.1300048828125,208.35000610351562,37591800.0,208.35000610351562
2020-07-15,211.3300018310547,205.02999877929688,209.55999755859375,208.0399932861328,32179400.0,208.0399932861328
2020-07-16,205.6999969482422,202.30999755859375,205.39999389648438,203.9199981689453,29940700.0,203.9199981689453
2020-07-17,205.0399932861328,201.38999938964844,204.47000122070312,202.8800048828125,31635300.0,202.8800048828125
2020-07-20,212.3000030517578,203.00999450683594,205.0,211.60000610351562,36884800.0,211.60000610351562
2020-07-21,213.94000244140625,208.02999877929688,213.66000366210938,208.75,38105800.0,208.75