天天看点

如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

我们先看下可视化的应用,视频:
Hans Rosling's 200 Countries, 200 Years, 4 Minutes - The Joy of Stats - BBC Four
https://www.youtube.com/watch?v=jbkSRLYSojo
           

1、生活中两个有用的图形

  • 技术成熟度曲线
  • 库布勒罗斯转变曲线
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

折线图

增加线条属性
'''
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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

增加了线条属性的折线图

用数组绘图
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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

数组绘图

添加文本
# 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
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
创建一个画板和多个画纸
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()

# 没有声明画板和画纸就是默认创建一个画板一个画纸
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

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()
'''
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
散点图来绘制成交量和股价之间的关系
成交量:买入数量+卖出数量
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:面积图
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

1e7就是1乘以10的7次方,整体来看,成交量和股价呈正线性相关关系

可以通过相关系数矩阵来看各变量之间的关系
print(babaDf.corr())
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

这份相关系数用的数据范围是start_date=&amp;amp;amp;amp;amp;#39;2017-01-01&amp;amp;amp;amp;amp;#39;end_date=&amp;amp;amp;amp;amp;#39;2018-01-01&amp;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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

因为谷歌和亚马逊的股价比较高,造成我们看不出其他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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
# 第二组: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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
用柱状图展示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()
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
分析结果:可以看出,仅从股票价格上来判断,亚马逊和谷歌的股票价格要远远的超过了其他四家。
但是这里只是算的平均值,平均值的缺点是对异常值不敏感。

下面我们看下用四分位数绘制的箱线图:
箱形图(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)
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

5、如何制作数据分析报告

1、提出问题
      Kaggle上找项目
2、理解数据
      采集数据-直接下载/爬虫爬取
3、数据清洗
      数据预处理/特征工程 特征提取
4、创建模型
5、模型评估
6、方案实施

每个步骤需要有一个小结论,最后再总结、制定下一步策略、以及对趋势的预测
           
Markdown格式
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

有序列表
* 1        中间有空格
* 2
* 3

无序列表
1. 1    中间有空格
2. 2
3. 3
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)
**加粗内容**
*斜体内容*

#### 插入链接
[百度](https://www.baidu.com)

#### 插入图片
![人物照](https://img-blog.csdnimg.cn/2020072215381142.jpeg)
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

效果

> 这里是引用

下面是分割线
***
hello
           
如何用matlaab把csv转为mat文件_用Python绘图(股票数据分析)

效果

  • 每个人心里都有一团火,路过的人只看到烟 - 至爱梵高 星空之谜

继续阅读