数据分析
Python 数据分析day_1:认识Notebook,及NumPy , Pandas 和 Matplotlib基本使用方法
python 数据分析 day2 数组的运算及矩阵
python 数据分析 day3 矩阵及利用线性回归处理boston数据集
python 数据分析 day4 pandas 之 Series
python 数据分析day4 Pandas 之 DataFrame
1.认识Notebook
1.1 三大神器
NumPy --> 保存数据和数据运算 --> SciPy
Pandas -->Panel Data Set --> 提供了核心的数据结构来展示和处理数据–>展示和处理数据(整合了NumPy 和 Matplotlib)
Matplotlib -->数据可视化(把数据变成漂亮的图表)
1.2 热身任务
热身任务:用随机的方式生成5个学生3门课程的成绩(百分制的成绩),统计每个学生的平均分,统计每门课的最高分和最低分
import random
names = ['白起', '庄周', '狄仁杰', '吕布', '达摩']
courses = ['语文', '数学', '英语']
n, m = len(names), len(courses)
scores = [[random.randint(60, 100) for _ in range(m)] for _ in range(n)]
#[[93, 98, 85], [88, 76, 70], [69, 85, 61], [91, 75, 64], [70, 60, 66]]
for i, score in enumerate(scores):
avg_score = sum(score) / m
print(f'{names[i]}的平均分:{avg_score:.1f}')
"""
白起的平均分:92.0
庄周的平均分:78.0
狄仁杰的平均分:71.7
吕布的平均分:76.7
达摩的平均分:65.3
"""
for i, course in enumerate(courses):
temp = [scores[j][i] for j in range(n)]
max_score, min_score = max(temp), min(temp)
print(f'{course}的最高分: {max_score}')
print(f'{course}的最低分: {min_score}')
"""
语文的最高分: 96
语文的最低分: 65
数学的最高分: 98
数学的最低分: 70
英语的最高分: 78
英语的最低分: 61
"""
1.3 利用numpy 和 pandas 解决上述问题
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
NumPy
NumPy的核心是ndarray,它可以用来表示多维数组。
ndarray在保存和运算能力上,远远强过Python中的list类型。
# 将嵌套列表处理成NumPy的二维数组
scores = np.array(scores)
print(scores)
"""
array([[93, 98, 85],
[88, 76, 70],
[69, 85, 61],
[91, 75, 64],
[70, 60, 66]])
"""
type(scores) # numpy.ndarray
# 注意,在计算均值时,默认在0轴方向计算,在1轴方向计算需要声明
np.round(scores.mean(axis=1), 1) #[92. , 78. , 71.7, 76.7, 65.3]
scores.max(axis=0) #[93, 98, 85]
scores.min(axis=0) #[69, 60, 61]
scores.std(axis=0) # [10.49571341, 12.51239386, 8.42377588]
Pandas
核心数据类型DataFrame,跟我们平时用的二维表一模一样。
score_df = pd.DataFrame(data=scores, columns=courses, index=names)
score_df
avg_score = np.round(score_df.mean(axis=1), 1)
avg_score
score_df['平均分'] = avg_score
score_df
max_score = score_df.max(axis=0)
min_score = score_df.min(axis=0)
score_df.loc['最高分'] = max_score
score_df.loc['最低分'] = min_score
score_df
score_df.to_excel('学生成绩统计表.xlsx')
# 配置支持中文的字体
plt.rcParams['font.sans-serif'] = ['FangSong']
# 魔法指令
%config InlineBackend.figure_format = 'svg'
score_df.loc['白起': '达摩'].plot(kind='bar', y=['语文', '数学', '英语'])
plt.xticks(rotation=0)
plt.savefig('学生成绩柱状图.svg')
plt.show()
2.NumPy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline #内嵌图
%config InlineBackend.figure_format = 'svg' # 出的图为矢量图
2.1 创建一维数组
# 用array函数通过list创建创建一维数组
array1 = np.array([1, 10, 100, 1000])
# 用arange函数指定起止范围创建一维数组
array2 = np.arange(1, 101, 2)
array2
# 通过函数linspace用间隔均匀的数字生成一维数组
array3 = np.linspace(-5, 5, 80)
array3
# 通过随机的方式创建一维数组
array4 = np.random.random(10)
array4
array5 = np.random.randint(10, 100, 10)
array5
array6 = np.random.normal(170, 7, 100)
array6
2.2 创建二维数组
# 用嵌套列表创建二维数组
array7 = np.array([[1, 2, 3], [3, 4, 5], [5, 5, 6]])
array7
# 通过对一维数组调形创建二维数组
array8 = np.random.randint(60, 101, 15).reshape((3, 5))
array8
# 创建全0,全1,指定元素的二维数组
# array9 = np.zeros((5, 4), dtype=np.int)
# array9 = np.ones((5, 4), dtype=np.int)
array9 = np.full((5, 4), 100)
array9
# 创建单位矩阵
array10 = np.eye(10)
array10
# 用随机的方式创建二维数组
array11 = np.random.randint(60, 101, (5, 3))
array11
array12 = np.array(array11, dtype='d')
array12
2.2,1 数组的属性和方法
# 数组元素的个数
array12.size
# 数组元素的数据类型
array12.dtype
# 数组的维度(dimension)
array12.ndim
# 数组的形状
array12.shape
# 数组中每个元素占用的内存空间(字节)
array12.itemsize
# 数组总共占用的内存空间(字节)
array12.nbytes
2.2.2 和描述性统计相关的方法
# 和描述性统计相关的方法
print(array12.sum())
print(array12.mean())
print(array12.max())
print(array12.min())
print(array12.std())
print(array12.var())
# 在指定的轴上进行描述性统计运算
print(array12.sum(axis=1))
print(array12.mean(axis=0))
array13 = np.random.randint(10, 101, 10)
array13
# 数组就地排序
array13.sort()
array13
# 调用numpy的sort函数给数组排序,返回排好序的数组,原数组不变
np.sort(array13)
# 去重
np.unique(array13)
2.3 二维数组切片
索引
array13[0], array13[-1]
# 数组的关系运算会产生一个布尔数组
array13 > 50
# 布尔索引(用布尔类型的数组作为索引,True对应的元素保留,False对应的元素去掉)
array13[array13 > 50]
# 可以用& 或者 | 对两个布尔数组进行运算,相当于Python中and 和 or
array15[(array15>50) & (array15%2==0)]
array15[(array15>50) | (array15%2==0)]
# 花式索引(fancy index)
array15[[2,3,0,0,-1,-4,5,6]]
切片
array16=np.arange(1,10).reshape(3,3)
array16
"""
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
"""
array16[1][0] #4
array16[1,0] # 4
#二维数组切片
array16[1:,:2]
"""
array([[4, 5],
[7, 8]])
"""
array16[::2,::2]
"""
array([[1, 3],
[7, 9]])
"""
#花式索引
array16[[0,1,2],[0,1,2]] #array([1, 5, 9])
2.4三维数组(涉及图像处理,重要)
# 读取图片创建三维数组
guido = plt.imread('guido.jpg')
guido.shape
# 查看数组的维度
guido.ndim
# 通过数组显示图片
plt.imshow(guido)
# 通过切片实现抠图操作
guido_head = guido[30: 350, 90: 310]
plt.imshow(guido_head)
# 垂直翻转
plt.imshow(guido[::-1])
# 水平翻转
plt.imshow(guido[:, ::-1])
plt.imshow(guido[:, :, ::-1])