我们先看下可视化的应用,视频:
Hans Rosling's 200 Countries, 200 Years, 4 Minutes - The Joy of Stats - BBC Four
https://www.youtube.com/watch?v=jbkSRLYSojo
1、生活中两个有用的图形
- 技术成熟度曲线
- 库布勒罗斯转变曲线
2、数据可视化基础
图例legend
网格grid
x坐标轴x label
y坐标轴y label
画板figure
画纸axes、subplot
坐标轴axis
主要刻度major tick
次要刻度minor tick
散点图 scatter plot - 数值类型
折线图 line plot - 时间序列
柱状图 bar plot - 分类数据
热图 heatmap - 渐进颜色表示
3、绘图包matplotlib如何使用
折线图
导入matplotlib的pyplot模块:
import matplotlib.pyplot as plt
# 1、定义x和y坐标轴的点
x=[1,2,3,4]
y=[1,4,9,16]
# 2、使用plot绘制线条
plt.plot(x,y)
# 3、显示图形
plt.show()
折线图
增加线条属性
'''
color:线条颜色
marker:点的形状,o表示点 - 圆圈标记circle marker
linestyle:线条形状,dashed表示用虚线连接各个点
'''
plt.plot(x,y,color='g',marker='o',linestyle='dashed')
# 定义坐标轴范围:
plt.axis([0,6,0,20]) # x轴最小值、x轴最大值、y轴最小值、y轴最大值
plt.show()
增加了线条属性的折线图
用数组绘图
import numpy as np
t=np.arange(0,5,0.2) # 生成一个一维的等差数组
print(t)
# [0. 0.2 0.4 0.6 0.8 1. 1.2 1.4 1.6 1.8 2. 2.2 2.4 2.6 2.8 3. 3.2 3.4
# 3.6 3.8 4. 4.2 4.4 4.6 4.8]
# 接下来定义三个折线图的坐标值
# 折线1
x1=y1=t
# 折线2
x2=x1
y2=t**2
# 折线3
x3=x1
y3=t**3
plt.plot(x1,y1,
x2,y2,
x3,y3,color='g')
plt.axis([0,20,0,20])
plt.show()
数组绘图
添加文本
# Mac pycharm解决绘图中中文乱码问题:
from matplotlib.font_manager import FontManager
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
# print(mat_fonts) # 先查看系统中可用字体
import matplotlib.pyplot as plt
# 然后设置字体
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# 1、定义x和y坐标轴的点
x=[1,2,3,4]
y=[1,4,9,16]
# 2、使用plot绘制线条
plt.plot(x,y)
# 3、添加文本
plt.xlabel('x坐标轴')
plt.ylabel('y坐标轴')
plt.title('标题')
plt.annotate('我是注释',
xy=(2,5), # 箭头指向的坐标值
xytext=(2,7), # 注释文本的坐标值
arrowprops=dict(facecolor='black',shrink=0.01))
# shrink是箭头和注释文本的距离
# 4、显示图形
plt.show()
如何永久性解决中文字体乱码问题:
1、找到matplotlib的字体配置文件
import matplotlib
print(matplotlib.matplotlib_fname())
# 得到matplotlib使用字体所在文件夹:
# /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
2、下载中文字体SimHei.ttf,将字体复制到配置文件所在文件夹下的fonts/ttf/下,然后双击安装
3、修改配置文件matplotlibrc,修改三处配置:
# font.family前面注释去掉
font.family : sans-serif
# font.sans-serif前面注释去掉,并且在前面加上SimHei中文字体
font.sans-serif : SimHei,DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
# axes.unicode_minus前面注释去掉,并修改成False
axes.unicode_minus : False ## use Unicode for the minus symbol
(建议在修改之前我们做个备份matplotlibrc.bak)
4、删除缓存目录
这是在mac上的操作,删除/Users/你的用户名/.matplotlib文件夹
501 cd /Users/dingding/
503 rm -rf .matplotlib/
5、重启pycharm
创建一个画板和多个画纸
import matplotlib.pyplot as plt
# 1、创建画板1
fig=plt.figure('画板1')
# 2、创建画纸,画纸就是子图
ax1=plt.subplot(2,1,1)
# 等价于ax1=fig.add_subplot(211)
# 前两个参数表示生成2行1列的子图矩阵,第3个参数表示选中的子图的位置,这里选中了第1个子图
# 创建两个画纸(两个绘画区域),上下排成1列
# 3、在当前选择的画纸1(第1个子图)上绘图
# 绘图只传入一个参数[1,2,3]的话,默认就是y轴的值,x轴默认为range(n),也就是0,1,2……
plt.plot([1,2,3])
# 4、选择画纸2(选择了第2个子图)
ax2=plt.subplot(2,1,2)
# 5、在画纸2上绘图
plt.plot([4,5,6])
# 6、显示图形
plt.show()
# 没有声明画板和画纸就是默认创建一个画板一个画纸
1个画板,多个画纸
4、如何使用pandas绘图
1、导入包
# 导入数据分析包
import pandas as pd
# 导入互联网数据获取包
# 需要先安装pip3 install pandas-datareader,注意连接符是横杠,导入时连接符是下划线
from pandas_datareader import data
2、6家公司 - GAFATA
获取国内股票数据的方式是:股票代码+对应股市(港股为.hk,A股为.ss)
例如腾讯港股是0700.hk
# 用字典存放6家公司股票
gafataData={
'谷歌':'GOOG',
'亚马逊':'AMZN',
'Facebook':'FB',
'苹果':'AAPL',
'阿里巴巴':'BABA',
'腾讯':'0700.hk'}
3、 获取股票数据
start_date='2018-01-01'
end_date='2018-06-29'
# get_data_yahoo表示从雅虎财经获取股票数据
# 官方使用操作文档:http://pandas-datareader.readthedocs.io/en/latest/remote_data.html
可能存在的问题:
1)由于是从国外获取股票数据,会由于网络不稳定,获取数据失败,多运行几次这个cell就好了
2)如果多运行几次还是无法获的股票数据,参考链接:https://pypi.org/project/fix-yahoo-finance/0.0.21/
3)如果经过上面2个方法还不行,参考文档:http://pandas-datareader.readthedocs.io/en/latest/remote_data.html,
换其他的财经数据源试试
# 获取阿里巴巴某段时间范围内的股票数据:
babaDf=data.get_data_yahoo(gafataData['阿里巴巴'],start_date,end_date)
googDf=data.get_data_yahoo(gafataData['谷歌'],start_date,end_date)
amznDf=data.get_data_yahoo(gafataData['亚马逊'],start_date,end_date)
applDf=data.get_data_yahoo(gafataData['苹果'],start_date,end_date)
fbDf=data.get_data_yahoo(gafataData['Facebook'],start_date,end_date)
txDf=data.get_data_yahoo(gafataData['腾讯'],start_date,end_date)
# 由于腾讯是港股,我们需要将港币兑换成美元,所以我们手动增加一个字段:
exchange=0.1278 # 港币兑换美元汇率
txDf['Close-dollar']=txDf['Close']*exchange
# 或者从Morningstar数据源也可以获取到阿里巴巴数据
# babaDf=data.DataReader(gafataDict['阿里巴巴'],'morningstar',start_date, end_date)
4、 查看数据
# 查看这个二维表格的数据
# print('# 交易时间 最高价 最低价 开盘价 收盘价 成交量')
print(babaDf.head())
# 交易时间 最高价 最低价 开盘价 收盘价 成交量
# High Low Open Close Volume Adj Close
# Date
# 2017-01-03 89.000000 88.080002 89.000000 88.599998 8789400 88.599998
# 2017-01-04 90.889999 88.580002 88.985001 90.510002 11490200 90.510002
# 2017-01-05 94.809998 91.639999 91.910004 94.370003 16821500 94.370003
# 2017-01-06 94.500000 93.000000 94.400002 93.889999 7639800 93.889999
# 2017-01-09 95.650002 93.309998 94.160004 94.720001 10829500 94.720001
print(babaDf.info())
# <class 'pandas.core.frame.DataFrame'>
# DatetimeIndex: 251 entries, 2017-01-03 to 2017-12-29 # 行索引
# Data columns (total 6 columns): # 列信息
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 High 251 non-null float64
# 1 Low 251 non-null float64
# 2 Open 251 non-null float64
# 3 Close 251 non-null float64
# 4 Volume 251 non-null int64
# 5 Adj Close 251 non-null float64
# dtypes: float64(5), int64(1)
# memory usage: 13.7 KB
# None
print(babaDf.describe())
# High Low Open Close Volume Adj Close
# count 251.000000 251.000000 251.000000 251.000000 2.510000e+02 251.000000
# mean 143.203490 140.260857 141.909542 141.791793 1.550962e+07 141.791793
# std 32.339500 31.505186 32.090767 31.875025 9.389481e+06 31.875025
# min 89.000000 88.080002 88.985001 88.599998 4.120700e+06 88.599998
# 25% 109.124500 107.489998 108.430000 108.169998 9.129950e+06 108.169998
# 50% 144.380005 141.479996 143.000000 143.009995 1.341080e+07 143.009995
# 75% 175.139999 171.584999 173.595001 173.250000 1.864455e+07 173.250000
# max 191.750000 189.369995 191.539993 191.190002 8.138150e+07 191.190002
5、定义函数 - 查看涨跌幅
# 定义函数
# 函数功能:计算股票涨跌幅=(现在股价-买入价格)/买入价格
# 输入参数:column是收盘价这一列的数据,也就是Close列数据
# 返回数据:涨跌幅
def change(column):
# 买入价格
buy_price=column[0] # 也就是第一天的收盘价格
cur_price=column[column.size-1] # 也就是最后一天的收盘价格
price_change=(cur_price-buy_price)/buy_price # 计算涨跌幅
if price_change>0:
print('累计上涨{}%'.format(round(price_change*100,2)))
# return ('累计上涨{}%'.format(round(price_change*100,2)))
elif price_change<0:
print('累计下跌{}%'.format(round(price_change*100,2)))
else:
print('股价没有变化')
return price_change
change(babaDf['Close'])
change(googDf['Close'])
change(fbDf['Close'])
change(amznDf['Close'])
change(applDf['Close'])
change(txDf['Close'])
# 累计上涨1.02%
# 累计上涨4.76%
# 累计上涨7.11%
# 累计上涨42.96%
# 累计上涨7.46%
# 累计下跌-5.74%
6、数据可视化
import matplotlib.pyplot as plt
# 折线图绘制阿里巴巴股票的走势
plt.plot(babaDf['Close'])
plt.title('阿里巴巴2018年上半年股票走势')
plt.xlabel('时间')
plt.ylabel('股价(美元)')
plt.grid(True)
'''
注意:
上面绘图后,如果横坐标没有显示出来,原因:
1)先查看你的数据框索引是不是日期类型的,如果不是,将数据框索引转换成日期类型的
2)如果获取数据来源,前面换成了数据源(morningstar),后面绘图的时候需要重置索引,代码如下:
babaDf.reset_index(inplace=True)
babaDf.set_index('Date',inplace=True)
#查看索引是否重置成功
babaDf.head()
'''
散点图来绘制成交量和股价之间的关系
成交量:买入数量+卖出数量
babaDf.plot(x='Volume',y='Close',kind='scatter')
plt.xlabel('成交量(美元)')
plt.ylabel('股价')
plt.title('成交量和股价之间的关系')
plt.grid(True)
plt.show()
kind取值:
无:折线图
scatter:散点图
bar:柱状图
box:箱线图
hist:直方图,histogram
pie:饼状图
area:面积图
1e7就是1乘以10的7次方,整体来看,成交量和股价呈正线性相关关系
可以通过相关系数矩阵来看各变量之间的关系
print(babaDf.corr())
这份相关系数用的数据范围是start_date=&amp;amp;amp;amp;#39;2017-01-01&amp;amp;amp;amp;#39;end_date=&amp;amp;amp;amp;#39;2018-01-01&amp;amp;amp;amp;#39;,可以看出close和volume的相关系数是0.415,说明两者有较强的正线性相关。
GAFATA,比较这6家公司的股价趋势
ax1=babaDf.plot(y='Close',label='alibaba') # 把阿里巴巴的图绘制到画纸ax1上面,
amznDf.plot(ax=ax1,y='Close',label='amazon') # 亚马逊的图也绘制到画纸ax1上面,就表示都在同一张画纸上绘制
applDf.plot(ax=ax1,y='Close',label='apple')
txDf.plot(ax=ax1,y='Close-dollar',label='tengxun')
googDf.plot(ax=ax1,y='Close',label='google')
fbDf.plot(ax=ax1,y='Close',label='facebook')
plt.title('比较这6家公司的股价趋势')
plt.xlabel('时间')
plt.ylabel('股价')
plt.grid(True)
plt.show()
因为谷歌和亚马逊的股价比较高,造成我们看不出其他4家公司的股票走势。所以根据股价我们可以将这6家公司分成2组,一组是股价较高的谷歌和亚马逊。另外一组是股价较低的4家公司。
因为谷歌和亚马逊的股价比较高,造成我们看不出其他4家公司的股票走势。
所以根据股价我们可以将这6家公司分成2组,一组是股价较高的谷歌和亚马逊。另外一组是股价较低的4家公司。
# 第一组:谷歌、亚马逊
ax1=googDf.plot(y='Close',label='google')
amznDf.plot(ax=ax1,y='Close',label='amazon')
plt.title('比较谷歌、亚马逊的股价趋势')
plt.xlabel('时间')
plt.ylabel('股价')
plt.grid(True)
plt.show()
# 第二组:4家公司
ax1=babaDf.plot(y='Close',label='alibaba')
applDf.plot(ax=ax1,y='Close',label='apple')
txDf.plot(ax=ax1,y='Close-dollar',label='tengxun')
fbDf.plot(ax=ax1,y='Close',label='facebook')
plt.title('比较这4家公司的股价趋势')
plt.xlabel('时间')
plt.ylabel('股价')
plt.grid(True)
plt.show()
用柱状图展示6家公司股价的平均值
# 先获取6家公司的股价均值
GAFATAmeanList=[googDf['Close'].mean(),
txDf['Close-dollar'].mean(),
babaDf['Close'].mean(),
fbDf['Close'].mean(),
amznDf['Close'].mean(),
applDf['Close'].mean()]
# 因为我们画图都是用的数组来画图,所以我们创建一个一维数组Series
gafataMeanSer=pd.Series(GAFATAmeanList,
index=['谷歌',
'腾讯',
'阿里巴巴',
'Facebook',
'亚马逊',
'苹果'])
gafataMeanSer.plot(kind='bar',label='GAFATA')
plt.legend(loc=2)
plt.title('gafata股价均值')
plt.xlabel('公司名称')
plt.xlabel('股价均值')
plt.grid(True)
plt.show()
分析结果:可以看出,仅从股票价格上来判断,亚马逊和谷歌的股票价格要远远的超过了其他四家。
但是这里只是算的平均值,平均值的缺点是对异常值不敏感。
下面我们看下用四分位数绘制的箱线图:
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。
因形状如箱子而得名。 在各种领域也经常被使用,常见于品质管理。 它主要用于反映原始数据分布的特征,
还可以进行多组数据分布特征的比较。
# 创建一个数据框存放公司的收盘价
closeDf=pd.DataFrame()
# 合并公司的收盘价
closeDf=pd.concat([closeDf,
googDf['Close'],
txDf['Close-dollar'],
babaDf['Close'],
fbDf['Close'],
amznDf['Close'],
applDf['Close']],axis=1)
# 重命名列名为公司名称
closeDf.columns=['谷歌','腾讯','阿里巴巴','Facebook','亚马逊','苹果']
pd.set_option('display.max_columns', None)
print(closeDf.head())
谷歌 腾讯 阿里巴巴 Facebook
2018-01-02 00:00:00 1065.000000 53.394838 183.649994 181.419998
2018-01-03 00:00:00 1082.479980 53.957162 184.000000 184.669998
2018-01-04 00:00:00 1086.400024 55.184038 185.710007 184.330002
2018-01-05 00:00:00 1102.229980 55.362962 190.699997 186.850006
2018-01-08 00:00:00 1106.939941 56.053081 190.330002 188.279999
亚马逊 苹果
2018-01-02 00:00:00 1189.010010 172.259995
2018-01-03 00:00:00 1204.199951 172.229996
2018-01-04 00:00:00 1209.589966 173.029999
2018-01-05 00:00:00 1229.140015 175.000000
2018-01-08 00:00:00 1246.869995 174.350006
closeDf.plot(kind='box')
plt.grid(True)
plt.show()
它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。
也可以往盒图里面加入平均值(mean)
5、如何制作数据分析报告
1、提出问题
Kaggle上找项目
2、理解数据
采集数据-直接下载/爬虫爬取
3、数据清洗
数据预处理/特征工程 特征提取
4、创建模型
5、模型评估
6、方案实施
每个步骤需要有一个小结论,最后再总结、制定下一步策略、以及对趋势的预测
Markdown格式
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
有序列表
* 1 中间有空格
* 2
* 3
无序列表
1. 1 中间有空格
2. 2
3. 3
**加粗内容**
*斜体内容*
#### 插入链接
[百度](https://www.baidu.com)
#### 插入图片
![人物照](https://img-blog.csdnimg.cn/2020072215381142.jpeg)
效果
> 这里是引用
下面是分割线
***
hello
效果
- 每个人心里都有一团火,路过的人只看到烟 - 至爱梵高 星空之谜