Python高级数据处理和可视化2

该系列为南京大学课程《用Python玩转数据》学习笔记,主要以思维导图的记录

6.5 数据存取

数据存取

扩展:箱型图分析成绩数据

把以下数据复制到 excel 工作表中(文件名为 score.xlsx):

MathsEnglishPythonMusicPhysicsChemistryPE
Wang88649685908195
Ma92999594929490
Liu91879995959270
Qian78997581838892
Meng88789884709598
Song1009510092989565

利用 pandas 的 read_excel()方法读出数据保存到一个 DataFrame 中,并绘制相应的箱形图。

实现:

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
# author:zhengk

import pandas as pd
import matplotlib.pyplot as plt

scores = pd.read_excel('scores.xlsx')
scores.boxplot()
plt.show()

图像显示:

boxplot

(1)哪些课程的成绩分布比较集中,哪些比较分散?你是通过什么来观察到的?

Maths、Python 和 Chemistry 分布比较集中,而 English 和 PE 的分布则比较分散,从箱子的长度可以获得这些信息;

(2)哪些课程的成绩分布比较平均(对称)?你是通过什么来观察到的?

在 7 门课程中,Python 的成绩分布最为均匀,PE 的成绩分布最不均匀,从中位数到上四分位和下四分位的距离比较可以获得这些信息;

(3)哪些课程的成绩总体较好?哪些总体较差?你是通过什么来观察到的?

Python 的总体情况最好,Maths、English 和 Music 的总体情况不太理想,从中位数的位置可以获得这些信息,分析数据可以发现这 3 门课程中各有 3 个同学没有达到 90 分,PE 虽然从图中看平均值应该不高,但其总体情况较好,分析数据可以发现有 2 个同学考了低分但 90 以上的有 4 个同学;

(4)哪些课程的成绩存在与总体情况不相符的值?你是通过什么来观察到的?

Maths、Python 和 Physics 中分别有 2 个、1 个、1 个异常值(离群点),箱形图中会将这些异常值单独列出,一是为了一目了然地表明数据中的异常,二是为了不因为这些少数的异常数据导致整体特征的偏移。

6.6 Python的理工类应用

Python的理工类应用

扩展:WAV音频处理入门研究

1. 网络数据读取与保存
主要使用 urllib.request 模块此处选择位于 http://www.nch.com.au/acm/11k16bitpcm.wav 的音频作为数据源,使用 urllib.request.urlopen()函数取得该文件,并以‘english.wav’的文件名保存在本地的程序所在路径。

实现:

1
2
3
4
5
6
# 获取wav文件
response = urllib.request.urlopen('http://www.nch.com.au/acm/11k16bitpcm.wav')
wav_file = 'english.wav'
file = open(wav_file, 'wb+')
file.write(response.read())
file.close()

2. 简单幅度处理
使用 wavfile 模块可以比较简单地从 wav 格式的文件中读取出相应的采样率、数据等信息,而不必关心文件的格式细节。python 的 wave 模块也有相应的操作,示例详见代码。读取后使用 pyplot 模块,可以绘制出音频文件的波形图。

将信号幅值按比例减小,表现出来的效果就是声音强度减小。使用 numpy 模块,将原始数据与常数相乘,得到一个值减小的新数组。这里利用了 numpy的广播机制,如果两个相乘的对象长度不等,numpy 会根据一定的规则将对象扩展为相同的类型,再做运算。

计算完成后,使用 wavfile.write()函数将修改后的音频信号写入一个新的文件中,命名为’silent.wav’,采样率未修改,与原音频相同。

最后使用 matplotlib.pyplot 绘制波形图对比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 读取wav文件
wavefile = wave.open(wav_file, 'r')
params = wavefile.getparams()
nchannels, sample_width, framerate, numframes = params[:4]
#nchannels:声道数
#sample_width:采样宽度,每个采样的字节数
#framerate:采样率
#numframes:总采样数

sample_rate, data = scipy.io.wavfile.read(wav_file)

matplotlib.pyplot.subplot(2,1,1)
matplotlib.pyplot.title('Original')
matplotlib.pyplot.plot(data)

newdata = data * 0.2
newdata = newdata.astype(numpy.int16)

scipy.io.wavfile.write('silent.wav', sample_rate, newdata)

matplotlib.pyplot.subplot(2,1,2)
matplotlib.pyplot.title('Quiet')
matplotlib.pyplot.plot(newdata)

matplotlib.pyplot.show()

图像显示:

compare

3. 简单时频分析
音频信号是一种常见的非平稳信号,频域特性随时间变化。时频图是分析音频信号的常用工具,在一幅图中表示出信号的频率、幅度随时间的变化。pylab 模块提供了 specgram 函数,可以简单地通过配置相应参数进行短时傅里叶变换,并输出时频图。

实现:

1
2
3
4
5
result = matplotlib.pylab.specgram(newdata, NFFT=1024, Fs=sample_rate, noverlap=900)
#y:音频信号
#NFFT:每个进行快速傅里叶变换的数据块大小,一般取 2 的幂次
#Fs:采样率 #noverlap:数据块之间重叠数据点的个数
matplotlib.pylab.show()

图像显示:

nfft

6.7 Python的人文社科类应用

Python的人文社科应用