1、统计IBM股票涨、跌和持平的天数并打印输出;(涨:收盘价>开盘价、跌:收盘价<开盘价、持平:收盘价=开盘价);
#-*- coding utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('D:/IBM.csv',header=0,index_col=0,parse_dates=True) #read IBM.csv
df = pd.DataFrame(data) #define DataFrame
df3=df
DA_drop = df[df[' Open']>df[' Close']]
DA_rise = df[df[' Open']<df[' Close']]
DA_hold = df[df[' Open']==df[' Close']]
print("涨的天数",len(DA_rise.index)) #number of the days rising
print("跌的天数",len(DA_drop.index)) #number of the days dropping
print("持平天数",len(DA_hold.index)) #number of the days holding
涨的天数 243
跌的天数 233
持平天数 5
2、根据星期几来切分收盘价数据,然后分别计算周一至周五的平均价格,并找出周几的平均收盘价最高?周几的最低?对结果进行打印输出;
#print(df.columns) #set "pd.read_csv"
weekday = []
for i in range(len(data.index)):
weekday.append(df.index[i].weekday())
df['weekday']=weekday #append a list on the right of the DataFrame
#按weekday分组
gro_weekday=df.groupby('weekday')
def Mean_GroupbyWeekday(data,i):
return data.get_group(i)[' Close'].mean()
output=[]
for j in range(5):
output.append(Mean_GroupbyWeekday(gro_weekday,j))
print("星期",j+1,"的平均收盘价为",Mean_GroupbyWeekday(gro_weekday,j))
print("最高平均收盘价为星期",output.index(max(output)))
print("最低平均收盘价为星期",output.index(min(output)))
星期 1 的平均收盘价为 154.1264042696629
星期 2 的平均收盘价为 153.97848494949505
星期 3 的平均收盘价为 153.9971711313132
星期 4 的平均收盘价为 154.26010354639175
星期 5 的平均收盘价为 154.08031008247426
最高平均收盘价为星期 3
最低平均收盘价为星期 1
3、统计2017年每个月的股票开盘天数并打印输出;
#按年分组
gro_year=df[df3.index.year==2017]
#print(gro_year)
month = []
for i in range(len(gro_year.index)):
month.append(gro_year.index[i].month)
gro_year['month']=month #append a list on the right of the DataFrame
gro_month=gro_year.groupby('month')
def Days_GroupbyMonth(data,i):
return len(data.get_group(i).index)
for k in range(11):
print("2017年",k+1,"月,开盘天数",Days_GroupbyMonth(gro_month,k+1))
2017年 1 月,开盘天数 20
2017年 2 月,开盘天数 19
2017年 3 月,开盘天数 23
2017年 4 月,开盘天数 19
2017年 5 月,开盘天数 22
2017年 6 月,开盘天数 22
2017年 7 月,开盘天数 20
2017年 8 月,开盘天数 23
2017年 9 月,开盘天数 20
2017年 10 月,开盘天数 22
2017年 11 月,开盘天数 19
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel\__main__.py:7: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
4、统计2017年每个月的总成交量,并以柱状图的形式绘制出来,要求设置横坐标和纵坐标轴标签、图的题目,横坐标轴刻度标签为月份,并标注出最高和最低总成交量。
def Volume_GroupbyMonth(data,i):
temp=data.get_group(i)
return temp[' Volume'].sum()
vol_month=[]
for k in range(11):
vol_month.append(Volume_GroupbyMonth(gro_month,k+1))
plt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
X = [1,2,3,4,5,6,7,8,9,10,11]
Y = vol_month
#fig = plt.figure()
plt.bar(X,Y,0.5,color="green")
plt.xlabel("月份")
plt.ylabel("月成交量")
plt.title("2017年各月成交量")
plt.annotate("最高值",xy=(vol_month.index(max(vol_month))+1,max(vol_month)))
plt.annotate("最低值",xy=(vol_month.index(min(vol_month))+1,min(vol_month)))
plt.show()
plt.savefig("2017年各月成交量.jpg")