本学习笔记内容来源于网络视频课,多为拼凑内容,但也很实用;
涵盖了职业分析、Excel、notebook & numpy & pandas & matplotlib的常规使用,仅为数据分析入门要求,如果想深入了解,可自阅官方文档;
sql、excel、python + 业务理解,数据分析思维很重要;
数据分析岗位要求:
技术栈和能力解读:
Tips:
- 小基础:SQL
- 生产力:Excel
- BI工具:超智能
- 拉差距:Python
具体岗位职责:
前景:
理解业务、学习技术、领域深耕(用户增长、风控、推荐、金融量化)、数据科学;
数据分析思维、统计学、Excel、SQL、Python、业务理解、PBI、Tableau、数据分析报告;
可以兼职做一些数据分析的工作;
一名好的数据分析师:
好的指标:
思维训练:
Power Query:使用PowerBI,而不用Excel;
数据格式:
选择特定的数据类型 主要是为了匹配使用相应的函数
Excel的自定义格式:
##"次"
[>=75][蓝色]##"次";[<75][红色]##"次" // 这种根据条件改变了数字值的颜色;使用条件格式 可以设置单元格的颜色(颜色进度条);
[>=60][蓝色]##"分";[<60][红色]##"分"####;0000(自动补位)
方式1
四个部分代码结构,中间用 ; 号间隔:
格式: 正数格式;负数格式;零格式;文本格式
示例:
两部分代码结构:
第一部分用于正数和零,第二部分用于负数
00.00;[红色]"-"00;
一部分代码结构:
用于所有数字
要跳过某一代码部分,需要为其指定一个结束分号;
方式2
特定条件,如
大于条件值;小于条件值;等于条件值;文本
示例:
[红色][<=100];[蓝色][>100]
方式3
特定条件
条件值1;条件值2;同时不满足条件值1,2;文本
使用方法:
使用 TEXT(value, format txt)
示例:
TEXT(1234.4567, "00.00") 显示为 1234.46
这里会用到一些符号标记:
- G/通用格式 // 这是默认的格式
- # // 代表数字
- ##.## // 保留两位小数
- ##.00 // 保留两位小数 不够则补0
- 0 // 也代表数字,不过 0000 对应的数值如果只要3位 就会在前 补一个0(这个0并无意义)
- "" // 使用双引号标记显示的字符串 仅仅是额外显示 不会影响被保留的单位
- ? // 为无意义的零在小数点两边添加空格,以便使小数点对其
- ??.???
- , // 显示千位分隔符或者将数字除以千倍显示
- #,# // 千位分隔符
- #, // 除以千倍
- #,, // 除以千千倍
- . // 小数点 如果外加双引号则为字符
- 0.#
- % // 百分比
- #% // 以百分比显示数字
- / // 显示后面一个字符 实际会被转成双引号的形式
- "" // 显示双引号里的字符
- * // 重复下一次字符 直到充满列宽,用于文本重复显示
条件格式
单元格样式
清除功能
排序和筛选
查找和选择
审阅:保护工作表、工作簿,即添加密码、进行操作限制;
只开放部分区域:可以 使用审阅中的“允许编辑区域”
填充柄:
添加自定义选项序列
多个不连续单元格填入同数据
文本记忆输入:
数据验证:
数据可以从外部导入;(更确切的说是引入)
单列数据 可以 使用 数据中的分列功能 进行按照特定分隔符的拆分;
汇总的快捷方式:Alt + =
视图 冻结单元格:当数据行列较多时,方便查看;
填充空值:
分类汇总:
查找 选择、定位条件、可见单元格
选择性粘贴:
隔一行差一行
快速填充、智能填充(Ctrl + e)
数据分列:
Anaconda / Miniconda
打开Anaconda Prompt终端:(或者cd到conda目录 conda activate base)
接下来可以 做一些 conda的配置;
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载。.condarc 文件。Windows 用户无法直接创建名为 .condarc 的文件,可先执行 conda config --set show_channel_urls yes 生成该文件之后再修改。注:由于更新过快难以同步,我们不同步pytorch-nightly, pytorch-nightly-cpu, ignite-nightly这三个包。
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
conda clean -i 清除索引缓存,保证用的是镜像站提供的索引。conda create -n myenv numpy 测试一下吧。主要是配置国内的安装源 如清华源;(某些包如果这个源没有,就需要更换其他源,或者使用pip安装)
conda install jupyter
pip install pyecharts # pyecharts只能使用pip安装
环境变量:
用户变量 和 系统变量:
which python 查看指定终端命令 环境变量的路径conda的基本使用:
Conda:查看
conda list
conda env list
conda update conda
Conda:创建
conda create -n your_env_name python=X.X
python --version
source activate your_env_name(虚拟环境名称) / activate your_env_name(虚拟环境名称) / conda activate base
conda install -n your_env_name [package]即可安装package到your_env_name中
Conda:切换
deactivate env_name,也可以使用`activate root`切回root环境
Linux下使用 source deactivate
Conda:更新
conda update conda
conda update --force conda
移除环境
使用命令conda remove -n your_env_name(虚拟环境名称) --all, 即可删除。
删除环境中的某个包。
使用命令conda remove --name $your_env_name $package_name 即可。
设置国内镜像
如果需要安装很多packages,你会发现conda下载的速度经常很慢,因为Anaconda.org的服务器在国外。所幸的是,清华TUNA镜像源有Anaconda仓库的镜像,我们将其加入conda的配置即可:
# 添加Anaconda的TUNA镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# TUNA的help中镜像地址加有引号,需要去掉
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes
示例:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
conda config --set show_channel_urls yes
单元格选中状态(编辑状态)
shift+enter / ctrl + enter 运行单元格shift + tab 查看函数 类似问号?的方式查看函数文档func?help(len)魔发指令:
%run 运行外部python脚本(一般可以把软件工具包 写成这样一个单独的脚本)%time 记录一行运行时间%time func
%%time 记录多行运行时间%%time
func1
func2
%timeit 循环多次取均值%timeit func
%%timeit 循环多次取均值%%timeit
func1
func2
%who 查看当前Python变量%whos 更详细值得注意IN OUT 的单元格序号 说明单元格的操作是有顺序的;
In[45] 可以返回 单元格In序号为45的输出Out[44] 可以返回 单元格Out序号为44的输出_ 最近一次输出_44 等价于 Out[44]多个cell运行独立 但是资源共享;Ipython内核:基于python内核,做了数学上的优化;
numpy、pandas、matplotlib + seaborn、pyecharts
矩阵运算
import numpy as np
import matplotlib.pyplot as plt
arr = np.array([])
arr.sum()
np.arange(1,10,2) # 一组等差序列
np.random.randn(n) # 一组随机数 服从正态分布(均值0 方差1)
plt.hist(data) # 直方图展示
np.random.randint(起始数, 终止数,(行,列))
arr.reshape((4,5))
# 从0 到 2π 之间 拆出100个数,等差数列
x = np.linespace(0, 2*np.pi, 100)
y = np.sin(x)
二维表格处理:分析 和清晰
import pandas as pd
pd.Series(['a','b','c']) # 默认 显示索引 0 1 2
names = pd.Series(['a','b','c'], index=['x','y','z']) # 指定 显示索引为 x y z
ages = pd.Series(['1','2','3'], index=['x','y','z'])
# 共用索引 即可组成表格
pd.DataFrame(data={
'names':names,
'ages':ages
})
# 也可以传入数组(ndarray也可)进行构建
pd.DataFrame([[1,2],[1,2],[1,2]], columns=['date','score'], index=["A","B","C"])
# 其他构造方法
df = pd.DataFrame()
df['date'] = [1,3,5]
df['score'] = [2,4,6]
# 从一个字典构造
pd.DataFrame.from_dict({'a':[],'b':[]}) # 默认列索引
pd.DataFrame.from_dict({'a':[],'b':[]}, orient="index") # 可以改变朝向 变成行索引
修改索引 :
# 把列设置为索引
df.set_index('date') # 未修改原数据
df.set_index('date', inplace=True) # 替换原数据
# 把索引设置为列
df.reset_index()
df.reset_index(inplace=True)
# 修改 索引和列名
df.rename(index={"A":"a","B":"b","C":"c"}, columns={'X':'x','Y':'y'}, inplace=True)
文件读取和写入:
pd.read_excel('./xxx1.xlsx')
pd.read_excel('./xxx1.xlsx', sheet_name=0) # 第一个sheet的索引为0
pd.read_excel('./xxx1.xlsx', index_col=0) # 将第0列设定为 行索引
pd.read_excel('./xxx1.xlsx', header=0) # 将第0行设定为 列索引(多行就传入数组)
df.to_excel('./xxx2.xlsx', index=False)
数据的读取和筛选:
data_list = [[1,2,3]],[4,5,6],[7,8,9]
data = pd.DataFrame(data=data_list, index=['r1','r2','r3'], columns=['c1','c2','c3'])
# 读取n列
data['c1'] # 单列 seriex
data[['c1','c2']] # 多列 dataframe
# 读取n行
data.loc['r1'] # 单行
data.loc[['r1','r2']] # 多行
data.head(10) # 查看前10行 默认为5
# 筛选
data[df['c1'] > 1]
data.shape
data.describe()
data.info()
data['c1'].value_counts() # 数值频次统计
# 运算
df['sum'] = df['c1'] + df['c2'] + df['c3']
# 聚合运算
df.sum(axis=0) # 列向 每一列求和 series
df.mean(axis=1) # 行向 每一行求和 series
# 数据映射:通过map方法 对数据列进行映射
def map_func(x):
if x >0 :
return 'A'
else:
return 'B'
df['c1'].map(map_func) # map是对Series的
df.apply(map_func) # apply是对Dataframe的
df.apply(map_func, axis=0) # axis=0(每次给一列,可以对该列的每行访问)
df.apply(map_func, axis=1) # apply通过设置axis=1(每次给一行,可以对该行的列访问)
df.sort_values(by='c1', ascending=False) # 排序
df.drop_duplicates(subset=["name", "songer"], keep="first", inplace=True) # 按列去重
# pandas 其他常用方法:
mean(axis=0, skipna=False) # DataFrame 经计算返回的是 Series对象 默认按列进行计算
sum(axis)
sort_index(axis, ascending) # 对 列/行 索引进行排序
sort_values(by, axis, ascending) # 对 列/行 值进行排序
# 空值处理
df.fillna(value=0, inplace=True) # 全部填充
df.loc[2, 'c2'] = 0 # 单独赋值 索引为2的行 列名为c2的列
df.loc[‘a’,’one’] # 更推荐的方式 和ndarray类似
df.loc[['a’,’c'],:]
# 空值检验
df.isnull()
df.isnull().sum() # 每列空值个数
df.isnull().sum().mean() # 每列空值占比
# 处理缺失数据的方法:
dropna() #默认 一行只要有一个缺失值 整行就都会被删掉
dropna(how=‘all’) # how的默认值是any 设置为all之后 那么需要整行都是缺失值 才会被删掉;
dropna(axis=1) # 按列轴 进行 缺失值处理
fillna()
isnull()
notnull()
# pandas 对时间对象的处理
# 时间序列类型:
# 时间戳
# 时期
# 间隔
# Python标准库处理时间对象:datetime time
import datetime
datetime.datetime.strptime(‘2021-06-21’,’%Y-%m-%d')
# 灵活处理时间对象:dateutil库(pandas依赖该库)
dateutil.parser.parse('2021/06/21’)
dateutil.parser.parse('06/21/2021')
# 成组处理时间对象:
pd.to_datetime(['2021/06/21','2021/06/22'])
# 生成时间范围:
dt = pd.date_range(start, end, freq='1h20min') # 默认频率是天(D day)、月(M month)、半个月(SM semi-month)小时(H hour)、周日(W week)、周一(W-MON)、工作日(B business)、分钟(T min)、秒(S second)、年(A year);
pd.date_range(start, period)
dt[0].to_pydatetime()
# pandas 时间序列
# 以时间对象作为索引的 Series 或 DataFrame
# datetime对象作为索引时 是存储在 DatetimeIndex对象中的
# 时间序列特殊功能:
# 传入 年 年月 作为切片方式
# 传入日期范围作为切片方式
# 丰富的函数支持:
resample() # 重新采样
sr.truncate(before,after) # 类似切片
sr = pd.Series(np.arange(100), index=pd.date_range('2020-01-01', period=100))
sr['2020-03'] # 整个三月
sr['2020-03':'2020-4'] # 切片 支持不完整的日期
sr.resample('W').sum() # 会算出来 每一周数据的和
sr.resample('M').mean() # 每个月数据的平均值
使用实例:
# 时间类型装换
pd.to_datetime(df['日期'])
df.info()
df.set_index('日期')
# 2016年3月的所有数据(DataFrame)
df.loc['2016-3'] # 由于是datetime类型 这里索引行 会自动识别
# 路径简要操作
if not os.path.exists('./test'):
os.makedirs('./test')
for item in os.listdir('./test')
file_path = os.path.join('./test', item)
print(file_path)
for root, dirs, filenames in os.walk('./test')
print('逐层路径 遍历目录!!')
for filename in filenames:
print(os.path.join(root, filename))
# 汇总:
# 级联汇总:纵向(字段同)
pd.concat(df1, df2)
# 合并汇总:横向(关联索引同)
数据可视化功能:
# 引入方式
import matplotlib.pyplot as plt
# from matplotlib import pyplot as plt # 同
%matplotlib inline
# 多条线:
plt.plot(x, y, color='red', linewidth=3, linestyle='--') # -- 虚线
plt.plot(x, y, color='red', linewidth=3, linestyle='-') # - 实线
plt.show() # 渲染(单元末尾可选)
plt.bar(x,y)
plt.bar(x,y, color=np.random.random((4,3))) # 4个 3元组 值为0~1之间的小数
plt.show() # 渲染(单元末尾可选)
plt.scatter(x, y)
plt.scatter(x, y, s=z) # s指 size 表示散点大小
plt.show() # 渲染(单元末尾可选)
# 图例、标题和说明
plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')
plt.plot(x, y, label='L1') # 图例信息
plt.legend() # 图例展示
plt.legend(loc='upper right') # 指定位置 右上角【upper lower right left】
# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 可以打印 查看 plt.rcParams
pandas中的便捷绘图:
df.plot(kind='line') # 线状图
df.plot(kind='bar') # 柱状图
df.plot(kind='hist') # 直方图
df.plot(kind='bie') # 饼图
df.plot(kind='box') # 箱体图
df.plot(kind='area') # 面积图
# series 也有类似的绘图功能
df.T.plot()
绘制多图:子画布
figure
axes:1 axes:2
axes:3 axes:4
# 绘制多图
plt.figure(figsize=(12, 8)) # 调整画板大小
ax1 = subplot(221) # 2行2列的画布 在子图序号1上进行绘制
ax1.plot(x, y)
ax2= subplot(222)
ax2.plot(x, y)
ax3= subplot(223)
ax3.plot(x, y)
ax4= subplot(224)
ax4.plot(x, y)
Over!