2017-07-19 108 views
1

我已经使用pandas.DataFrame.rolling来计算移动平均线。所以,我的数据帧是这个样子,绘制烛台图顶部的移动平均线

CurrencyPair   TimeStamp Open High  Low Close  MA50 
40  EURUSD 2017-07-10 16:00:00 1.1397 1.1401 1.1396 1.1397  NaN 
41  EURUSD 2017-07-10 15:00:00 1.1389 1.1396 1.1386 1.1396  NaN 
42  EURUSD 2017-07-10 14:00:00 1.1393 1.1396 1.1389 1.1390  NaN 
43  EURUSD 2017-07-10 13:00:00 1.1393 1.1394 1.1387 1.1391  NaN 
44  EURUSD 2017-07-10 12:00:00 1.1390 1.1395 1.1386 1.1392  NaN 
45  EURUSD 2017-07-10 11:00:00 1.1392 1.1393 1.1384 1.1390  NaN 
46  EURUSD 2017-07-10 10:00:00 1.1387 1.1395 1.1385 1.1395  NaN 
47  EURUSD 2017-07-10 09:00:00 1.1397 1.1398 1.1387 1.1389  NaN 
48  EURUSD 2017-07-10 08:00:00 1.1417 1.1418 1.1399 1.1403  NaN 
49  EURUSD 2017-07-10 07:00:00 1.1400 1.1416 1.1400 1.1416 1.142272 
50  EURUSD 2017-07-10 06:00:00 1.1410 1.1411 1.1399 1.1399 1.142154 
51  EURUSD 2017-07-10 05:00:00 1.1405 1.1409 1.1404 1.1409 1.142068 
52  EURUSD 2017-07-10 04:00:00 1.1406 1.1407 1.1402 1.1404 1.141952 
53  EURUSD 2017-07-10 03:00:00 1.1406 1.1407 1.1403 1.1406 1.141804 

我设法从TimeStampOHLC绘制使用数据我的阴阳烛图,但我不知道如何使用我的阴阳烛图的顶部同一轴线上绘出我的移动平均线。我试过使用eurusd['MA50'].plot(ax = ax),但是我得到了一个ValueError: ordinal must be >= 1的错误。

这里是我的代码,

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import datetime as dt 
from mpl_finance import candlestick_ohlc 

eurusd = pd.read_csv('fxhistoricaldata_EURUSD_hour.csv') 
eurusd['TimeStamp'] = pd.to_datetime(eurusd['TimeStamp'], format = '%d/%m/%Y %H:%M') 

# Set date & time range 
# start_date (Y-m-d H-M) & end_date (Y-m-d H-M) 
mask = (eurusd['TimeStamp'] >= '2017-07-10 3:00') & (eurusd['TimeStamp'] <= '2017-07-12 8:00') 
eurusd = eurusd.loc[mask] 

# Calculate Moving Averages MA50 
eurusd = eurusd.reindex(columns = np.append(eurusd.columns, ['MA50'])) 
eurusd['MA50'] = eurusd[['Close']].rolling(50).mean() 

print(eurusd) 

eurusd['TimeStamp'] = eurusd['TimeStamp'].map(lambda d: mdates.datestr2num(dt.datetime.strftime(d, '%Y-%m-%d %H:%M'))) 

fig, ax = plt.subplots() 
ax.xaxis_date() 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d %H:%M')) 
ax.grid(True, color = 'k', alpha = 0.5) 
plt.xticks(rotation = 45) 
plt.xlabel("Date") 
plt.ylabel("Price") 
plt.title("EUR/USD") 

candlestick_ohlc(ax, eurusd[['TimeStamp','Open','High','Low','Close']].values, width = 0.01, colorup = 'g') 
eurusd['MA50'].plot(ax = ax) 

plt.show() 

以下是完整的错误日志,

ticks = self.get_major_ticks() 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\axis.py", line 1320, in get_major_ticks 
    numticks = len(self.get_major_locator()()) 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\dates.py", line 986, in __call__ 
    self.refresh() 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\dates.py", line 1006, in refresh 
    dmin, dmax = self.viewlim_to_dt() 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\dates.py", line 763, in viewlim_to_dt 
    return num2date(vmin, self.tz), num2date(vmax, self.tz) 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\dates.py", line 401, in num2date 
    return _from_ordinalf(x, tz) 
    File "C:\Users\Meng Da\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\matplotlib\dates.py", line 254, in _from_ordinalf 
    dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC) 
ValueError: ordinal must be >= 1 

任何帮助是极大的赞赏。谢谢!

回答

0

我设法用ax.plot(eurusd['TimeStamp'], eurusd['MA50']),而不是解决问题。以防万一任何人遇到类似的问题。

0

好像你有一个问题与斧头。你究竟想通过subplot2grid达到什么目的?如果你删除它,那么它的工作就会失败。请注意,我使用了candlestick2_ohlc。你还需要添加日期,我相信你已经知道了。 enter image description here

from pandas_datareader import data 
import matplotlib.pyplot as plt 
from matplotlib.finance import candlestick2_ohlc 

aapl = data.DataReader('AAPL', 'google', '2017-06-01') 
aapl['MA50'] = aapl["High"].rolling(10).mean() 
aapl.reset_index(inplace=True) 

fig, ax = plt.subplots() 
plt.xticks(rotation = 45) 
plt.xlabel("Date") 
plt.ylabel("Price") 
plt.title("EUR/USD") 

candlestick2_ohlc(ax, aapl.Open, aapl.High, aapl.Low, aapl.Close, width=1, colorup='g') 
aapl.MA50.plot(ax=ax) 

plt.show() 
+0

你好omdv,它仍然没有工作,我仍然得到错误,'ValueError:序号必须> = 1'。是否需要reset_index()?我使用'eurusd ['MA50']。plot(ax = ax)'来绘制MA。如果您有其他建议,请告诉我。 – Dan

+0

上面的代码粘贴没有更改会给你一个错误?你是对的 - 'reset_index()'不是必须的,在那里有另一个版本。 – omdv

+0

如果你正在谈论我的密码,那么是的。它给我错误,我粘贴在上面的错误日志。 (仍然是'ValueError:ordinal必须> = 1')如果你正在谈论你的代码,那么它正在为我工​​作。 – Dan