📅  最后修改于: 2022-03-11 14:45:35.140000             🧑  作者: Mango
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Simulate data
np.random.seed(1234)
df = pd.DataFrame(
{'px_last': 100 + np.random.randn(1000).cumsum()},
index=pd.date_range('2010-01-01', periods=1000, freq='B'),
)
df['50dma'] = df['px_last'].rolling(window=50, center=False).mean()
df['200dma'] = df['px_last'].rolling(window=200, center=False).mean()
## Apply labels
df['label'] = 'out of bounds'
df.loc[abs(df['50dma'] - df['200dma']) >= 7, 'label'] = '|50dma - 200dma| >= 7'
df.loc[abs(df['50dma'] - df['200dma']) < 7, 'label'] = '|50dma - 200dma| < 7'
df.loc[abs(df['50dma'] - df['200dma']) < 5, 'label'] = '|50dma - 200dma| < 5'
df.loc[abs(df['50dma'] - df['200dma']) < 3, 'label'] = '|50dma - 200dma| < 3'
df = df[df['label'] != 'out of bounds']
## Convert labels to colors
label2color = {
'|50dma - 200dma| < 3': 'green',
'|50dma - 200dma| < 5': 'yellow',
'|50dma - 200dma| < 7': 'orange',
'|50dma - 200dma| >= 7': 'red',
}
df['color'] = df['label'].apply(lambda label: label2color[label])
# Create plot
fig, ax = plt.subplots()
def gen_repeating(s):
"""Generator: groups repeated elements in an iterable
E.g.
'abbccc' -> [('a', 0, 0), ('b', 1, 2), ('c', 3, 5)]
"""
i = 0
while i < len(s):
j = i
while j < len(s) and s[j] == s[i]:
j += 1
yield (s[i], i, j-1)
i = j
## Add px_last lines
for color, start, end in gen_repeating(df['color']):
if start > 0: # make sure lines connect
start -= 1
idx = df.index[start:end+1]
df.loc[idx, 'px_last'].plot(ax=ax, color=color, label='')
## Add 50dma and 200dma lines
df['50dma'].plot(ax=ax, color='k', ls='--', label='MA$_{50}$')
df['200dma'].plot(ax=ax, color='b', ls='--', label='MA$_{200}$')
## Get artists and labels for legend and chose which ones to display
handles, labels = ax.get_legend_handles_labels()
## Create custom artists
g_line = plt.Line2D((0,1),(0,0), color='green')
y_line = plt.Line2D((0,1),(0,0), color='yellow')
o_line = plt.Line2D((0,1),(0,0), color='orange')
r_line = plt.Line2D((0,1),(0,0), color='red')
## Create legend from custom artist/label lists
ax.legend(
handles + [g_line, y_line, o_line, r_line],
labels + [
'|MA$_{50} - $MA$_{200}| < 3$',
'|MA$_{50} - $MA$_{200}| < 5$',
'|MA$_{50} - $MA$_{200}| < 7$',
'|MA$_{50} - $MA$_{200}| \geq 7$',
],
loc='best',
)
# Display plot
plt.show()