python基础案例 - Pandas统计分析基础

python基础案例 - Pandas统计分析基础,第1张

例13-1 下面是数据库:stock1(沪深A股交易数据库,收集了我国从1990.12以来,部分A股的日交易数据)中,股票日交易数据表部分列名:

/*--------------股票日交易数据记录------------------*/
CREATE TABLE trDay 	(
cStockNo	char(8)	not null,		                                      /*股票代码*/
cDay		datetime	not null,		                           /*交易日期*/
mOpen		real		not null default 0,	         /*开盘价*/
mHigh		real		not null default 0,	         /*最高价*/
mLow		real		not null default 0,	         /*最低价*/
mClose		real		not null default 0,	         /*收盘价*/
iVol		real		not null default 0,	         /*成交量*/
mm		real		not null default 0,	         /*成交额*/
dcChange                   decimal(8,4) not null default 0,	                           /*换手率*/
dcRate 		decimal(6,2) not null default 0,	                            /*涨幅*/
constraint trDay_pk primary key(cStockNo,cDay),                /*定义主键:cStockNo, cDay */
);

查询股票代码为sh600006(东风汽车)的交易日期、收盘价,显示3条记录

from urllib import parse            # 因为密码中含有特殊字符所以需要先进行一步转码
from sqlalchemy import create_engine       # 主要用于建立数据库连接引擎
import pandas as pd                                      # 这个库,可以对数据库进行读写 *** 作
userName = 'root'
password = parse.quote_plus('P@ssw0rd')      # 密码转码
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'stock1'    # 使用的数据库名
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
# connStr = "mysql+pymysql://root:P@ssw0rd@127.0.0.1:3306/stock1?charset=utf8"
engine = create_engine(DB_CONNECT)                   # 数据连接引擎
sql = "select cDay,mClose from trDay where cStockNo ='sh600001' limit 6,3"
trDay = pd.read_sql(sql, con = engine)          # 返回为DataFrame对象
print(trDay.values)                             # trDay.values 为二维数组
print("返回记录行数:",trDay.shape[0])

使用sqlalchemy进行数据库连接时如果password中含有特殊字符例如@,可以先使用urllib将密码转码之后进行拼接。

结果:

 数据库查询结果:

 

例13-1-2:查询股票代码为sh600001的交易数据,查看DataFrame的属性

from urllib import parse
from sqlalchemy import create_engine       # 主要用于建立数据库连接引擎
import pandas as pd                                      # 这个库,可以对数据库进行读写 *** 作
userName = 'root'
password = parse.quote_plus('P@ssw0rd')
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'stock1'
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
# connStr = "mysql+pymysql://root:P@ssw0rd@127.0.0.1:3306/stock1?charset=utf8"
engine = create_engine(DB_CONNECT)                   # 数据连接引擎

sql = "select cDay,mClose from trDay where cStockNo ='sh600001' limit 6,3"
trDay = pd.read_sql(sql,con = engine)                       # 返回 DataFrame 对象
i = 0
for row in trDay.values:     # dataFrame.values 为二维数组
    i = i+1
    print(i,row[0],row[1])
print(trDay['mClose'])                  # 单列所有行的访问
print(trDay['mClose'][0:2])          # 单列多行的访问

运行结果:

 例13-2 通过对象DataFrame,获取多列多行数据,如东风汽车日交易数据

from urllib import parse
from sqlalchemy import create_engine       # 主要用于建立数据库连接引擎
import pandas as pd                                      # 这个库,可以对数据库进行读写 *** 作
from openpyxl import xml
userName = 'root'
password = parse.quote_plus('P@ssw0rd')
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'stock1'
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
# connStr = "mysql+pymysql://root:P@ssw0rd@127.0.0.1:3306/stock1?charset=utf8"
engine = create_engine(DB_CONNECT)                   # 数据连接引擎

sql="select cDay,mOpen,mHigh,mLow,mClose from trDay where cStockNo='SH600006'"
trDay = pd.read_sql(sql,con = engine)                                           # 东风汽车(SH600006) 日交易数据
trDay.to_excel('trDay.xlsx')                                                         # 将查询结果直接保存为excel文件
print(trDay[['cDay','mOpen','mHigh','mLow','mClose']][:3])    # 前3行

运行结果:

最新的panda包已不再继续支持.xls文件的写入,不过可以写.xlsx

例13-3 利用DataFrame,直接绘制股票价格趋势图、移动平均。

烽火电子(sz000561):2013.01.01-2013.08.31收盘价格趋势图

 

from urllib import parse
import matplotlib.pyplot as plt
from sqlalchemy import create_engine       # 主要用于建立数据库连接引擎
import pandas as pd                                      # 这个库,可以对数据库进行读写 *** 作
from openpyxl import xml
userName = 'root'
password = parse.quote_plus('P@ssw0rd')
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'stock1'
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
# connStr = "mysql+pymysql://root:P@ssw0rd@127.0.0.1:3306/stock1?charset=utf8"
engine = create_engine(DB_CONNECT)                   # 数据连接引擎

sql="select cDay,mClose from trDay where cStockNo ='sz000561' and cDay>'20130101' and cDay<'20130830' order by cDay"
trDay = pd.read_sql(sql,con = engine)                                           # 烽火电子日收盘价格
plt.figure(figsize=(8,4), dpi=80)
trDay['mClose'].plot(title="sz000561", color='g')
trDay['mClose'].rolling(10).mean().plot(color='r')                      # 10天移动平均
rows = trDay.shape[0]
d = trDay['cDay'][0:rows:10]                                                         # 步长为10
plt.xticks(range(0,rows,10), d, rotation=45, fontsize=12)            # 旋转45度
plt.legend(['mClose','MA(10)'])
plt.show()

运行结果: 

 

例13-4 利用对象DataFrame,直接绘制股票成交量条形图

 烽火电子(sz000561):2013.01.02-2013.02.22成交量条形图

from urllib import parse
import matplotlib.pyplot as plt
from sqlalchemy import create_engine       # 主要用于建立数据库连接引擎
import pandas as pd                                      # 这个库,可以对数据库进行读写 *** 作
from openpyxl import xml
userName = 'root'
password = parse.quote_plus('P@ssw0rd')
dbHost = '127.0.0.1'
dbPort = 3306
dbName = 'stock1'
DB_CONNECT = f'mysql+pymysql://{userName}:{password}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
# connStr = "mysql+pymysql://root:P@ssw0rd@127.0.0.1:3306/stock1?charset=utf8"
engine = create_engine(DB_CONNECT)                   # 数据连接引擎

sql="select cDay,mOpen,mClose,iVol from trDay where cStockNo ='sz000561' and cDay between '20130102' and '20130222' order by cDay"
trDay = pd.read_sql(sql, con = engine)                                       # 烽火电子日收盘价格
plt.figure(figsize=(8, 4), dpi=80)
c = []                                                                                              # 颜色列表
for index, row in trDay.iterrows():
    if (row['mClose'] >= row['mOpen']):
        c.append('red')                                                                     # 收盘价不低于开盘价,则红色
    else:
        c.append('blue')                                                                 # 绿色
plt.bar(trDay['cDay'], trDay['iVol'], width=0.5, color=c)
rows = trDay.shape[0]; d = trDay['cDay'][0:rows:5]
plt.xticks(range(0,rows,5),d,rotation=45,fontsize=12)             # 旋转45度
plt.legend(['sz000561:valume'])
plt.show()


 运行结果:

例13-6 使用read_csv读取“深指日交易数据.csv”

 

import pandas as pd
data = pd.read_csv('C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第13章数据\深指日交易数据.csv', encoding = 'gbk')
print(type(data))                                        #  
print('使用read_csv读取的交易数据表的长度为:',len(data))  # 输出:9
print(data.columns)                                   # 返回所有的列名对象,相当于字典的键名
                                                                  # 默认把第0行,作为列名
i = 0
for row in data.values:                             # 显示所有行记录
    i = i+1
    print(i,row[0],row[1],row[2],row[3],row[4],row[5])

运行结果:

 使用to_csv存储《深指日交易数据.csv》

import pandas as pd
import os
order = pd.read_csv(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第13章数据\深指日交易数据.csv', encoding = 'gbk')
print('写入文本文件前目录内文件列表为:\n', os.listdir('tmp'))
# 将order以csv格式存储
order.to_csv('tmp/orderInfo.csv',sep = ';',index = False)
print('写入文本文件后目录内文件列表为:\n', os.listdir('tmp'))

运行结果:

例13-8 使用read_excel读取文件“人均国民收入.xls”

import pandas as pd
F = r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第13章数据\人均国民收入.xls'
data = pd.read_excel(F,'收入与消费')
# data = pd.read_excel(F,0)                    # 也可sheet 索引
print('记录条数:',len(data))
 # 返回所有的列名对象,相当于字典的键名 ,
#  默认把第0行,作为列名
print(data.columns)
print(data.values)  # 返回所有的行

运行结果:

 

例13-10 文件:各国GDP(2001-2011).xls  给出了10个国家11年的GDP数据,用Pandas读取数据,按每年的GDP排序,绘制动态的横向条形图。

 基本思路:Pandas读取Excel文件,返回的数据帧(DataFrame),属于二维的表格型数据结构,对年份的列进行迭代,每秒取一个列的GDP数据,排降序,绘制条形图。如果国名为“中国”,则红色显示。

import matplotlib.pyplot as plt ; import pandas as pd
wb = pd.read_excel(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第13章数据\各国GDP(2001-2011).xls')
d = wb.iloc[0:11,0:4]                                               #[行号,列号],d为'pandas.core.frame.DataFrame'
print(d)
print(d.columns)
s = d.sort_values(by='国家', ascending=True)     # 对列名“国家”按升序
print(s)
s = d.sort_values(by='2001', ascending=False)    # 对列名“2001”按降序
print(type(s))

通过条形图迭代,绘制2000-2011年,GDP最大的10个国家变化情况。

 可以绘制gif动态图
import matplotlib.pyplot as plt ; import pandas as pd
import imageio
plt.rcParams['font.sans-serif'] = 'SimHei'                              # 设置中文显示
wb = pd.read_excel(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第13章数据\各国GDP(2001-2011).xls')
d = wb.iloc[0:11,0:12]                                                                # 行 0:11,列:0:12
plt.figure(figsize=(6,4),dpi=120)
plt.ion()                                                                                      # 打开交互模式
image_list = []
for i in range(1, 12):  # 年份:2001年->2011年
    w = str(d.columns[i])  # w 为年份
    s = d.sort_values(by=w, ascending=True)  # 按年份数据排升序
    x = s.iloc[:, i]  # 第 i 列年份 ,前11个国家数据
    y = s.iloc[:, 0]  # 国家名称
    c = list(map(lambda x: 'red' if x == '中国' else 'blue', y))
    plt.clf()  # 清除画布
    plt.title('各国历年GDP动态条形图(单位:亿美元)', fontsize=12)
    plt.barh(y, x, height=0.6, color=c)  # 横放条形图函数 barh
    for a, b in zip(x, y):
        plt.text(a + 0.6, b, '%.0f' % a, fontsize=12)

    plt.legend([w + '年'], fontsize=12)
    plt.pause(1)  # 隔1秒,停止一下
    plt.savefig('temp.png')
    image_list.append(imageio.imread('temp.png'))
plt.ioff()  # 关闭交互模式
imageio.mimsave('bar_test.gif', image_list, duration=1)

 生成的gif:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/886466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存