案例:获取年度大于股价中位数的天数占比
import numpy as np
import pandas as pd
# ----ASSIT: def assit_pdread_data(_ttcode,_p_input):--------------------------------------------------------
def assit_pdread_data(_ttcode,_p_input):
if _p_input == '1d':
_p = datetime.timedelta(days=1)
elif _p_input == '60m':
_p = datetime.timedelta(minutes=60)
elif _p_input == '30m':
_p = datetime.timedelta(minutes=30)
elif _p_input == '15m':
_p = datetime.timedelta(minutes=15)
elif _p_input == '5m':
_p = datetime.timedelta(minutes=5)
elif _p_input == '1m':
_p = datetime.timedelta(minutes=1)
try:
if _p_input == '1d':
data = pd.read_csv('D:\\Python\\002\\%s.csv'%_ttcode)
# rename '''Date_Time,Open,High,Low,Close,Volume'''
data.rename(columns={'date': 'Date_Time','open': 'Open','high':'High',
'low':'Low','close':'Close','volume':'Volume'
},inplace=True)
else:
# rename '''Seq,Date_Time,Open,High,Low,Close,Volume'''
data = pd.read_csv('D:\\Python\\002\\%s_%s.csv'%(_ttcode,_p_input))
data.rename(columns={'Unnamed: 0':'Seq','datetime':'Date_Time','day':'Date_Time',
'open': 'Open','high':'High','low':'Low','close':'Close','volume':'Volume',
},inplace=True)
_scale_avail = len(data)
_date_st_avail = data.loc[0,'Date_Time']
_data_ed_avail = data.loc[_scale_avail-1,'Date_Time']
print(data.head(3))
print(data.tail(3))
print('params_for_use:[data,_p,_scale_avail,_date_st_avail,_data_ed_avail] ')
return [data,_p,_scale_avail,_date_st_avail,_data_ed_avail]
except Exception as e:
return ['no data','no data','no data','no data','no data',]
print(e)
#return: params_for_use:[data,_p,_scale_avail,_date_st_avail,_data_ed_avail]
#----BODY---------------------------------------------------------------------------------------------
ttcode = 'sh510300'
data = assit_pdread_data(ttcode,'1d')[0]
data['Date_Time'] = pd.to_datetime(data['Date_Time'], format='%Y/%m/%d')
data.set_index(['Date_Time'], inplace=True)
# 切片 2020年全年
df=data['20200102':'20201231']
dfc = df.Close
# 中位数
me = np.median(dfc)
dfc_overme = dfc[dfc>me]
dff = pd.concat([dfc,dfc_overme],axis=1)
dff.columns = ['Close', 'Overme']
#----测试matplotlib
import matplotlib
matplotlib.use('Qt5Agg')
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
## Clear
#gcf().clf()
plt.clf()
## Setting
fig1 = plt.figure(num=1)
ax1 = fig1.add_subplot(111, ylabel='Close')
ax1.set_title('ax1 median test of %s'%(ttcode))
## Draw
#dfc.plot(ax=ax1, color='red', kind='bar', legend=True)
dff.Close .plot(ax=ax1, color='r', lw=1., legend=True)
dff.Overme.plot(ax=ax1, color='y', lw=3., legend=True)
## xticks,yticks
locs, labels = plt.xticks()
interval = (locs[-1]+1-locs[0]) // 10
ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
plt.xticks(np.arange(locs[0], locs[-1]+1, step=interval),rotation=45)
## horizonal,vertical
x = locs
_y = [me]*len(x)
line_x = ax1.plot(x, _y, color='skyblue')[0]
## Text
n_me = len(dff.Overme.value_counts(np.nan)) # 112days not nan
up_ratio = '{:.0%}'.format(n_me/len(dff))
text = up_ratio
plt.text(locs[0],me,text,fontdict={'size':16,'color':'r'})
plt.show()