Python数据分析第一周总结
一、数据分析的介绍
1.什么是指标?
指标:能够反映业务特征的统计数据就是指标。
Database —> DB —> OLTP (Online Transation Procession) —> 业务库
Logging日志文件—>Flume/Logstash
开发数据集 —> CSV/Excel/Open API —> JSON —>Sqoop
ETL —> Extract Transform Load
Data warehouse —>DW —> OLAP(Online Analysis Processing) —> 分析库
—> Hadoop (HDFS + MapReduce/Spark) —>Hive —>HQL
2.数据分析的工作内容
1.确定目标(输入)
2.获取数据
3.清洗数据
4.数据透视
5.数据报告(输出)
6.分析洞察(后续)
3.工具准备
Jupyter —> Julia / Python / R
— Notebook
— JupyterLab
Anaconda —>Python 3.9 + 200个三方库(小白)
Miniconda —> Python 3.9 + 若干个必要的库
方案一:
打开电脑终端
输入命令pip install jupyter 下载jupyter
输入命令jupyter notebook,启动jupyter notebook
如果jupyter notebook无法执行代码,输入命令pip install pyzmp==20.0.0
方案二:
下载jupyterlab输入命令pip install jupyterlab
更新jupyterlab输入命令pip install -U jupyterlab
运行jupyterlab输入命令jupyter lab
4.常用魔法指令
%pwd显示文件路径
%ls看到该路径下所有文件
%lsmagic看所有的魔法指令
%load导入该路径下的某个python文件
二、认识Notebook
for _ in range(10):
print('hello ,world')
# 查看函数的用法
? range
# 显示文件的路径
%pwd
# 显示当前文件
%ls
# 查看所有的魔法指令
%lsmagic
热身练习
用随机的方式产生5个学生(姓名自拟)3门课程(语文、数学、英语)的成绩
1.统计每个学生的平均分。
2.统计每门课程的最高分和最低分。
3.统计每门课程成绩的(样本)方差。
def average(scores: list):
return sum(scores) / len(scores)
def variance(scores: list):
mean_value = average(scores)
return sum([(score-mean_value)**2 for score in scores]) / (len(scores)-1)
import random
names = ('Sam', 'Mary', 'Bob', 'Alex', 'Alice')
courses = ('语文', '数学', '英语')
scores = [[random.randrange(0, 101) for x in range(3)] for y in range(5)]
scores
for i, name in enumerate(names):
print(f'{name}平均分:{average(scores[i]):.1f}')
for i, course in enumerate(courses):
temp_scores = [scores[j][i] for j in range(5)]
print(f'{course}的最高分:{max(temp_scores)}')
print(f'{course}的最低分:{min(temp_scores)}')
print(f'{course}成绩的方差:{variance(temp_scores)}')
notebook上下载某个库
! pip install…
!pip install -U…
# 查看库的版本
np.__version__
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'STZhongsong'
plt.rcParams['axes.unicode_minus'] = False
import random
names = ('Sam', 'Mary', 'Bob', 'Alex', 'Alice')
courses = ('语文', '数学', '英语')
scores = [[random.randrange(0, 101) for x in range(3)] for y in range(5)]
# array数组
scores = np.array(scores)
scores
type(scores) # numpy.ndarray
# 计算每个学生的平均分(沿着1轴求平均)
np.round(scores.mean(axis=1),1)
# 统计每门课的最高分(沿着0轴找最大)
scores.max(axis=0)
# 统计每门课的最低分(沿着0轴找最小)
scores.min(axis=0)
# 统计每门课的方差(沿着0轴求方差)
scores.var(axis=0)
# 创建DataFrame对象
df = pd.DataFrame(data=scores, colums=courses, index=names)
df
# 增加一个列(平均分)
df['平均分'] = np.round(df.mean(axis=1), 1)
df
%config InlineBackend.figure_format = 'svg'
# 生成柱状图
df.plot(kind='bar', y=['语文', '数学', '英语'])
plt.xticks(rotation=0)
plt.show()
# 增加一个行(方差)
df.loc['方差'] = df.var(axis=0)
df
# 写入excel
df.to_excel('学生成绩.xlsx')
三、Numpy的应用
# 通过array函数将List转换成ndarray
array1 = np.array([1, 2, 3, 4, 5], dtype='i8')
array1
type(array1) # numpy.ndarray
# 元素个数
array1.size
# 维度
array1.ndim
# 形状
array1.shape
# 每个元素占用的内存空间(字节) 1个元素8个字节
array1.itemsize
# 元素的数据类型
array1.dtype
# 整个数组占用的内存空间(字节)
array1.nbytes
# 通过arange函数指定取值范围创建ndarray
array2 = np.arrange(1, 100, 2)
array2
# 通过linspace构造等差数列创建ndarray
array3 = np.linspace(-5, 5, 101)
%timeit list(range(1000000))
%timeit np.arange(1000000)
# 通过随机的方式创建ndarray对象
array4 = np.random.randint(60, 101, 15)
array4
# 创建10个0~1的小数
array5 = np.random.random(10)
array5
# 创建二维数组
array6 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array6
array6[1][1] # 5
array6[2, 1] # 8
# 花式索引
array6[[0, 1, 1, 2], [2, 0, 2, 1]] # array([3, 4, 6, 8])
# 布尔索引
array6[array6 > 5] # array([6, 7, 8, 9])
array6[(array6 > 5) & (array6 % 2 == 0)] # array([6, 8])
array6.ndim # 2
array6.shape # (3, 3)
# 用随机的方式创建二维数组
array7 = np.random.randint(60, 101, (5, 3))
array7
array8 = np.zeros((4, 5), dtype='i8')
array8
np.ones((2, 5), dtype='u8')
np.full((10, 10), 'ad')
array9 = np.eye(10)
array9
# 将一维数组调形成二维数组
array10 = array4.reshape((5,3))
array10
# 将二维数组调形成一维数组
array11 = array10.flatten()
array11
# 将数组变成列表
array11.tolist()
数组的索引和切片
array11[0] = 100
array11[[1, 3, 9]]
# 花式索引
array11[[1, 3, 9, -1, -1, 0, 0, 0]]
# 数组的关系运算会产生布尔数组
array11 >= 80
# 布尔索引
array11[array11 >= 80]
array11[(array11 % 2 != 0) & (array11 >= 80)]
array11[(array11 % 2 != 0) | (array11 >= 80)]
# 切片操作
array11[3:8]
array11[3:8:2]
array11[::-1]
array12=np.array([[0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7],[6, 7, 8, 9]])
array12
array12[0:2, 0:2]
array12[1:3, 1:3]
array12[2:, 2:]
array12[0::3, 0::3]
array13 = plt.imread('背景图.png')
array13
array13.ndim # 3
# 显示图片
plt.imshow(array13)
# 水平翻转
plt.imshow(array13[:, ::-1])
# 垂直翻转
plt.imshow(array13[::-1, :])
# 抠图
plt.imshow(array13[0:600, 1250::])
# 让图变模糊
plt.imshow(array13[::5,::5])
# 改颜色
plt.imshow(array13[::5, ::5, ::-1])
获取描述性统计信息
-
均值(mean):均值代表某个数据集的整体水平,我们经常提到的客单价、平均访问时长、平均配送时长等指标都是均值。均值的缺点是容易受极值的影响,虽然可以使用加权平均值来消除极值的影响,但是可能事先并不清楚数据的权重;对于正数可以用几何平均值来替代算术平均值。
算术平均值:
x ˉ = 1 N ∑ i = 1 N x i \bar{x} = \frac {1} {N} \sum_{i=1}^{N}x_{i} xˉ=N1i=1</