数据分析03

19.热成像图
用图形的方式显示矩阵
1 2 3
4 5 6
7 8 9
mp.imshow(矩阵,cmap=颜色映射,origin=纵轴方向)
origin-> hight:缺省,原点在左上角
origin-> low:原点在左下角
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)
mp.figure('Hot', facecolor='lightgray')
mp.title('Hot', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 绘制热成像图
mp.imshow(z, cmap='jet', origin='low')
mp.colorbar().set_label('z', fontsize=14)
mp.show()

20.极坐标系
mp.gca(projection='polar')
水平坐标-> 极角
垂直坐标-> 极径
mp.plot(水平坐标,垂直坐标,...)
mp.plot(极角,极径,...)
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
t = np.linspace(0, 2 * np.pi, 1001)
r_spiral = 0.8 * t  # 阿基米德螺旋线
r_rose = 5 * np.sin(6 * t)  # 六元玫瑰线
mp.figure('Polar', facecolor='lightgray')
mp.gca(projection='polar')  # 设置极坐标系
mp.title('Polar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14)
mp.ylabel(r'$\rho$', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 函数值   = f (自变量)
# 垂直坐标 = f (水平坐标)
# 极径     = f (极角)
mp.plot(t, r_spiral, c='dodgerblue',
        label=r'$\rho=0.8\theta$')
mp.plot(t, r_rose, c='orangered',
        label=r'$\rho=5sin(6\theta)$')
mp.legend()
mp.show()

21.三维曲面
from mpl_toolkits.mplot3d import axes3d
mp.gca(projection='3d') #class axes3d
ax.set_xlabel(...)
...
ax.plot_sunface(x,y,z,rstride=行跨距,cstride=列跨距,cmap=颜色映射)
ax.plot_wireframe(x,y,z,rstride=行跨距,cstride=列跨距,linewidth=线宽,color=颜色)
代码

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000
# 网格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)
mp.figure('3D Surface')
# 创建三维坐标系
ax = mp.gca(projection='3d')  # 返回axes3d类的对象
mp.title('3D Surface', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制三维表面图
ax.plot_surface(x, y, z, rstride=10, cstride=10,
                cmap='jet')
mp.figure('3D Wireframe')
# 创建三维坐标系
ax = mp.gca(projection='3d')  # 返回axes3d类的对象
mp.title('3D Wireframe', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制三维线框图
ax.plot_wireframe(x, y, z, rstride=30, cstride=30,
                  linewidth=0.5, color='dodgerblue')
mp.show()

22.简单动画
import matplotlib.animation as ma
def 更新回调函数(序列号):
    更新画面显示
    ...
ma.FuncAnimation(图像窗口, 更新回调函数,
    interval=时间间隔(毫秒))
每经过一个"时间间隔","更新回调函数"会被matplotlib调用一次。

     位置     大小   生长             颜色
float float | float | float | float float float float
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.animation as ma
n_bubbles = 100  # 100个气泡
# 气泡数组
bubbles = np.zeros(n_bubbles, dtype=[
    ('position', float, 2),  # 位置(水平和垂直坐标)
    ('size', float, 1),      # 大小
    ('growth', float, 1),    # 生长速度
    ('color', float, 4)])    # 颜色(红、绿、蓝和透明度)
bubbles['position'] = np.random.uniform(
    0, 1, (n_bubbles, 2))
bubbles['size'] = np.random.uniform(
    50, 750, n_bubbles)
bubbles['growth'] = np.random.uniform(
    30, 150, n_bubbles)
bubbles['color'] = np.random.uniform(
    0, 1, (n_bubbles, 4))
mp.figure('Bubbles', facecolor='lightgray')
mp.title('Bubbles', fontsize=20)
mp.xticks(())
mp.yticks(())
sc = mp.scatter(
    bubbles['position'][:, 0],
    bubbles['position'][:, 1], s=bubbles['size'],
    c=bubbles['color'])


# 更新回调函数
def update(number):
    # 更新气泡的大小
    bubbles['size'] += bubbles['growth']
    # 确定哪个气泡破裂
    burst = number % n_bubbles
    # 更新破裂气泡的位置
    bubbles['position'][burst] = np.random.uniform(
        0, 1, 2)
    # 更新破裂气泡的大小
    bubbles['size'][burst] = 0
    # 更新破裂气泡的生长速度
    bubbles['growth'][burst] = np.random.uniform(
        30, 150)
    # 更新破裂气泡的颜色
    bubbles['color'][burst] = np.random.uniform(
        0, 1, 4)
    # 设置气泡的位置
    sc.set_offsets(bubbles['position'])
    # 设置气泡的大小
    sc.set_sizes(bubbles['size'])
    # 设置气泡的颜色
    sc.set_facecolors(bubbles['color'])


# 启动动画
anim = ma.FuncAnimation(
    mp.gcf(), update, interval=10)
mp.show()


ma.FuncAnimation(图像窗口, 更新回调函数, 生成器函数,
    interval=时间间隔(毫秒))
每经过一个"时间间隔",matplotlib先调用"生成器函数",用"生成器函数"产生(yeild)的值作为参数调用"更新回调函数"。
matplotlib:
    ...
    while True:
        延时interval毫秒
        生成值 = 生成器函数()
        更新回调函数(生成值)
    ...
代码

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.animation as ma
mp.figure('Signal', facecolor='lightgray')
mp.title('Signal', fontsize=20)
mp.xlabel('Time', fontsize=14)
mp.ylabel('Signal', fontsize=14)
ax = mp.gca()
ax.set_ylim(-3, 3)
ax.set_xlim(0, 10)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 创建曲线对象
pl = mp.plot([], [], c='orangered')[0]
# 在曲线对象内部创建缓冲区,以容纳曲线上点的横纵坐标
pl.set_data([], [])


# 更新回调函数
def update(data):
    t, v = data
    # 获取曲线上当前所有的点
    x, y = pl.get_data()
    # 追加新采集到的点
    x.append(t)
    y.append(v)
    # 获取当前水平坐标范围
    x_min, x_max = ax.get_xlim()
    # 如果新点的水平坐标超过水平坐标范围
    if t >= x_max:
        # 重新设置水平坐标范围
        ax.set_xlim(t - (x_max - x_min), t)
        # 重新绘制坐标轴
        ax.figure.canvas.draw()
    # 设置曲线上的点
    pl.set_data(x, y)


# 生成器函数
def generator():
    t = 0
    while True:
        v = np.sin(2 * np.pi * t) * np.exp(
            np.sin(0.2 * np.pi * t))
        yield t, v
        t += 0.05


# 启动动画
anim = ma.FuncAnimation(
    mp.gcf(), update, generator, interval=5)
mp.show()


  

六.numpy的常用函数

1.读取文件
逻辑上可被解释为二维数组的文本文件:
数据项1<分隔符>数据项2<分隔符>...<分隔符>数据项n
...
numpy.loadtxt(
  文件路径
  delimiter=分隔符(缺省一个空格),
  usecols=列序列(缺省所有列),
  unpack=是否展开列(缺省False),
  dtype= 元素类型(缺省float),
  converters=转换器字典(缺省不做转换))
  ->一个二维数组(unpack=False)或多个一维数组(unpack=True)
  代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime as dt
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.dates as md


def dmy2ymd(dmy):
    dmy = str(dmy, encoding='utf-8')
    date = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    ymd = date.strftime('%Y-%m-%d')
    return ymd


dates, opening_prices, highest_prices, \
    lowest_prices, closing_prices = np.loadtxt(
        'aapl.csv',
        delimiter=',', usecols=(1, 3, 4, 5, 6),
        unpack=True, dtype='M8[D], f8, f8, f8, f8',
        converters={1: dmy2ymd})
mp.figure('Candlestick', facecolor='lightgray')
mp.title('Candlestick', fontsize=20)
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
ax = mp.gca()
# 设置水平坐标每个星期一为主刻度
ax.xaxis.set_major_locator(md.WeekdayLocator(
    byweekday=md.MO))
# 设置水平坐标每一天为次刻度
ax.xaxis.set_minor_locator(md.DayLocator())
# 设置水平坐标主刻度标签格式
ax.xaxis.set_major_formatter(md.DateFormatter(
    '%d %b %Y'))
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
dates = dates.astype(md.datetime.datetime)
# 阳线掩码
rise = closing_prices - opening_prices >= 0.01
# 阴线掩码
fall = opening_prices - closing_prices >= 0.01
# 填充色
fc = np.zeros(dates.size, dtype='3f4')
fc[rise], fc[fall] = (1, 1, 1), (0, 0.5, 0)
# 边缘色
ec = np.zeros(dates.size, dtype='3f4')
ec[rise], ec[fall] = (1, 0, 0), (0, 0.5, 0)
mp.bar(dates, highest_prices - lowest_prices, 0,
       lowest_prices, color=fc, edgecolor=ec)
mp.bar(dates, closing_prices - opening_prices, 0.8,
       opening_prices, color=fc, edgecolor=ec)
# 自动调整水平坐标轴的日期标签
mp.gcf().autofmt_xdate()
mp.show()

2.算数平均值
样本:S = [s1, s2, ..., sn]
算数平均值:m = (s1+s2+...+sn) / n
s1 = s+d1
s2 = s+d2
...
sn = s+dn
m = (s1+s2+...+sn) / n
=(s+s+...+s) / n + (d1+d2+...+dn)/n
=s + (d1+d2+...+dn)/n
n->oo
算数平均值表示对真值的无偏估计。
numpy.mean(S)->m
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
closing_prices = np.loadtxt(
    'data/aapl.csv', delimiter=',',
    usecols=(6), unpack=True)
mean = 0
for closing_price in closing_prices:
    mean += closing_price
mean /= closing_prices.size
print(mean)
mean = np.mean(closing_prices)
print(mean)

3.加权平均值
样本:S = [s1,s2,...,sn]
权重:W = [w1,w2,...,wn]
加权平均值:a = (s1w1+s2w2+...+snwn)/(w1+w2+...+wn)
numpy.average(S,weights=W)->a
VWAP - 成交量加权平均价格
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
closing_prices, volumes = np.loadtxt(
    '../../data/aapl.csv', delimiter=',',
    usecols=(6, 7), unpack=True)
vwap, wsum = 0, 0
for closing_price, volume in zip(
        closing_prices, volumes):
    vwap += closing_price * volume
    wsum += volume
vwap /= wsum
print(vwap)
vwap = np.average(closing_prices, weights=volumes)
print(vwap)


TWAP-时间加权平均价格
代码:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime as dt
import numpy as np


def dmy2days(dmy):
    dmy = str(dmy, encoding='utf-8')
    date = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    days = (date - dt.date.min).days
    return days


days, closing_prices = np.loadtxt(
    '../../data/aapl.csv', delimiter=',',
    usecols=(1, 6), unpack=True,
    converters={1: dmy2days})
twap = np.average(closing_prices, weights=days)
print(twap)

猜你喜欢

转载自blog.csdn.net/qq_42584444/article/details/83780989