数据来源:和鲸社区-Numpy+Pandas数据处理·第四关
主要内容:
import pandas as pd
data = pd.read_excel('/home/mw/input/pandas1206855/600000.SH.xls')
data.head()
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 329 entries, 0 to 328
Data columns (total 18 columns):
代码 328 non-null object
简称 327 non-null object
日期 327 non-null datetime64[ns]
前收盘价(元) 327 non-null float64
开盘价(元) 327 non-null float64
最高价(元) 327 non-null float64
最低价(元) 327 non-null float64
收盘价(元) 327 non-null float64
成交量(股) 327 non-null object
成交金额(元) 327 non-null object
涨跌(元) 327 non-null float64
涨跌幅(%) 327 non-null float64
均价(元) 327 non-null object
换手率(%) 327 non-null object
A股流通市值(元) 327 non-null float64
总市值(元) 327 non-null float64
A股流通股本(股) 327 non-null float64
市盈率 327 non-null float64
dtypes: datetime64[ns](1), float64(11), object(6)
memory usage: 46.3+ KB
# 查看每列数据缺失情况
data.isnull().sum()
# 提取日期列含有空值的行
data[data['日期'].isnull()]
#输出每列缺失值具体行数
for columnname in data.columns:
if data[columnname].count() != len(data):
loc = data[columnname][data[columnname].isnull().values == True].index.tolist()
print('列名:"{}",第{}行位置有缺失值'.format(columnname,loc))
# 删除所有存在缺失值的行
data.dropna(axis=0,how='any',inplace=True)
语法:
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数:
axis : {0 or 'index', 1 or 'columns'}, default 0
0, or 'index':删除包含丢失值的行
1, or 'columns':删除包含丢失值的列
默认为0
how : {'any', 'all'}, default 'any'
'any': 如果存在NA值,则删除该行或列
'all': 如果所有值都是NA,则删除该行或列
thresh: int,保留含有int个非空值的行
subset: 对特定的列进行缺失值删除处理
不同情况参数设置:
删除所有有缺失值的行
df.dropna()
删除所有有缺失值的列
df.dropna(axis='columns')
df.dropna(axis=1)
删除所有值缺失的行
df.dropna(how='all')
删除至少有两个非缺失值的行
df.dropna(thresh=2)
指定判断缺失值的列范围
df.dropna(subset=['name', 'born'])
使删除和的结果生效
df.dropna(inplace=True)
指定列的缺失值删除
df.toy.dropna()
1.绘制收盘价的折线图
#方法一:
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid') #设置画图风格
plt.rc('font', size=6) #设置图中字体和大小
plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
data['收盘价(元)'].plot()
#方法二:
from matplotlib import pyplot as plt
import matplotlib
#设置画图字体格式
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)
#设置图片大小和分辨率
plt.figure(figsize=(16, 6), dpi=80)
#绘制折线图
x = data['日期']
y = data['收盘价(元)']
plt.plot(x, y, label='收盘价(元)', color='orange', linestyle='-')
#设置x,y轴标签
plt.xlabel("日期")
plt.ylabel("收盘价(元)")
plt.title("每日收盘价趋势图")
#绘制网格
plt.grid(alpha=0.4, linestyle='--')#alpha表示透明度
#添加图例(设置图例时,必须在绘制时,加上label字段,见上plt.plot()函数)
'''upper right;upper left;
lower left;lower right;
best; right; center
center left; center right
lower center; upper center
'''
plt.legend(loc="upper right")
#展示图
plt.show()
2.同时绘制开盘价和收盘价
#方法一:
#设置画图字体格式
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)
#设置图片大小和分辨率
plt.figure(figsize=(16, 6), dpi=80)
#绘制折线图
x = data['日期']
y1 = data['收盘价(元)']
y2 = data['开盘价(元)']
plt.plot(x, y1, label='收盘价(元)', color='orange', linestyle='-')
plt.plot(x, y2, label='开盘价(元)', color='blue', linestyle='-')
#设置x,y轴标签
plt.xlabel("日期")
plt.ylabel("价钱(元)")
plt.title("每日开盘收盘趋势图")
#绘制网格
plt.grid(alpha=0.4, linestyle='--')#alpha表示透明度
#添加图例(设置图例时,必须在绘制时,加上label字段,见上plt.plot()函数)
'''upper right;upper left;
lower left;lower right;
best; right; center
center left; center right
lower center; upper center
'''
plt.legend(loc="upper right")
#展示图
plt.show()
#方法二:
plt.rcParams['font.sans-serif']=['Simhei'] #显示中文
plt.rcParams['axes.unicode_minus']=False #设置显示中文后,负号显示受影响,显示负号
plt.rc('figure', figsize=(16, 6), dpi=150) #设置图的大小
data[['收盘价(元)', '开盘价(元)']].plot()
3.收盘价5日均线,20日均线图
#方法一:
mean_5 = data['收盘价(元)'].rolling(5).mean()
mean_20 = data['收盘价(元)'].rolling(20).mean()
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)
plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
plt.plot(data['收盘价(元)'], label='原始数据')
plt.plot(mean_5, label='5日均线')
plt.plot(mean_20, label='20日均线')
plt.legend(loc='upper right')
plt.show()
#方法二:
#data['收盘价(元)'].plot()
#data['收盘价(元)'].rolling(5).mean().plot()
#data['收盘价(元)'].rolling(20).mean().plot()
4.绘制上轨线,下轨线,中轨线折线图
MB = data['收盘价(元)'].rolling(20).mean()
UP = MB+MD*2
DN = MB-MD*2
font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)
plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
plt.plot(MB, label='中轨线')
plt.plot(UP, label='上轨线')
plt.plot(DN, label='下轨线')
plt.xlabel('index')
plt.ylabel('开盘价(元)')
plt.legend(loc='upper right')
plt.grid(alpha=0.4)
plt.show()
# 打印所有换手率不是数字的行
for i in range(len(data)):
if type(data['换手率(%)'][i]) != float: #data['换手率(%)'][i]或写成data.iloc[i, 13]
temp = temp.append(data.loc[i])
temp.head()
# 如果是判断某一列(字符串类型)是否包含指定字符串:
# 方法一:
# df[df["columns"].str.contains("--")]
# 方法二:
# isin()函数:清洗数据,删选过滤掉DataFrame中一些行
data[data['换手率(%)'].isin(['--'])]
1.删除所有换手率为非数字的行
# 删除所有换手率为非数字的行
k = []
for i in range(len(data)):
if type(data['换手率(%)'][i]) != float: #data['换手率(%)'][i]或写成data.iloc[i, 13]
k.append(i)
data.drop(labels=k, inplace=True)
data
2.绘制换手率的密度曲线
# 绘制换手率的密度曲线
# 密度图(density plots),也叫核密度图( kernel density estimate,KDE)是理解数值变量分布的另一个方法。相比直方图,它的主要优势是不依赖于柱的尺寸,更加清晰。
#方法一:
data['换手率(%)'].plot.kde()
#方法二:
data['换手率(%)'].plot(kind='kde')
#同时显示密度图与直方图
import seaborn as sns, numpy as np
sns.set(); np.random.seed(0)
ax = sns.distplot(data['换手率(%)'])
Pandas进阶之窗口函数rolling()和expanding():
https://www.jianshu.com/p/b8c795345e93
rolling()函数,是固定窗口大小,进行滑动计算,expanding()函数只设置最小的观测值数量,不固定窗口大小,实现累计计算,即不断扩展;
DataFrame.expanding(min_periods = 1,center = False,axis = 0)
# 设置日期为索引
data = data.set_index('日期')
#以5个数据作为一个数据滑动窗口,在这5个数据上取均值(收盘价)
data['收盘价(元)'].rolling(5).mean()
# 以5个数据作为一个数据滑动窗口,计算这五个数据总和(收盘价)
data['收盘价(元)'].rolling(5).sum()
Python3 如何使用Pandas库将日数据转换为周数据、月数据或季度数据https://blog.csdn.net/weixin_44904908/article/details/107065633
pandas的resample重采样 (方法各参数详解)https://www.cnblogs.com/jingsupo/p/pandas-resample.html
# 按周为采样规则,取一周收盘价最大值
data['收盘价(元)'].resample('W').max()
# 绘制重采样数据与原始数据
plt.figure(figsize=(16, 6), dpi=80)
data['收盘价(元)'].plot()
data['收盘价(元)'].resample('7D').max().plot()
#计算前一天与后一天的收盘价的差值
#方法一:
# data['收盘价(元)'].diff()
#方法二:shift(1)表示上移一位
diff = data['收盘价(元)'] - data['收盘价(元)'].shift(1)
diff
# 计算前一天与后一天收盘价变化率
#方法一:
# data['收盘价(元)'].pct_change()
#方法二:
data['收盘价(元)']/data['收盘价(元)'].shift(1) - 1
data.shift(5) # 前移
data.shift(-5) # 后移