2020-08-09--Pandas-12--数据分析实战之股票分析

安装pandas的数据模板库

pip install pandas_datareader       # pandas中数据获取接口 (慢)
pip install baostock           # baostock数据获取接口
pip install tushare              # Tushare数据获取接口

利用tushare获取数据画图

1.导入库和配置项

import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

2.接口配置--获取源数据

获取两个公司的股票
参数:股票代码,起始时间,结束时间

'''获取数据'''
# 浙江传媒财新
caixin = ts.get_hist_data('600633', start='2017-07-01', end='2020-05-08')
print(type(caixin))         # <class 'pandas.core.frame.DataFrame'>
print(caixin)
# 本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
#              open   high  close  ...     v_ma10     v_ma20  turnover
# date                             ...                                
# 2020-05-08   9.89   9.98   9.76  ...  174862.54  157315.40      1.57
# 2020-05-07   9.80   9.95   9.80  ...  178983.13  155860.60      1.08
# 2020-05-06   9.45   9.88   9.78  ...  175347.03  157914.33      1.30
# 2020-04-30   9.28   9.64   9.57  ...  177440.81  163938.70      1.29
# 2020-04-29   9.26   9.37   9.20  ...  177899.23  180245.58      0.72
# ...           ...    ...    ...  ...        ...        ...       ...
# 2018-02-13  13.30  13.36  13.19  ...   76922.75   76922.75      0.48
# 2018-02-12  12.93  13.37  13.21  ...   80603.96   80603.96      0.49
# 2018-02-09  12.70  13.11  12.87  ...   86435.40   86435.40      0.64
# 2018-02-08  12.97  13.34  13.19  ...   88378.98   88378.98      0.64
# 2018-02-07  13.12  13.29  13.00  ...   94070.77   94070.77      0.73
# 
# [543 rows x 14 columns]

# 南方传媒
nanfang = ts.get_hist_data('601900',start='2017-07-01', end='2020-05-08')
print(nanfang)
# 本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2
#              open   high  close    low  ...     v_ma5    v_ma10    v_ma20  turnover
# date                                    ...                                        
# 2020-05-08   9.56   9.68   9.66   9.53  ...  30763.41  36500.26  35120.70      0.29
# 2020-05-07   9.52   9.67   9.53   9.50  ...  33324.80  37446.65  36674.61      0.26
# 2020-05-06   9.52   9.60   9.58   9.31  ...  33322.07  37897.68  38018.07      0.57
# 2020-04-30   9.58   9.70   9.61   9.53  ...  29903.02  36151.07  38027.82      0.30
# 2020-04-29   9.50   9.68   9.55   9.46  ...  32541.47  37241.41  38554.26      0.31
# ...           ...    ...    ...    ...  ...       ...       ...       ...       ...
# 2018-02-13  10.03  10.14  10.05   9.98  ...  19288.10  19288.10  19288.10      1.04
# 2018-02-12   9.72  10.08  10.01   9.72  ...  19534.70  19534.70  19534.70      1.06
# 2018-02-09   9.91   9.95   9.70   9.65  ...  19820.23  19820.23  19820.23      1.39
# 2018-02-08  10.09  10.21  10.13  10.02  ...  17561.04  17561.04  17561.04      0.85
# 2018-02-07  10.03  10.09  10.05   9.85  ...  20174.98  20174.98  20174.98      1.15
# 
# [543 rows x 14 columns]

返回的类型为DataFrame类型的数据。

3.组织数据结构

因为一个图中要显示多个公司的股票收盘价的折线,所以要组织数据结构为DataFrame类型。

'''组织数据结构--DataFrame'''
data = {'浙江传媒财新': caixin.close, '南方传媒':nanfang.close}
print(type(data))         # <class 'dict'>
print(data)
# {'浙江传媒财新': date
# 2020-05-08     9.76
# 2020-05-07     9.80
# 2020-05-06     9.78
# 2020-04-30     9.57
# 2020-04-29     9.20
#               ...
# 2018-02-13    13.19
# 2018-02-12    13.21
# 2018-02-09    12.87
# 2018-02-08    13.19
# 2018-02-07    13.00
# Name: close, Length: 543, dtype: float64, '南方传媒': date
# 2020-05-08     9.66
# 2020-05-07     9.53
# 2020-05-06     9.58
# 2020-04-30     9.61
# 2020-04-29     9.55
#               ...
# 2018-02-13    10.05
# 2018-02-12    10.01
# 2018-02-09     9.70
# 2018-02-08    10.13
# 2018-02-07    10.05
# Name: close, Length: 543, dtype: float64}

# 转为DataFrame对象,date(时间列)作为索引,
# 每列的列名就是data字典中键,每列的数据是字典对应的值
df = pd.DataFrame(data)
print(df)
#             浙江传媒财新   南方传媒
# date
# 2020-05-08    9.76   9.66
# 2020-05-07    9.80   9.53
# 2020-05-06    9.78   9.58
# 2020-04-30    9.57   9.61
# 2020-04-29    9.20   9.55
# ...            ...    ...
# 2018-02-13   13.19  10.05
# 2018-02-12   13.21  10.01
# 2018-02-09   12.87   9.70
# 2018-02-08   13.19  10.13
# 2018-02-07   13.00  10.05

4.索引排序

要显示到图形中,为了方便观察,所以x轴的时间要正向排序。


'''对索引进行排序,原地操作'''
df.sort_values(by='date',ascending=True,inplace=True)
print(df)
#             浙江传媒财新   南方传媒
# date
# 2018-02-07   13.00  10.05
# 2018-02-08   13.19  10.13
# 2018-02-09   12.87   9.70
# 2018-02-12   13.21  10.01
# 2018-02-13   13.19  10.05
# ...            ...    ...
# 2020-04-29    9.20   9.55
# 2020-04-30    9.57   9.61
# 2020-05-06    9.78   9.58
# 2020-05-07    9.80   9.53
# 2020-05-08    9.76   9.66
#
# [543 rows x 2 columns]

5.画图

# DataFrame对象自动绘制(优化)
df.plot(kind='line')
plt.xticks(rotation = '45')       # x轴的数据倾斜
plt.show()

结果:

volume列数据显示

# 绘制柱状图(volume列)  x轴为时间,y轴为volume列数据
plt.bar(caixin.index,caixin.volume)
# plt.gcf().set_size_inches(15,8)
plt.show()

这个x轴的数据没有像之前的进行优化,目前没有解决方案。

close列和volume列显示在一张图上

设置子图的方法--plt.subplot2grid(shape,start,row,col)

  • shape:将整个图分割的规格
  • start:起始位置,左上角为(0,0),向下为x轴正方向,向右为y轴正方向。
  • row:从起始位置开始画,该图所占的行(根据shape划分的行大小)
  • col:从起始位置开始画,该图所占的列(根据shape划分的列大小)
# draw the price history on the top
# 获取子图的位置
top = plt.subplot2grid((4,4), (0, 0), rowspan=3, colspan=4)
# 填充数据画图
top.plot(caixin.index, caixin.close,
         label='MSFT Close')
# 设置标题和图形标记的位置
plt.title('MSFT Close Price 2012 - 2014')
plt.legend(loc='best')

# and the volume along the bottom
bottom = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4)
bottom.bar(caixin.index, caixin.close)
plt.title('Microsoft Trading Volume 2012 - 2014')

plt.subplots_adjust(hspace=0.75)
plt.gcf().set_size_inches(15,8)

plt.show()

计算单日变化百分比

'''单日比率'''
# 计算每天/昨天的值,算出比率
x = caixin.close/caixin.close.shift(1)
# print(x)
x.plot()
plt.show()

直方图

绘制南方传媒的各个数据列的直方图--DataFrame

nanfang.hist(bins=50)
plt.show()

绘制close列的直方图

nanfang.close.hist(bins=50)
plt.show()

执行移动平均计算

'''平均值'''
se = nanfang.close
# 算出平均值
ava = se.rolling(window=30).mean()
# 封装维DataFrame
df = pd.DataFrame({
    '收盘价':se,
    '月统计':ava,
})
df.plot()
plt.show()

各属性每日收盘价变化率相关性分析

# 相关性统计
# 协方差,corr()  默认使用皮尔森
re = nanfang.corr()
print(re)
#               open      high     close  ...    v_ma10  \
# open      1.000000  0.985553  0.975340  ...  0.516442
# high      0.985553  1.000000  0.991277  ...  0.545002
# close     0.975340  0.991277  1.000000  ...  0.509707
# low       0.989004  0.981960  0.986465  ...  0.482628
# volume    0.505106  0.570144  0.523075  ...  0.748281
# ...            ...       ...       ...  ...       ...
# ma20      0.865912  0.850304  0.855717  ...  0.455114
# v_ma5     0.544599  0.589638  0.545738  ...  0.933110
# v_ma10    0.516442  0.545002  0.509707  ...  1.000000
# v_ma20    0.464613  0.478883  0.454400  ...  0.889177
# turnover  0.525195  0.587116  0.546245  ...  0.483505
#
#             v_ma20  turnover
# open      0.464613  0.525195
# high      0.478883  0.587116
# close     0.454400  0.546245
# low       0.437511  0.484344
# volume    0.595617  0.754537
# ...            ...       ...
# ma20      0.531830  0.374942
# v_ma5     0.763993  0.575646
# v_ma10    0.889177  0.483505
# v_ma20    1.000000  0.330785
# turnover  0.330785  1.000000
#
# [14 rows x 14 columns]
plt.imshow(re, cmap='hot', interpolation='none')
plt.colorbar()
plt.xticks(range(len(re)), re.columns)
plt.yticks(range(len(re)), re.columns)

plt.show()

pandas补充知识

pivot函数作用是将一个DataFrame重塑称另外一个表格。其中index为新表的索引,columns为新表的列,values是支持计算产生新值得列。 即将dataframe按照index-columns进行数据整理。 具体应用


如上,将dataframe按照foo-bar为轴,baz为值的方式进行重组。其中,foo-bar不能有重复值,若重复,则会运行失败。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354