7.18
-
4p理论
-
5w2h 理论PEST方法
5W2H方法
逻辑树方法
4P营销理论方法用户行为理论方法
7.19
-
某些学者认为,数据分析分为三类,
入门级的描述性数据分析,
其方法主要有对比、平均、交叉分析法。
高级的探索、和验证数据分析, -
分析方法有主要有
相关分析,
回归分析,
因子分析。
这样的提法有它自己的道理。在我看来,
实际上就两类:描述性统计分析和计算性数据分析。 -
几个常见的容易搞混淆统计术语
-
离散统计学 ,
频数等于 是一个数出现的次数
个体频数/所有频频的和 等于 频率比例:部分对整体
比率:部分对部分倍数:表示A的总数翻一番,现在A的总数是原来的2倍。
番数:2的幂数
番数: 表示A的总数翻两番,现在A的总数是原来的4倍对比:这个产品的销售额与上一年相比,同比增长40%;
环比:这个商品的销售额与上个月相比,环比增长30%。
-
漏斗图分析法:
漏斗图
占位数=(第一环节人数-当前环节人数)/2
环节转化率 = 第一环节/第二个环节 为 40%
总体转化率=累积环节转化率=第一行环节转化率*…*当前环节转化率
2 numpy
- import numpy as np
丈量
np.arange(1,1000)
1.出现一个大数组
批量化的计算
ar_2 = np.arange(1,1000)
2.dtype 置换数据类型 dtype=np.32 向下取整
ar_125=np.array([1,2.4,3,4.],dtype=np.32)
array([1, 2, 3, 4])
1. 创建 数组 一定要用 object dtype = object
可以真正的把表格 读取到我们的编辑器中
-
多维数字
shape 函数
2,3,3
2个 行 列
确定 外形 -
索引
单位矩阵 笛卡尔基底系统
7.16
7.16
import numpy as np
r_dim = np.arange(0,16).reshape(4,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
---生成一个矩阵
ar3_dim = np.random.randint(2,10,size=(4,4))
ar3_dim
Out[6]:
array([[6, 3, 5, 9],
[8, 3, 7, 2],
[8, 2, 3, 2],
[7, 5, 2, 5]])
ar_dim + ar3_dim
Out[7]:
array([[ 6, 4, 7, 12],
[12, 8, 13, 9],
[16, 11, 13, 13],
[19, 18, 16, 20]])
把-4,4 分成1000份
ar2_dim =np.linspace(-4,4,1000)
ar1_dim = np.random.normal(size=(4,4))
ar1_dim
Out[49]:
array([[ 2.23592643, -0.56739328, -0.37532249, 0.37043396],
[-0.0815659 , 0.69841392, -1.06545111, -0.97716546],
[-1.51375169, -0.57465094, 0.97199617, -0.2471151 ],
[ 1.3618376 , 0.84458397, -1.76120145, 0.29179346]])
np.sign(ar1_dim)
Out[50]:
array([[ 1., -1., -1., 1.],
[-1., 1., -1., -1.],
[-1., -1., 1., -1.],
[ 1., 1., -1., 1.]])
画布三部
import matplotlib.pyplot as plt ; asd,fgh = plt.subplots(1,1,bpi=140,figsize(8,6))
7.17
7.17
三个函数
-
random.shuffle(aer)
aer shuffle 可以随机打打乱一维数字 二位数组不能随机打乱 -
lambda 表达
map() 函数 可以处理一维数组
import math
map(lambda x:x2+math.sin(x),[2,3,4,5,6]) 返回一个对象
list(map(lambda x:x2+math.sin(x),[2,3,4,5,6])) 返回一个列表
list(map(lambda x:’%.2f’%x,np.random.normal(size=10)))
[’-0.37’,
‘-0.65’,
‘-1.05’,
‘0.11’,
‘0.43’,
‘-0.50’,
‘-0.40’,
‘0.88’,
‘-1.28’,
‘-2.01’]reduce()函数
from functools import reduce
自动相加 乘 除 运算
reduce(lambda x,y:(x+y),[1,2,3,4,5])
下午
-
数据筛选
-
基本的数学统计方法 方差和标准差 (简单的离散型)
离散:有限的集合数据 有限的数据的一定是离散的{1.1,1.2,1.3} 无限的可以数的集合 无限的 但不能可数来描述它 不可以一对多 看多对一 例子:1到2 的小数。 总体方差公式, 样本方差公式,
标准方差
-
sun()函数 ------- np.sum()
0行1列 逐行案列 ,逐列按行 artty = np.arange(25).reshape(5,5) artty array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]) np.sum(artty,0) array([50, 55, 60, 65, 70]) np.sum(artty,1) array([ 10, 35, 60, 85, 110]) artty.sum(0) array([50, 55, 60, 65, 70])
-
np.mean()
np.mean()整个二维数组的平均值 np,mean(0)逐行案列求平均主 每一个行的平均值 np,mean(1)逐列案行求平均主 每一个列的平均值
-
min()
np.min(ar12,0) )逐行案列求平均主 每一个行的最小值 np.min(ar12,1) )逐列案行求 每一个列的最小值
-
argmin(ar12)
array([5, 6, 5, 3, 4]) 逐行案列操作 就是找到每一列左最小值的索引 argmin(ar12,1) 逐列案行操作 就是找到每一列左最小值的索引
-
分析 :argmin(ar12) ar12.ravel() 把二维数组 转化为一维数组 过滤最小值 ar12.ravel()==np.min(ar12) 返回义个bool np.where(ar12.ravel()==np.min(ar12)) 把二维数组 展开一维数字 最小值的搜引
-
cumsum(当前值加得 加后面的 值累计加) 全部的 ar12 Out[184]: array([[ 9, 13, 5, 11, 7], [12, 12, 15, 9, 7], [ 6, 15, 14, 12, 5], [ 5, 6, 13, 3, 13], [11, 8, 8, 5, 4]]) np.cumsum(ar12) Out[185]: array([ 9, 22, 27, 38, 45, 57, 69, 84, 93, 100, 106, 121, 135, 147, 152, 157, 163, 176, 179, 192, 203, 211, 219, 224, 228], dtype=int32
-
np.cumsum(ar12,1) 逐列按行 求出每一个行的累加值
-
np.cumproduct() (当前值乘得 加后面的 累计乘) 全部的 np.cumproduct(ar12) 逐行按列 np.cumproduct(ar12,1)
7.18
二维数组和一维数组相减 是按行相减的
数据的排序和整理
1: list1 = [2,4,5,6,7,3,2,5,78,8,5,3,4,6,4,7,4,7,4,21]
转集合 集合没右重复
list2 = set(list1)
转列表
list2 = list(list2)
排序
sorted(list2)
-
用soet 函数进行排序 sort 一次型 作为方法使用
-
用soet 函数进行排序 sort 一次型 作为方法使用
逐列按行 不破坏,打乱数据 ar123.sort(1) 括号里的不指定轴号,就以为轴号 默认为1 逐列按行 对行排序 ar123.sort(0) 括号里的不指定轴号,就以为轴号0 逐行按列 对行排序 ar123 = np.random.randint(1,100,(6,6)) Out[60]: array([[29, 77, 39, 81, 36, 29], [35, 36, 99, 80, 94, 57], [37, 52, 28, 36, 57, 88], [87, 86, 65, 72, 54, 24], [96, 42, 46, 52, 1, 44], [35, 29, 97, 74, 21, 7]]) ar123.sort(1) array([[ 1, 7, 28, 29, 29, 36], [21, 24, 35, 36, 39, 52], [29, 35, 36, 42, 46, 72], [37, 44, 52, 54, 65, 74], [57, 57, 77, 80, 87, 97], [81, 86, 88, 94, 96, 99]])
-
np.unique() 等于0可以删除重复行 等于u1 就是删除列
-
np.unique() 等于0可以删除重复行 等于u1 就是删除列
ar234 = np.random.randint(2,25,25) Out[84]: array([23, 7, 6, 21, 4, 15, 21, 9, 5, 8, 16, 10, 24, 2, 19, 12, 12, 18, 3, 23, 20, 24, 12, 5, 2]) np.unique(ar234) np.unique() 可以删除重复行 按行清除 ar125[1] = ar125[4] array([[16, 22, 11, 8, 6, 9], [ 2, 18, 8, 6, 3, 5], [16, 2, 12, 13, 8, 9], [15, 22, 13, 17, 5, 11], [ 2, 18, 8, 6, 3, 5], [ 7, 7, 12, 6, 22, 21]]) np.unique(ar125,axis=0) 第一列 进行排序 升序 array([[ 2, 18, 8, 6, 3, 5], [ 7, 7, 12, 6, 22, 21], [15, 22, 13, 17, 5, 11], [16, 2, 12, 13, 8, 9], [16, 22, 11, 8, 6, 9]]) ---- ar125[:,1] = ar125[:,-1] Out[98]: array([[16, 9, 11, 8, 6, 9], [ 2, 5, 8, 6, 3, 5], [16, 9, 12, 13, 8, 9], [15, 11, 13, 17, 5, 11], [ 2, 5, 8, 6, 3, 5], [ 7, 21, 12, 6, 22, 21]]) np.unique(ar125,axis=1) np.unique() 可以删除重复列 array([[ 6, 8, 9, 11, 16], [ 3, 6, 5, 8, 2], [ 8, 13, 9, 12, 16], [ 5, 17, 11, 13, 15], [ 3, 6, 5, 8, 2], [22, 6, 21, 12, 7]])
7.18 下午 绘图
7.18 下午 绘图
# xticks
yticks
set_xlabel
set_ylabel
legend
subplots
-
绘制第一幅图表
-
绘制第一幅图表
(1)figure函数,创建图表 (2)subplot函数,创建子图 (3)在多个图表中创建子图 (4)plot()函数,画函数图像 (5)sca()函数,选择子图 (6)在 一张表中画多个曲线 alpha 透明度 ---- fig = plt.figure(11,dpi=140,figsize=(8,6))# 定义一个画框 d1 = fig.add_subplot(2,2,1) d2 = fig.add_subplot(2,2,2) d3 = fig.add_subplot(2,2,3) d4 = fig.add_subplot(2,2,4) ---- 1.线图 d1.plot(np.random.randn(200),'bo--') 2.直方图 x bins 组数 renge 取值范围(确定值直方图的范围) stacken 垂直的 (array([ 8., 47., 70., 51., 20., 4.]), 频数 组上限 下限 array([-1.40946983, -0.51867731, 0.3721152 , 1.26290772, 2.15370023, 3.04449275, 3.93528526]), <a list of 6 Patch objects>) d2.hist(np.random.normal(1,size=200),bins=6,color='g') 3.散点图 参数: x,y (必须右两个参数) c 颜色 marker 标志 cmap 调试板 d3.scatter(np.random.rand(50),np.random.uniform(-1,1,50),c='m',marker='*') 4.饼图 统计分析最常用的图 startangle 角度 labels 名称 sharex sharey 共享 一行一列 asd,sdf=plt.subplots(1,1,sharex=True,sharey=True,) sdf 一次性 创建曾在画布 画框 自动转化曾在 两行两列 asd,sdf=plt.subplots(2,2,sharex=True,sharey=True) # 在一个画框里画多个线图 plt.legend(loc='upper center')
画图注解
画图注解
PANDAS 作图
subplots语法及操作
fig, ax = plt.subplots(nrows=1, ncols=1, sharex=False,
sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw):
创建一个figure和多个子图。
参数:
nrows,ncols:int类型,默认值为1,表示子图窗格数
sharex,sharey:bool或者{‘none’, ‘all’, ‘row’, ‘col’},默认值为False。控制x、y坐标轴的属性共享。当为True或者’all’表示在所有子图中共享坐标轴;False或者’none’表示每个子图的坐标轴是独立的;’row’表示每个子图行会共享坐标轴;’col’表示每个子图列会共享坐标轴。
squeeze:bool,默认值为True。
subplot_kw:dict。保存的是传给add_subplot()的参数
gridspec_kw:dict。
fig_kw:dict。
返回:
fig:matplotlib.figure.Figure对象,fig可以用于修改图片级别的属性。
ax:Axes对象或者Axes对象的数据。
figure语法及操作
figure语法及操作
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
d4.pie(np.arange(1,9))
5.图表的注释与标识
6.加载txt文件并绘图
-
np.intersectld(set1,set2) 选出交集
unionld(set1,set2) 全部 setdiffld(set1,set2) 插集 np.setxorld(set1,set2) 把两个set 独有的元素 并到一起
-
!type Desktop\yong344523.csv
读取继续把数据转化为数组:只适合数据性 csv表格 只是数据的读取(二维数组) 不适合中文和带右字符串的 In [72]: testarray_1=np.loadtxt('Desktop\yong344523.csv',delimiter=',') In [73]: testarray_1 testarray_1=np.loadtxt(skprows=‘跳过’ ,delimiter=','分隔符 f)
* 数组的组合 和分割
拼接纬度相同, 长度相同
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
array([[ 9, 19, 13, 8],
[ 6, 7, 6, 13],
[ 4, 6, 6, 12],
[10, 6, 6, 11]])
水平组合 np.hstack((set1,set2))
逐列按行 水平
np.concatenatc((set1,set2),axis=1)
Out[229]:
array([[ 0, 1, 2, 3, 9, 19, 13, 8],
[ 4, 5, 6, 7, 6, 7, 6, 13],
[ 8, 9, 10, 11, 4, 6, 6, 12],
[12, 13, 14, 15, 10, 6, 6, 11]])
-
垂直组合
np.vstack((set1,set2)) np.concatenatc((set1,set2),axis=0) 列数必须相同 一维数组的拼接垂直变成二维数字
-
#列组合
np.column_stack((a1,a2))
行组合
np.row_stack((set1,set2)) 行组合 可以实现一维对二维的拼接 以行 一维数组不能水平分隔
垂直分隔
切的必须可以 被整除 4
1Out[12]: [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
7.19 线性代数
7.19 数据的转换
数据类型表
Int8和uint8(有符号和无符号的8位整形,i1 和 u1);
Int16和uint16(同上,i2 和 u2)
Int32和uint32(同上,i4 和 u4)
Int64和uint64(同上,i8 和 u8)
Float16(半精度浮点数,f2)
Float32(单精度浮点数,f4)
Float64(双精度浮点数,f8)
Float128(扩展精度浮点数,f16)
Complex64(c8),Complex128(c16),
Complex256(c32)
Bool(?),object(O),string_(S),Unicode(U)
test_array_1=test_array.astype(np.float64)
test_array_1.dtype
dtype('float64')
aaaaa=np.array(['12','21','33'],dtype=np.string_)
7.19 数据清洗 平均值补值 成段补全插条法
通常 分析 字符串是无效的 只有数字有效
前提: 3% 里可以用平均值补值
5% 以上 造成数据不稳定右
np.nan nan
存储:格式注意
exle 里面 没用空值
csv 右空值
销售数据清洗
创建 0到18 的 二维数组 3 行 3 列
array_12=np.arange(18).reshape(2,3,3)
def get_repeated_label(array_1dim):
label_1dim=[]
#查最后一项的 前一项
for k in range(len(array_1dim)-1):
for i in range(k+1,len(array_1dim),1):
# 列表的前一项和 它后面的一项对比 如果一样把 一样值的索引添加到新的列表中
if array_1dim[k]==array_1dim[i]:
label_1dim.append(i)
# 以数组的形式展示出来
return np.unique(label_1dim) # 重复的索引列表
-----------------------------------------------------
def invalid(array_variable):
# 遍历 行和列
for i in range(np.shape(array_variable)[0]):
for j in range(np.shape(array_variable)[1]):
# 如果在 值上面的 值是 浮点型 或整数型 跳过
if type(array_variable[i,j])== float or type(array_variable[i,j])==int:
pass
else:
# 不是的话 则赋值为0
array_variable[i,j]=0
array_variable[np.where(np.isnan(array_variable.astype(np.float64)))]=0
return array_variable
------------------------------------
# 计算平均值 赋值 把空值 赋予 平均值
def fillup_mean_value(array_parameter):
for index_j in range(np.shape(array_parameter)[1]):
array_columns_nr=list(np.where(array_parameter==0)[1])
if index_j in array_columns_nr:
appearance_sum=array_columns_nr.count(index_j)
if appearance_sum>0:
mean_1=(array_parameter[:,index_j]).sum()/(np.shape(array_parameter)[0]-appearance_sum)
bollmatrix_1=array_parameter[:,index_j]==0
array_parameter[bollmatrix_1,index_j]=mean_1
return array_parameter
--------------------------------------------
# 删除重复项 np.delete(待删减的数组,obj整数的数组,)
def delete_rows(list_variable,array_variable):
i=0
list_variable.sort()
array_medium=array_variable
for j in list_variable:
if i==0:
array_medium=np.delete(array_medium,j,0)
else:
array_medium=np.delete(array_medium,j-i,0)
i=i+1
return array_medium
------------------------------------------------
delete_rows(get_repeated_label(Columns_1),Data_Deal_with)
索引
索引
python numpy.random详细解析
https://blog.csdn.net/vicdd/article/details/52667709
np.delete(待删减的数组,obj整数的数组,)
查数据 相同数据删除
pandas
ser1 = pd.Series([3,5,76],index=[‘s’,‘y’,‘x’],dtype=np.int32)
s 3
y 5
x 76
dtype: int32
Index([‘s’, ‘y’, ‘x’], dtype=‘object’)
Series
通过索引找值
ser1[0]
append 添加不能更新
updata 更新不能添加
ignore_index=ture 保证索引的唯一性
# 字典的主键 一定要转化 列索引名
table_sales={'Seller':sales1,'Sales':dict_1,'SalesQuantity':sales_}
framesample_1=pd.DataFrame(table_sales)
framesample_1
数据框 可以直接索引列 不能直接索引行
framesample_1['Seller']
索引行 .loc
framesample_1.loc['0']
T 转至
del framesample_1.T['Seller']
reindex 可以任意删除,添加,交换行列
reindex 可以任意删除,添加,交换行列
index=[‘行 索引名字’,‘行 索引名字’]
columns= =[‘列 索引名字’,‘列 索引名字’]
frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])
利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。
利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。
Drop函数应用到“DataFrame”
表名字.drop([‘行或列’],axis=0) axrs=0 表示行 1 表示列
补缺失索引
只有缺失索引 才能补值
向下 补
test_12=a.reindex(range(11),method='ffill')
向上补
test_12=a.reindex(range(10),method='bfill')
7.23
7.23
pandas Series 索引位相同才可以相加。(默认索引 没有空位置)
pandas add. 两个表的相加 fill_value补值
pandas add. 两个表的相加 fill_value补值
add1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['ein','zwei','drei'],columns=list('bde'))
解释:指定义索引 相加 索引必须一至 否则 不一致的索引想会出现None 空 值
不同情况用最合适的方法进行补值
add 相加 fill_value 可以进行补值
diframe=Q.add(Newframe,fill_value=0)
两个相加必须有一个非空值 两个 相加才能得到非空值
fill_value=100 把空值 补 100
add_1 = new.add(new_1,fill_value=100)
加减 + - 默认是行相减
nnp.abs(frame12) abs 绝对值
计数 np.nan 这数组中的数量
list_4 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,np.nan,1,1,np.nan])
list_5 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,1,1,1,1])
list_6 = pd.Series([1,1,np.nan,1,1,np.nan,1,np.nan,1,1,np.nan,1])
T_list =[list_4,list_5,list_6,]
null_1 = pd.Series(np.arange(11)*0)
for i in T_list:
null_1 = null_1.add(i,fill_value=0)
null_1
# 把计算好的 np.nan 统计出来
Out[28]: 0 3.0
1 3.0
2 0.0
3 3.0
4 3.0
5 0.0
6 3.0
7 2.0
8 2.0
9 3.0
10 2.0
11 2.0
dtype: float64
相减 np.subtract(ar12,ar22)
数组的每列
ar12
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
ar22
array([3, 2, 6])
np.subtract(ar12,ar22)
array([[-2, 0, -3],
[ 1, 3, 0],
[ 4, 6, 3]])
T 转值 相减
ar12.T
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
数据框 和 Series 二维数组和一维数组相减
数据框 和 Series 二维数组和一维数组相减
注意: 列索引 要保持一直
Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])
s1=pd.Series([2,2,1],index=['mon','tue','wen'])
mon 2
tue 2
wen 1
dtype: int64
: ”Frame1-s1
0 0 0
-1 -1 -1
-2 0 2
每一行都相减 这个二维数组
Frame1.sub(s2,axis=1)
asd (frame1) 绝对值
2、NumPy一元函数对ndarray中的数据执行元素级运算的函数
np.abs(x)、np.fabs(x) : 计算数组各元素的绝对值
np.sqrt(x) : 计算数组各元素的平方根
np.square(x) : 计算数组各元素的平方
np.log(x) 、np.log10(x)、np.log2(x) : 计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) 、np.floor(x) : 计算数组各元素的ceiling值或floor值
np.rint(x) : 计算数组各元素的四舍五入值
np.modf(x) : 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x)、 np.cosh(x)、np.sin(x)、 np.sinh(x)、np.tan(x) 、np.tanh(x) : 计算数组各元素的普通型和双曲型三角函数
np.exp(x) : 计算数组各元素的指数值
np.sign(x) : 计算数组各元素的符号值,1(+), 0, ‐1(‐)
sin cos 三角函数 公式
np.sin(np.abs(frame12))
apply applymap lambda 函数
apply applymap lambda 函数
数据框名字.apply(table_extrem) 作用在每一列上 返回值是一个具体的值 返回一个数据框
r1 7.0 5.0 6.0
r2 4.0 5.0 4.0
r3 6.0 6.0 8.0
r4 6.0 5.0 8.0
f = lambda x:x.max()-x.min()
frame13.apply(f)
每一列的最大值和最小值相减 逐行按列
frame13.apply(f,1) 逐列按行
c1 3.0
c2 1.0
c3 4.0
dtype: float64
applymap ????????????????????????/
用 apply 函数 求每一列的最大值 和最小值
直接框的话 会出现 多维 的嵌套列表
def table_extrem (x):
return pd.Series([x.min(),x.max()],index=['min','max'])
frame12.apply(table_extrem)
返回的结果 义个数据框
min 0 1 2
max 9 10 11
DataFrame 的格式化
frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
formatierung=lambda x:'%.2f' % x
frame11.applymap(formatierung)
c1 c2 c3 c4
r11.40 0.39 -0.90 -2.27
r20.54 -0.53 -0.36 0.40
r31.83 -0.91 -0.39 0.51
排序 和 排名
排序 和 排名
数字只有sort 函数一个
project_1.sort_index()
acending = Ture 升序 和降序
排名 不在是真正的数值 而是名次
Dataffdic=pd.DataFrame({'liu':[-1,0,2,-3],'wang':[3,2,-5,7],'jiang':[1,0,1,5]})
按 liu 进行进行排序
Dataffdic.sort_values('liu',0)
describe() 有效值查询
排名 :
名字.rank(acending = False)
acending = False 最大的数组 数字最小
默认出 最大的数组 数字最大
dataFrame_1=pd.DataFrame([range(4),[np.nan,2,3.6,0.9],[1.2,4,6,7],[3.4,7.9,0.4,8]],index=['r1','r2','r3','r4'],columns=['c1','c2','c3','c4']
dataFrame_1.idxmin() 返回每一行的 最小值
c1 r1
c2 r1
c3 r4
c4 r2
dtype: object
按列累计加,遇到NaN值自动忽略,不参与运算。
dataFrame_1.cumsum()
c1 c2 c3 c4
r1 0.0 1.0 2.0 3.0
r2 NaN 3.0 5.6 3.9
r3 1.2 7.0 11.6 10.9
r4 4.6 14.9 12.0 18.9
dataFrame_1.cumsum(1) #行里的每一个值进行相加 累加
Out[10]:
c1 c2 c3 c4
r1 0.0 1.0 3.0 6.0
r2 NaN 2.0 5.6 6.5
r3 1.2 5.2 11.2 18.2
r4 3.4 11.3 11.7 19.7
describe() 有效值查询
Out[12]:
c1 c2 c3 c4
count 3.000000 4.000 4.000000 4.00000
mean 1.533333 3.725 3.000000 4.72500
std 1.724336 3.050 2.388863 3.34203
min 0.000000 1.000 0.400000 0.90000
25% 0.600000 1.750 1.600000 2.47500
50% 1.200000 3.000 2.800000 5.00000
75% 2.300000 4.975 4.200000 7.25000
max 3.400000 7.900 6.000000 8.00000
count() 统计
list1 = [1,2,3,4,5,3,None,None]
list1.count(None)
2统计y
dataFrame_1.count() 有效值 字符串也算
随机漫步
import matplotlib.pylab as plt
table_1=plt.figure()
# 创建一个画框
ax=table_1.add_subplot(1,1,1)
# 累计加
ax.plot(np.random.randn(100000).cumsum())
ax.plot(np.random.randn(100000).cumsum())
# 给x轴 赋予刻度
ticks_1=ax.set_xticks([0,25000,50000,75000,100000])
# 给 刻度设置标标签 斜度 字体大小
scale_name=ax.set_xticklabels(['step1','step2','step3','step4','step5'],rotation=45,fontsize=12)
# title 名字
ax.set_title('Python-03 Practice')
# x轴的名字
ax.set_xlabel('Steps')
#下面我们添加图例
ax.plot(np.random.randn(100000).cumsum(),color='m',linestyle='-',label='solid')
ax.plot(np.random.randn(100000).cumsum(),color='c',linestyle=':',label='dotted')
# 显示 线的名字
ax.legend(loc='best')#plt.legend也是可以的
plt.show()
画图注解
fig,subpic=plt.subplots(1,1)
subpic.plot([2,77,90,2.3,4,5,6,45,34,67,35,66,34,23,76],[34,32,35,43,34,23,45,56,44,57,56,33,55,66,54],'b*-')
ticks_1=subpic.set_xticks([0,25,50,75,100])
scale_name=subpic.set_xticklabels(['jenuary','february','march','april','may'],rotation=40,fontsize=12)
subpic.set_title('Python-03 Practice_1',fontsize=16)
subpic.set_xlabel('Weight')
# 添加坐标备注
subpic.text(90,35,'key point one',fontsize=10)
# 批量添加坐标备注
keymenge=[(67,57,'key point two'),(23,66,'key point two')]
for x,y,label in keymenge:
subpic.text(x,y,label,fontsize=12)
# 设置 x 轴区间 0-100
subpic.set_xlim([0,100])
# 设置 x 轴区间 0-100
subpic.set_ylim([0,100])
# xy 表示坐标 xytext 表示备注坐标点
subpic.annotate('beautyful point',xy=(5,23),xytext=(5,23))
# 把画出的图片存储 注意:要找show 之前完成
plt.savefig('Desktop\python_01.svg')
# 设在图片 清晰 ,bbox_inches='tight' 框和画布之间的间距
plt.savefig('Desktop\python_01.png',dpi=400,bbox_inches='tight')
plt.show()
##Savefig的主要参数如下: 图片的存储
fname: 表示绝对或者相对文件路径的字符串,文件具体格式由后缀来决定,譬如.pdf,.png格式等。
dpi: 图像分辨率,默认100,(每英寸点数)
Facecolor,edgecolor: 背景色,默认为“w”白色
Format: 显示设置文件格式,png,jpeg,pdf等等,但不要与fname里的文件格式发生冲突。
PANDAS 作图
PANDAS 作图
sdf,hgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
# ax 指明画框 画到那个画框里 ues_index=Ture(用索引作为刻度坐标)
# grid=Ture (网格线 ) rot (旋转) liabel (b图例)
第一种表示ser.plot(ax=hgh,grid=True)
第二种表示ser.plot(ax=hgh,grid=True,legend=True,label='ser')
Series.plot 方法的常用参数汇总:
label 用于设置图例的标签
ax
确定要被绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot
style 设置传给matplotlib的风格字符串('g*--')
alpha 图表的填充不透明度(数值为0到1之间的数)
kind 各种图形样式line, bar, barh, kde, density, scatter
logy 在Y轴上使用对数标尺
use_index 将对象(Series and DataFrame)的索引用作刻度标签
rot 旋转度数(0到360)
xticks 用作X轴刻度的值
yticks 用作y轴刻度的值
xlim x的值域
ylim y的值域
grid 设置是否显示轴网格线
专用于DataFrame的plot的参数
Subplots 将依据数据框中的每个列绘制的图分别放置到单个的subplot(子画框)里
sharex Subplots=true时,设定是否共享X的刻度和值域
sharey Subplots=true时,设定是否共享y的刻度和值域
figsize 元组,用来表示图像大小(宽,高)
title 设置图像标题
Legend 设定是否添加一个subplot图例
sort_columns 设定是否以字母表中字母先后排列顺序绘制各列。
柱状图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 画布 画框
figure_1,get_information_of_pict=plt.subplots(2,1) # 右2,1 右是1 只能出现义个矢量
datas=pd.Series(np.random.rand(20),index=list('qwertyuiopasdfghjklz'))
datas.plot(kind='barh',ax=get_information_of_pict[0],figsize=(8,12),color='g')
# kind='bar' 水平图
datas.plot(kind='bar',ax=get_information_of_pict[1],figsize=(8,12),color='r')
plt.show()
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
Framedata_1=pd.DataFrame(np.arange(16).reshape(4,4)**(1/2)+np.arange(16).reshape(4,4)*3+6,index=['spring','sommer','autumn','winter'],columns=['Benz','BMW','Porsche','VW'])
import matplotlib.pyplot as plt
# # 画布 画框
picrange,pic_inf=plt.subplots(2,1)
Framedata_1.plot(kind='bar',ax=pic_inf[0],title='2018年德系车销售额',rot=50,figsize=(8,12))
Framedata_1.plot(kind='barh',ax=pic_inf[1],title='2018年德系车销售额',rot=130,figsize=(8,12))
plt.show()
累计图 看增幅
算统计平面图
serie_1=pd.Series([3,4.5,5,3,6,9,4.7,4.7,4.7,4.7,4.5,4.5,6,6,3,7,7,7,7])
serie_1.value_counts().plot(kind='bar')
每个数出现的频率用柱状图表示出来
直方图:
asd,fgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
arrt = np.random.normal(0,size=500) # 数据
arrt_1=pd.Series(arrt) #转Series 格式
arrt_1.hist(ax=fgh,grid=True) # 画图
plt.show()
unique() 去重
7.24
series_3.value_counts() 频数计数
数组名字.value_counts() b
每个出现的次数
d 2
we 2
c 2
a 1
e 1
f 1产
dtype: int64
pd.value_counts() 必须是一维的数字 参数 cascending=True
series_3.values 变成一维数组
必须是一维的数字
返回的值对应 他的频数
# 对数据框的处理
isin() series_3.isin([‘a’])
0 False
1 False
2 False
3 True 这个索引值是a
4 False
5 False
6 False
7 False
8 False
dtype: bool
series_3[ss] 把对应 Ture 的值返回出来 一个对象
0 c
3 a
4 c
dtype: object
上两种 不适合在数据框里
np.column_stack()
有用
None 随机补值
可以使用随机数补值(不建议用,小方差用随机补值,大方差用差减法)
随机补值的话 在空值的附近找几个数据的值 进行范围内随机补值
平均数补值只适合小方差
平均数越小 说明数值越集中 补值越精确
ser_1 = pd.Series(np.random.rand(20))
ser_1[12] = None
ser_1[7] = None
# 使用随机进行补空值
有两个挡 1. 0-5
2. 数较大 1000以上 0-10 随机数
随机补值
ser_1.fillna(np.random.normal(0.42,size=1)[0])
循环补值
np.where(ser_1.isnull()) # 取出 数组里为None的索引
<!-- np.where(ser_1.isnull())[0][0] -->
(array([ 7, 12], dtype=int64),)
np.where(ser_1.isnull())[0]
array([ 7, 12], dtype=int64)
for i in np.where(ser_1.isnull())[0]:
# 在set_1列表里 最后 None的值 向上取两位 向下取两为
list1 = [ser_1[i-1],ser_1[i-2],ser_1[i+1],ser_1[i+2]]
# 进行给None 赋值
ser_1[i] = (max(list1)+min(list1))/2
NAN 的数据处理
fillna(9) 补值 只能补一个相同的值 局限型太大
# 属于瞎补 不建议 这样补值有问题
isnull 处理空值 补单值
数组名字.(数组名字.isnull()) = 0 # 快速补充
四种补值 方法
fillna()
数据框 平均值 补值
frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
t = frame_123.isnull()# 转边bool 矩阵
frame_123[t]=0
# 赋值 0
frame_123
frame_new=frame_123
frame_123[frame_123.isnull()]=0 #把Ture 赋值 0
# 把bool 矩阵
bool1 = frame_new[1]==0
#
frame_new[1][bool1]=frame_new[1].sum()/(len(frame_new[1])-(frame_new[1]).value_counts()[0])
fillna() 和 describe() 有效值 补平均值
frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
注解:frame_123.describe()
count 6.000000 5.000000 5.000000 3.000000 6.000000
mean 2.533333 3.840000 3.290000 3.166667 4.500000
# 拿出 这这一列 对每一项 进行补值
frame.fillna(frame_123.describe().loc['meam],axis=0)
字典进行 补值 和 上面方法一样
frame.fillna({ 0: 6.000000 ,1:5.000000 ,2:5.000000, 3:3.000000, 4:6.000000 },axis=0)
Dropna 十分重要 处理Nan 数据 特别有效 筛值
series_23=pd.Series([1,4,3,np.nan,4.5,None,3.4,4.5,6,np.nan,4,5,3])
series_23.dropna() # 把空值一次 全部过滤掉
frame_234.dropna(how='all') # 一行全部为空删掉
层次化索引
外层 索引
series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
内层 索引
8,7,6,5,4,3,2,1,0,12,11]])
series_1.index
MultiIndex(levels=[['p1', 'q1', 'r1', 's1', 't1'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]],
# 对应q2索引2*3 个 索引的 对应数字
labels=[[2, 2, 2, 4, 4, 3, 3, 3, 3, 0, 1, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10]])
外层索引 建议唯一性
也可以做切片。但是外层标签必须是
1.经过排序的,必须!
2.每个外层标签的第一个字母不能不一致,要大写,全大写,要小写全小写。
层次化索引
生成外基 np.outer(x,y)
纵数 频数 怎么算? value_counts() 深刻理解
7.25 层次化索引 数据的重建
层次化索引 要用嵌套列表
数据的重建是有条件的:对内层索引的个数在每一个外层索引下 的个数是一值的
不一致的话 只能做层次话索引
seriser 转 DataFrame
series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
内层 索引
8,7,6,5,4,3,2,1,0,12,11]])
#带有层次化索引的Series可以立马转化为数据框,反之,数据#框也可以转化为带有层次化索引的Series
# 转化为数据框 unstack() 拆分 unstack(0) unstack(1) 参数补同进行重组
名字.unstack(1,0) # 补0
还原 stack()
重建的数据框.stack(0) # 还原到 重组前的数组
嵌套 层次化索引
Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['A_Morning','A_Morning','A_Morning','B_Afternoon','B_Afternoon','B_Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])
层次化索引 命名 数据框
重要 name 命名
Gamendata.index.names= ['time','sequs']
Gamendata.列.names= ['time','sequs']
age Junior Youth
name Zhang Wang Li Zhao
time sequence
A_Morning 1 31 27 24 60
2 26 28 13 29
3 27 17 12 27
B_Afternoon 1 29 9 5 18
2 31 12 4 70
3 45 11 12 12
多重标签的顺序互换:
Gamedata.swaplevel('sequence','time')
Out[52]:
age Junior Youth
name Zhang Wang Li Zhao
sequence time
1 A_Morning 31 27 24 60
2 A_Morning 26 28 13 29
3 A_Morning 27 17 12 27
1 B_Afternoon 29 9 5 18
2 B_Afternoon 31 12 4 70
3 B_Afternoon 45 11 12 12
索引的排序
级别相加 251 页
Gamedata.sum(level='sequence')
每个级别包含两个元素,分别两两相加。
Gamedata.sum(level='time')
Out[71]:
age Junior Youth
name Zhang Wang Li Zhao
time
A_Morning 84 72 49 116
B_Afternoon 105 32 21 100
每个级别包含三个元素,分别相加即可
把数据框的列转化为行索引
面板 数据
Dataframe_3 = pd.Panel(np.random.randn(2,5,4),items=['Item1','Item2'],major_axis=pd.date_range('2000-01-01','2000-01-05'),minor_axis=['A','B','C','D'])
# 返回数据结构
Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D
处理数据
常用的把 cvs 转化 成为 数据框 DataFrome
用小青蛙 转化
缺失数据 要么没有 要么用标记值表示
数组的合拼 柱状未完成
ser_1=np.random.normal(0,1,200)
ser_2=np.random.normal(16,1,200)
# 两个数组的合拼
A=np.concatenate((ser_1,ser_2))
value = pd.Series(A) # 变成一维数组
散布图 column_stack 把一维数组一列一列的 排列起来
X5=np.random.beta(2,1,1001)
test_data=np.column_stack((np.column_stack((np.column_stack((np.column_stack((X1,X2)),X3)),X4)),X5))
画图的复杂的分隔
def subpicnr_invisible(fig):
for i, ax in enumerate(fig.axes): #利用list(enumerate(plt.gcf().axes))枚举函数生成元组列表[(画框编号,画框对象)(),...]
ax.text(0.5, 0.5, "ax%d" % (i+1))
#3D 绘制立体图
曲面图: 442页
to_csv 数据下载
DataFrame_2.to_csv (‘Desktop\DataFrame_3.csv’)
空值标识
DataFrame_2.to_csv(‘Desktop\DataFrame_4.csv’,na_rep=‘Cat’)
!type Desktop\DataFrame_4.csv
注:
1.Read_csv可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为逗号。
2.Read_table可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为制表符‘\t’。这一点与read_csv不同,烦请再加载有逗号的数据时用seq属性注明,也即seq=‘,’!
3.Read_fwf读取(或称加载)没有分隔符数据,但是各数据之间间距要恒定。
4.Read_clipboard 通常用来读取网络数据,在使用前,必须把网页内容先复制到粘贴板上,例如:
pd.read_clipboard(sep=’\s+’) 读取内存里的数据显示出来
Out[73]:
北 京 220956 209468 11488 697.02 264.30 253555 44087 701.42
0 天 津 93162 90080 3082 330.68 126.98 106063 15983 340.10
1 河 北 209740 200012 9728 963.39 327.27 262396 62384 982.31
2 山 西 131802 114466 17336 628.55 192.27 214625 100159 669.39
3 内蒙古 71196 65627 5569 306.82 110.15 101829 36202 308.10
4 NaN
5 辽 宁 211502 199611 11891 838.09 305.58 268741 69130 846.25
上面函数常用关键字列表
filepath_or_buffer: 文件系统位置,url,文件型对象的字符串
delimiter或sep 源文件各数据间分隔符或正则表达式
header 上载数据成数据框时,数据框的列名,默认为上载数据的第一行。即‘0’行。如果不需要列标签,那么使header=None
index_col 就是给行层次化索引命名,行层次索引一般有两列,内列和外列。
skiprows 需要忽略的行数,跳过无用行
na_values 实质就是把源数据中的指定字符串转化为空值。
converters 由列名或者说列号或者说列标签和函数组成字典,例如{‘A’:f}说明f函数应用到’A’列中的每一个数据。
nrows 需要读取的数据行数
skip_footer 需要忽略的行数,注意从源数据最后一行向上数
encoding 用于指明unicode文本文件的文本编码格式
Squeeze 如果数据仅有一列,自动返回seri es
thousands 千分位分隔符,如’.’或’,’
import math 通过landba 函数 计算
converters_1={i: lambda x:float(x)**3+math.sin((np.pi/6)*float(x)) for i in range(3)}
计算
pd.read_csv('Desktop\dong123.csv',delimiter=',',usecols=['A','B','C'],converters=converters_1)
pandas 替换
df.ix[df['sex']=='f','sex']=0
df.ix[df['sex']=='m','sex']=1
设置索引列
df_inner.set_index('id')
按照特定列的值排序: df_inner.sort_values(by=['age'])
按照索引列排序:df_inner.sort_index()
如果prince列的值>3000,group列显示high,否则显示low:
f_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
对复合多个条件的数据进行分组标记
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))
五、数据提取
主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。
1、按索引提取单行的数值
df_inner.loc[3]
1
2、按索引提取区域行数值
df_inner.iloc[0:5]
1
3、重设索引
df_inner.reset_index()
1
4、设置日期为索引
df_inner=df_inner.set_index('date')
1
5、提取4日之前的所有数据
df_inner[:'2013-01-04']
1
6、使用iloc按位置区域提取数据
df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。
1
7、适应iloc按位置单独提起数据
df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
1
8、使用ix按索引标签和位置混合提取数据
df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据
1
9、判断city列的值是否为北京
df_inner['city'].isin(['beijing'])
1
10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来
df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])]
1
11、提取前三个字符,并生成数据表
pd.DataFrame(category.str[:3])
1
六、数据筛选
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
1、使用“与”进行筛选
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
1
2、使用“或”进行筛选
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age'])
1
3、使用“非”条件进行筛选
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id'])
1
4、对筛选后的数据按city列进行计数
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
1
5、使用query函数进行筛选
df_inner.query('city == ["beijing", "shanghai"]')
1
6、对筛选后的结果按prince进行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
1
七、数据汇总
主要函数是groupby和pivote_table
1、对所有的列进行计数汇总
df_inner.groupby('city').count()
1
2、按城市对id字段进行计数
df_inner.groupby('city')['id'].count()
1
3、对两个字段进行汇总计数
df_inner.groupby(['city','size'])['id'].count()
1
4、对city字段进行汇总,并分别计算prince的合计和均值
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])
1
八、数据统计
数据采样,计算标准差,协方差和相关系数
1、简单的数据采样
df_inner.sample(n=3)
1
2、手动设置采样权重
weights = [0, 0, 0, 0, 0.5, 0.5]
df_inner.sample(n=2, weights=weights)
1
2
3、采样后不放回
df_inner.sample(n=6, replace=False)
1
4、采样后放回
df_inner.sample(n=6, replace=True)
1
5、 数据表描述性统计
df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
1
6、计算列的标准差
df_inner['price'].std()
1
7、计算两个字段间的协方差
df_inner['price'].cov(df_inner['m-point'])
1
8、数据表中所有字段间的协方差
df_inner.cov()
1
9、两个字段的相关性分析
df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
1
10、数据表的相关性分析
df_inner.corr()
pd.set_option(“display.max_row”,2000) 显示2000行
pandas 给指定索引的 某列赋值 :
data_S.loc[data_S.index==索引,改变值的列] = 赋值
data_S.loc[data_S.index==n,"Case Id"] = list_all[m]
删除重复的行:
data_xls = data_xls.drop_duplicates(subset=['Start Time', 'End Time', 'Duration'],keep='first')
pandas 两表合并 :
按字段合并:
datafame = marge(表1,表2,on=[列名1,列名2],how=以那边表为坐标)
pandas 多表合并、
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
参数axis=0表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引
需求:pandas groupby 分组之后取 每个数据的值,写到不同的sheet中:
data = pd.read_excel(excel_path)
writer = pd.ExceWriter(res_file)
groupby_df = data.groupby([列])
for i in groupby_by:
i[1].to_excel(writer,index=false,sheet_name=i[0])
writer.save()
需求 保持原表sheet2不变,替换sheet1中的数据
import pandas as pd
import openpyxl
import xlwings as xw
# 首先这excel 中删除sheet1
File = "路径:"
wb = openpyxl.load_woekbook(File)
ws = wb["sheet1"]
wb.remove(ws)
wb.save(File)
# 创建dataframe数据
data = pd.DataFrame({"id":[1,2,3,4,5]})
#写入数据
book = openpyxl.load_workbook(File)
writer = pd.ExceWriter(File,engine="openpyxl") # 参数代表报留原有数据格式
# 测试writer 里还只是读写器,然后将上面读取的book复制给writer
writer.book = book
writer.sheets = dict((ws.title,ws) for ws in book.worksheets)
data.to_excel(writer,sheet_name="sheet1",index=False)
writer.save()
xlrd 读取 使用
读取 xlsx 信息
book = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\example.xlsx')
# 读取sheet
table = book.sheet_by_index(0)
rec_data_list = []
# print(table.nrows,"----",'\n') #获取该sheet中的有效行数
# print(table.row(1),"----",'\n') #返回由该行中所有的单元格对象组成的列表
for i in range(table.nrows):
print(table.row_values(i),"----",'\n')
# 读取每一行的values 详情信息 ['Food', '2013-01-16', 300.0, ''] 列表形式
rec_data = [{'仪表': table.row_values(i)[0], '测项': table.row_values(i)[1] }]
rec_data_list.append(rec_data)
xlsxwriter 写入
# 创建 xlsx 文件
workbook = xlsxwriter.Workbook(r'C:\Users\Administrator\Desktop\example1.xlsx')
# 字体
bold_format = workbook.add_format({'bold': True})
# sheel 命名
worksheet_nsiot = workbook.add_worksheet("haha")
# 命名列名
worksheet_nsiot.write('A1', '仪表', bold_format)
worksheet_nsiot.write('B1', '测项', bold_format)
worksheet_nsiot.write('C1', '芯片', bold_format)
worksheet_nsiot.write('D1', 'Case Id', bold_format)
# 写入行列
row = 1
col = 0
for rec_data in rec_data_list:
item = rec_data[0]
# 重写入第1行,第0列开始,因为第0行是列名
worksheet_nsiot.write_string(row, col, item['仪表'])
worksheet_nsiot.write_string(row, col + 1, str(item['测项']))
worksheet_nsiot.write_string(row, col + 2, str(item['芯片']))
worksheet_nsiot.write_string(row, col + 3, str(item['Case Id']))
显示第几行第几列的数据
print(table.cell_value(1,1))
# 设置第一行类名的格式 和 背景颜色
bold_format = workbook.add_format({
‘bold’: True,
‘border’: 1,
‘fg_color’: ‘#B8B8B8’,
})
7.18
-
4p理论
-
5w2h 理论PEST方法
5W2H方法
逻辑树方法
4P营销理论方法用户行为理论方法
7.19
-
某些学者认为,数据分析分为三类,
入门级的描述性数据分析,
其方法主要有对比、平均、交叉分析法。
高级的探索、和验证数据分析, -
分析方法有主要有
相关分析,
回归分析,
因子分析。
这样的提法有它自己的道理。在我看来,
实际上就两类:描述性统计分析和计算性数据分析。 -
几个常见的容易搞混淆统计术语
-
离散统计学 ,
频数等于 是一个数出现的次数
个体频数/所有频频的和 等于 频率比例:部分对整体
比率:部分对部分倍数:表示A的总数翻一番,现在A的总数是原来的2倍。
番数:2的幂数
番数: 表示A的总数翻两番,现在A的总数是原来的4倍对比:这个产品的销售额与上一年相比,同比增长40%;
环比:这个商品的销售额与上个月相比,环比增长30%。
-
漏斗图分析法:
漏斗图
占位数=(第一环节人数-当前环节人数)/2
环节转化率 = 第一环节/第二个环节 为 40%
总体转化率=累积环节转化率=第一行环节转化率*…*当前环节转化率
2 numpy
- import numpy as np
丈量
np.arange(1,1000)
1.出现一个大数组
批量化的计算
ar_2 = np.arange(1,1000)
2.dtype 置换数据类型 dtype=np.32 向下取整
ar_125=np.array([1,2.4,3,4.],dtype=np.32)
array([1, 2, 3, 4])
1. 创建 数组 一定要用 object dtype = object
可以真正的把表格 读取到我们的编辑器中
-
多维数字
shape 函数
2,3,3
2个 行 列
确定 外形 -
索引
单位矩阵 笛卡尔基底系统
7.16
7.16
import numpy as np
r_dim = np.arange(0,16).reshape(4,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
---生成一个矩阵
ar3_dim = np.random.randint(2,10,size=(4,4))
ar3_dim
Out[6]:
array([[6, 3, 5, 9],
[8, 3, 7, 2],
[8, 2, 3, 2],
[7, 5, 2, 5]])
ar_dim + ar3_dim
Out[7]:
array([[ 6, 4, 7, 12],
[12, 8, 13, 9],
[16, 11, 13, 13],
[19, 18, 16, 20]])
把-4,4 分成1000份
ar2_dim =np.linspace(-4,4,1000)
ar1_dim = np.random.normal(size=(4,4))
ar1_dim
Out[49]:
array([[ 2.23592643, -0.56739328, -0.37532249, 0.37043396],
[-0.0815659 , 0.69841392, -1.06545111, -0.97716546],
[-1.51375169, -0.57465094, 0.97199617, -0.2471151 ],
[ 1.3618376 , 0.84458397, -1.76120145, 0.29179346]])
np.sign(ar1_dim)
Out[50]:
array([[ 1., -1., -1., 1.],
[-1., 1., -1., -1.],
[-1., -1., 1., -1.],
[ 1., 1., -1., 1.]])
画布三部
import matplotlib.pyplot as plt ; asd,fgh = plt.subplots(1,1,bpi=140,figsize(8,6))
7.17
7.17
三个函数
-
random.shuffle(aer)
aer shuffle 可以随机打打乱一维数字 二位数组不能随机打乱 -
lambda 表达
map() 函数 可以处理一维数组
import math
map(lambda x:x2+math.sin(x),[2,3,4,5,6]) 返回一个对象
list(map(lambda x:x2+math.sin(x),[2,3,4,5,6])) 返回一个列表
list(map(lambda x:’%.2f’%x,np.random.normal(size=10)))
[’-0.37’,
‘-0.65’,
‘-1.05’,
‘0.11’,
‘0.43’,
‘-0.50’,
‘-0.40’,
‘0.88’,
‘-1.28’,
‘-2.01’]reduce()函数
from functools import reduce
自动相加 乘 除 运算
reduce(lambda x,y:(x+y),[1,2,3,4,5])
下午
-
数据筛选
-
基本的数学统计方法 方差和标准差 (简单的离散型)
离散:有限的集合数据 有限的数据的一定是离散的{1.1,1.2,1.3} 无限的可以数的集合 无限的 但不能可数来描述它 不可以一对多 看多对一 例子:1到2 的小数。 总体方差公式, 样本方差公式,
标准方差
-
sun()函数 ------- np.sum()
0行1列 逐行案列 ,逐列按行 artty = np.arange(25).reshape(5,5) artty array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]) np.sum(artty,0) array([50, 55, 60, 65, 70]) np.sum(artty,1) array([ 10, 35, 60, 85, 110]) artty.sum(0) array([50, 55, 60, 65, 70])
-
np.mean()
np.mean()整个二维数组的平均值 np,mean(0)逐行案列求平均主 每一个行的平均值 np,mean(1)逐列案行求平均主 每一个列的平均值
-
min()
np.min(ar12,0) )逐行案列求平均主 每一个行的最小值 np.min(ar12,1) )逐列案行求 每一个列的最小值
-
argmin(ar12)
array([5, 6, 5, 3, 4]) 逐行案列操作 就是找到每一列左最小值的索引 argmin(ar12,1) 逐列案行操作 就是找到每一列左最小值的索引
-
分析 :argmin(ar12) ar12.ravel() 把二维数组 转化为一维数组 过滤最小值 ar12.ravel()==np.min(ar12) 返回义个bool np.where(ar12.ravel()==np.min(ar12)) 把二维数组 展开一维数字 最小值的搜引
-
cumsum(当前值加得 加后面的 值累计加) 全部的 ar12 Out[184]: array([[ 9, 13, 5, 11, 7], [12, 12, 15, 9, 7], [ 6, 15, 14, 12, 5], [ 5, 6, 13, 3, 13], [11, 8, 8, 5, 4]]) np.cumsum(ar12) Out[185]: array([ 9, 22, 27, 38, 45, 57, 69, 84, 93, 100, 106, 121, 135, 147, 152, 157, 163, 176, 179, 192, 203, 211, 219, 224, 228], dtype=int32
-
np.cumsum(ar12,1) 逐列按行 求出每一个行的累加值
-
np.cumproduct() (当前值乘得 加后面的 累计乘) 全部的 np.cumproduct(ar12) 逐行按列 np.cumproduct(ar12,1)
7.18
二维数组和一维数组相减 是按行相减的
数据的排序和整理
1: list1 = [2,4,5,6,7,3,2,5,78,8,5,3,4,6,4,7,4,7,4,21]
转集合 集合没右重复
list2 = set(list1)
转列表
list2 = list(list2)
排序
sorted(list2)
-
用soet 函数进行排序 sort 一次型 作为方法使用
-
用soet 函数进行排序 sort 一次型 作为方法使用
逐列按行 不破坏,打乱数据 ar123.sort(1) 括号里的不指定轴号,就以为轴号 默认为1 逐列按行 对行排序 ar123.sort(0) 括号里的不指定轴号,就以为轴号0 逐行按列 对行排序 ar123 = np.random.randint(1,100,(6,6)) Out[60]: array([[29, 77, 39, 81, 36, 29], [35, 36, 99, 80, 94, 57], [37, 52, 28, 36, 57, 88], [87, 86, 65, 72, 54, 24], [96, 42, 46, 52, 1, 44], [35, 29, 97, 74, 21, 7]]) ar123.sort(1) array([[ 1, 7, 28, 29, 29, 36], [21, 24, 35, 36, 39, 52], [29, 35, 36, 42, 46, 72], [37, 44, 52, 54, 65, 74], [57, 57, 77, 80, 87, 97], [81, 86, 88, 94, 96, 99]])
-
np.unique() 等于0可以删除重复行 等于u1 就是删除列
-
np.unique() 等于0可以删除重复行 等于u1 就是删除列
ar234 = np.random.randint(2,25,25) Out[84]: array([23, 7, 6, 21, 4, 15, 21, 9, 5, 8, 16, 10, 24, 2, 19, 12, 12, 18, 3, 23, 20, 24, 12, 5, 2]) np.unique(ar234) np.unique() 可以删除重复行 按行清除 ar125[1] = ar125[4] array([[16, 22, 11, 8, 6, 9], [ 2, 18, 8, 6, 3, 5], [16, 2, 12, 13, 8, 9], [15, 22, 13, 17, 5, 11], [ 2, 18, 8, 6, 3, 5], [ 7, 7, 12, 6, 22, 21]]) np.unique(ar125,axis=0) 第一列 进行排序 升序 array([[ 2, 18, 8, 6, 3, 5], [ 7, 7, 12, 6, 22, 21], [15, 22, 13, 17, 5, 11], [16, 2, 12, 13, 8, 9], [16, 22, 11, 8, 6, 9]]) ---- ar125[:,1] = ar125[:,-1] Out[98]: array([[16, 9, 11, 8, 6, 9], [ 2, 5, 8, 6, 3, 5], [16, 9, 12, 13, 8, 9], [15, 11, 13, 17, 5, 11], [ 2, 5, 8, 6, 3, 5], [ 7, 21, 12, 6, 22, 21]]) np.unique(ar125,axis=1) np.unique() 可以删除重复列 array([[ 6, 8, 9, 11, 16], [ 3, 6, 5, 8, 2], [ 8, 13, 9, 12, 16], [ 5, 17, 11, 13, 15], [ 3, 6, 5, 8, 2], [22, 6, 21, 12, 7]])
7.18 下午 绘图
7.18 下午 绘图
# xticks
yticks
set_xlabel
set_ylabel
legend
subplots
-
绘制第一幅图表
-
绘制第一幅图表
(1)figure函数,创建图表 (2)subplot函数,创建子图 (3)在多个图表中创建子图 (4)plot()函数,画函数图像 (5)sca()函数,选择子图 (6)在 一张表中画多个曲线 alpha 透明度 ---- fig = plt.figure(11,dpi=140,figsize=(8,6))# 定义一个画框 d1 = fig.add_subplot(2,2,1) d2 = fig.add_subplot(2,2,2) d3 = fig.add_subplot(2,2,3) d4 = fig.add_subplot(2,2,4) ---- 1.线图 d1.plot(np.random.randn(200),'bo--') 2.直方图 x bins 组数 renge 取值范围(确定值直方图的范围) stacken 垂直的 (array([ 8., 47., 70., 51., 20., 4.]), 频数 组上限 下限 array([-1.40946983, -0.51867731, 0.3721152 , 1.26290772, 2.15370023, 3.04449275, 3.93528526]), <a list of 6 Patch objects>) d2.hist(np.random.normal(1,size=200),bins=6,color='g') 3.散点图 参数: x,y (必须右两个参数) c 颜色 marker 标志 cmap 调试板 d3.scatter(np.random.rand(50),np.random.uniform(-1,1,50),c='m',marker='*') 4.饼图 统计分析最常用的图 startangle 角度 labels 名称 sharex sharey 共享 一行一列 asd,sdf=plt.subplots(1,1,sharex=True,sharey=True,) sdf 一次性 创建曾在画布 画框 自动转化曾在 两行两列 asd,sdf=plt.subplots(2,2,sharex=True,sharey=True) # 在一个画框里画多个线图 plt.legend(loc='upper center')
画图注解
画图注解
PANDAS 作图
subplots语法及操作
fig, ax = plt.subplots(nrows=1, ncols=1, sharex=False,
sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw):
创建一个figure和多个子图。
参数:
nrows,ncols:int类型,默认值为1,表示子图窗格数
sharex,sharey:bool或者{‘none’, ‘all’, ‘row’, ‘col’},默认值为False。控制x、y坐标轴的属性共享。当为True或者’all’表示在所有子图中共享坐标轴;False或者’none’表示每个子图的坐标轴是独立的;’row’表示每个子图行会共享坐标轴;’col’表示每个子图列会共享坐标轴。
squeeze:bool,默认值为True。
subplot_kw:dict。保存的是传给add_subplot()的参数
gridspec_kw:dict。
fig_kw:dict。
返回:
fig:matplotlib.figure.Figure对象,fig可以用于修改图片级别的属性。
ax:Axes对象或者Axes对象的数据。
figure语法及操作
figure语法及操作
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
d4.pie(np.arange(1,9))
5.图表的注释与标识
6.加载txt文件并绘图
-
np.intersectld(set1,set2) 选出交集
unionld(set1,set2) 全部 setdiffld(set1,set2) 插集 np.setxorld(set1,set2) 把两个set 独有的元素 并到一起
-
!type Desktop\yong344523.csv
读取继续把数据转化为数组:只适合数据性 csv表格 只是数据的读取(二维数组) 不适合中文和带右字符串的 In [72]: testarray_1=np.loadtxt('Desktop\yong344523.csv',delimiter=',') In [73]: testarray_1 testarray_1=np.loadtxt(skprows=‘跳过’ ,delimiter=','分隔符 f)
* 数组的组合 和分割
拼接纬度相同, 长度相同
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
array([[ 9, 19, 13, 8],
[ 6, 7, 6, 13],
[ 4, 6, 6, 12],
[10, 6, 6, 11]])
水平组合 np.hstack((set1,set2))
逐列按行 水平
np.concatenatc((set1,set2),axis=1)
Out[229]:
array([[ 0, 1, 2, 3, 9, 19, 13, 8],
[ 4, 5, 6, 7, 6, 7, 6, 13],
[ 8, 9, 10, 11, 4, 6, 6, 12],
[12, 13, 14, 15, 10, 6, 6, 11]])
-
垂直组合
np.vstack((set1,set2)) np.concatenatc((set1,set2),axis=0) 列数必须相同 一维数组的拼接垂直变成二维数字
-
#列组合
np.column_stack((a1,a2))
行组合
np.row_stack((set1,set2)) 行组合 可以实现一维对二维的拼接 以行 一维数组不能水平分隔
垂直分隔
切的必须可以 被整除 4
1Out[12]: [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
7.19 线性代数
7.19 数据的转换
数据类型表
Int8和uint8(有符号和无符号的8位整形,i1 和 u1);
Int16和uint16(同上,i2 和 u2)
Int32和uint32(同上,i4 和 u4)
Int64和uint64(同上,i8 和 u8)
Float16(半精度浮点数,f2)
Float32(单精度浮点数,f4)
Float64(双精度浮点数,f8)
Float128(扩展精度浮点数,f16)
Complex64(c8),Complex128(c16),
Complex256(c32)
Bool(?),object(O),string_(S),Unicode(U)
test_array_1=test_array.astype(np.float64)
test_array_1.dtype
dtype('float64')
aaaaa=np.array(['12','21','33'],dtype=np.string_)
7.19 数据清洗 平均值补值 成段补全插条法
通常 分析 字符串是无效的 只有数字有效
前提: 3% 里可以用平均值补值
5% 以上 造成数据不稳定右
np.nan nan
存储:格式注意
exle 里面 没用空值
csv 右空值
销售数据清洗
创建 0到18 的 二维数组 3 行 3 列
array_12=np.arange(18).reshape(2,3,3)
def get_repeated_label(array_1dim):
label_1dim=[]
#查最后一项的 前一项
for k in range(len(array_1dim)-1):
for i in range(k+1,len(array_1dim),1):
# 列表的前一项和 它后面的一项对比 如果一样把 一样值的索引添加到新的列表中
if array_1dim[k]==array_1dim[i]:
label_1dim.append(i)
# 以数组的形式展示出来
return np.unique(label_1dim) # 重复的索引列表
-----------------------------------------------------
def invalid(array_variable):
# 遍历 行和列
for i in range(np.shape(array_variable)[0]):
for j in range(np.shape(array_variable)[1]):
# 如果在 值上面的 值是 浮点型 或整数型 跳过
if type(array_variable[i,j])== float or type(array_variable[i,j])==int:
pass
else:
# 不是的话 则赋值为0
array_variable[i,j]=0
array_variable[np.where(np.isnan(array_variable.astype(np.float64)))]=0
return array_variable
------------------------------------
# 计算平均值 赋值 把空值 赋予 平均值
def fillup_mean_value(array_parameter):
for index_j in range(np.shape(array_parameter)[1]):
array_columns_nr=list(np.where(array_parameter==0)[1])
if index_j in array_columns_nr:
appearance_sum=array_columns_nr.count(index_j)
if appearance_sum>0:
mean_1=(array_parameter[:,index_j]).sum()/(np.shape(array_parameter)[0]-appearance_sum)
bollmatrix_1=array_parameter[:,index_j]==0
array_parameter[bollmatrix_1,index_j]=mean_1
return array_parameter
--------------------------------------------
# 删除重复项 np.delete(待删减的数组,obj整数的数组,)
def delete_rows(list_variable,array_variable):
i=0
list_variable.sort()
array_medium=array_variable
for j in list_variable:
if i==0:
array_medium=np.delete(array_medium,j,0)
else:
array_medium=np.delete(array_medium,j-i,0)
i=i+1
return array_medium
------------------------------------------------
delete_rows(get_repeated_label(Columns_1),Data_Deal_with)
索引
索引
python numpy.random详细解析
https://blog.csdn.net/vicdd/article/details/52667709
np.delete(待删减的数组,obj整数的数组,)
查数据 相同数据删除
pandas
ser1 = pd.Series([3,5,76],index=[‘s’,‘y’,‘x’],dtype=np.int32)
s 3
y 5
x 76
dtype: int32
Index([‘s’, ‘y’, ‘x’], dtype=‘object’)
Series
通过索引找值
ser1[0]
append 添加不能更新
updata 更新不能添加
ignore_index=ture 保证索引的唯一性
# 字典的主键 一定要转化 列索引名
table_sales={'Seller':sales1,'Sales':dict_1,'SalesQuantity':sales_}
framesample_1=pd.DataFrame(table_sales)
framesample_1
数据框 可以直接索引列 不能直接索引行
framesample_1['Seller']
索引行 .loc
framesample_1.loc['0']
T 转至
del framesample_1.T['Seller']
reindex 可以任意删除,添加,交换行列
reindex 可以任意删除,添加,交换行列
index=[‘行 索引名字’,‘行 索引名字’]
columns= =[‘列 索引名字’,‘列 索引名字’]
frame_1=pd.DataFrame(np.arange(9).reshape(3,3),index=['row1','row2','row3'],columns=['one','two','three'])
利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。
利用ix函数修改数据框行索引与列,快捷整洁,节约时间。但是Ix已经几乎被启用,现在用loc函数。
Drop函数应用到“DataFrame”
表名字.drop([‘行或列’],axis=0) axrs=0 表示行 1 表示列
补缺失索引
只有缺失索引 才能补值
向下 补
test_12=a.reindex(range(11),method='ffill')
向上补
test_12=a.reindex(range(10),method='bfill')
7.23
7.23
pandas Series 索引位相同才可以相加。(默认索引 没有空位置)
pandas add. 两个表的相加 fill_value补值
pandas add. 两个表的相加 fill_value补值
add1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['ein','zwei','drei'],columns=list('bde'))
解释:指定义索引 相加 索引必须一至 否则 不一致的索引想会出现None 空 值
不同情况用最合适的方法进行补值
add 相加 fill_value 可以进行补值
diframe=Q.add(Newframe,fill_value=0)
两个相加必须有一个非空值 两个 相加才能得到非空值
fill_value=100 把空值 补 100
add_1 = new.add(new_1,fill_value=100)
加减 + - 默认是行相减
nnp.abs(frame12) abs 绝对值
计数 np.nan 这数组中的数量
list_4 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,np.nan,1,1,np.nan])
list_5 = pd.Series([1,1,np.nan,1,1,np.nan,1,1,1,1,1,1])
list_6 = pd.Series([1,1,np.nan,1,1,np.nan,1,np.nan,1,1,np.nan,1])
T_list =[list_4,list_5,list_6,]
null_1 = pd.Series(np.arange(11)*0)
for i in T_list:
null_1 = null_1.add(i,fill_value=0)
null_1
# 把计算好的 np.nan 统计出来
Out[28]: 0 3.0
1 3.0
2 0.0
3 3.0
4 3.0
5 0.0
6 3.0
7 2.0
8 2.0
9 3.0
10 2.0
11 2.0
dtype: float64
相减 np.subtract(ar12,ar22)
数组的每列
ar12
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
ar22
array([3, 2, 6])
np.subtract(ar12,ar22)
array([[-2, 0, -3],
[ 1, 3, 0],
[ 4, 6, 3]])
T 转值 相减
ar12.T
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
数据框 和 Series 二维数组和一维数组相减
数据框 和 Series 二维数组和一维数组相减
注意: 列索引 要保持一直
Frame1=pd.DataFrame([[2,2,1],[1,1,3],[0,2,3]],index=['Nr1','Nr2','Nr3'],columns=['mon','tue','wen'])
s1=pd.Series([2,2,1],index=['mon','tue','wen'])
mon 2
tue 2
wen 1
dtype: int64
: ”Frame1-s1
0 0 0
-1 -1 -1
-2 0 2
每一行都相减 这个二维数组
Frame1.sub(s2,axis=1)
asd (frame1) 绝对值
2、NumPy一元函数对ndarray中的数据执行元素级运算的函数
np.abs(x)、np.fabs(x) : 计算数组各元素的绝对值
np.sqrt(x) : 计算数组各元素的平方根
np.square(x) : 计算数组各元素的平方
np.log(x) 、np.log10(x)、np.log2(x) : 计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) 、np.floor(x) : 计算数组各元素的ceiling值或floor值
np.rint(x) : 计算数组各元素的四舍五入值
np.modf(x) : 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x)、 np.cosh(x)、np.sin(x)、 np.sinh(x)、np.tan(x) 、np.tanh(x) : 计算数组各元素的普通型和双曲型三角函数
np.exp(x) : 计算数组各元素的指数值
np.sign(x) : 计算数组各元素的符号值,1(+), 0, ‐1(‐)
sin cos 三角函数 公式
np.sin(np.abs(frame12))
apply applymap lambda 函数
apply applymap lambda 函数
数据框名字.apply(table_extrem) 作用在每一列上 返回值是一个具体的值 返回一个数据框
r1 7.0 5.0 6.0
r2 4.0 5.0 4.0
r3 6.0 6.0 8.0
r4 6.0 5.0 8.0
f = lambda x:x.max()-x.min()
frame13.apply(f)
每一列的最大值和最小值相减 逐行按列
frame13.apply(f,1) 逐列按行
c1 3.0
c2 1.0
c3 4.0
dtype: float64
applymap ????????????????????????/
用 apply 函数 求每一列的最大值 和最小值
直接框的话 会出现 多维 的嵌套列表
def table_extrem (x):
return pd.Series([x.min(),x.max()],index=['min','max'])
frame12.apply(table_extrem)
返回的结果 义个数据框
min 0 1 2
max 9 10 11
DataFrame 的格式化
frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
formatierung=lambda x:'%.2f' % x
frame11.applymap(formatierung)
c1 c2 c3 c4
r11.40 0.39 -0.90 -2.27
r20.54 -0.53 -0.36 0.40
r31.83 -0.91 -0.39 0.51
排序 和 排名
排序 和 排名
数字只有sort 函数一个
project_1.sort_index()
acending = Ture 升序 和降序
排名 不在是真正的数值 而是名次
Dataffdic=pd.DataFrame({'liu':[-1,0,2,-3],'wang':[3,2,-5,7],'jiang':[1,0,1,5]})
按 liu 进行进行排序
Dataffdic.sort_values('liu',0)
describe() 有效值查询
排名 :
名字.rank(acending = False)
acending = False 最大的数组 数字最小
默认出 最大的数组 数字最大
dataFrame_1=pd.DataFrame([range(4),[np.nan,2,3.6,0.9],[1.2,4,6,7],[3.4,7.9,0.4,8]],index=['r1','r2','r3','r4'],columns=['c1','c2','c3','c4']
dataFrame_1.idxmin() 返回每一行的 最小值
c1 r1
c2 r1
c3 r4
c4 r2
dtype: object
按列累计加,遇到NaN值自动忽略,不参与运算。
dataFrame_1.cumsum()
c1 c2 c3 c4
r1 0.0 1.0 2.0 3.0
r2 NaN 3.0 5.6 3.9
r3 1.2 7.0 11.6 10.9
r4 4.6 14.9 12.0 18.9
dataFrame_1.cumsum(1) #行里的每一个值进行相加 累加
Out[10]:
c1 c2 c3 c4
r1 0.0 1.0 3.0 6.0
r2 NaN 2.0 5.6 6.5
r3 1.2 5.2 11.2 18.2
r4 3.4 11.3 11.7 19.7
describe() 有效值查询
Out[12]:
c1 c2 c3 c4
count 3.000000 4.000 4.000000 4.00000
mean 1.533333 3.725 3.000000 4.72500
std 1.724336 3.050 2.388863 3.34203
min 0.000000 1.000 0.400000 0.90000
25% 0.600000 1.750 1.600000 2.47500
50% 1.200000 3.000 2.800000 5.00000
75% 2.300000 4.975 4.200000 7.25000
max 3.400000 7.900 6.000000 8.00000
count() 统计
list1 = [1,2,3,4,5,3,None,None]
list1.count(None)
2统计y
dataFrame_1.count() 有效值 字符串也算
随机漫步
import matplotlib.pylab as plt
table_1=plt.figure()
# 创建一个画框
ax=table_1.add_subplot(1,1,1)
# 累计加
ax.plot(np.random.randn(100000).cumsum())
ax.plot(np.random.randn(100000).cumsum())
# 给x轴 赋予刻度
ticks_1=ax.set_xticks([0,25000,50000,75000,100000])
# 给 刻度设置标标签 斜度 字体大小
scale_name=ax.set_xticklabels(['step1','step2','step3','step4','step5'],rotation=45,fontsize=12)
# title 名字
ax.set_title('Python-03 Practice')
# x轴的名字
ax.set_xlabel('Steps')
#下面我们添加图例
ax.plot(np.random.randn(100000).cumsum(),color='m',linestyle='-',label='solid')
ax.plot(np.random.randn(100000).cumsum(),color='c',linestyle=':',label='dotted')
# 显示 线的名字
ax.legend(loc='best')#plt.legend也是可以的
plt.show()
画图注解
fig,subpic=plt.subplots(1,1)
subpic.plot([2,77,90,2.3,4,5,6,45,34,67,35,66,34,23,76],[34,32,35,43,34,23,45,56,44,57,56,33,55,66,54],'b*-')
ticks_1=subpic.set_xticks([0,25,50,75,100])
scale_name=subpic.set_xticklabels(['jenuary','february','march','april','may'],rotation=40,fontsize=12)
subpic.set_title('Python-03 Practice_1',fontsize=16)
subpic.set_xlabel('Weight')
# 添加坐标备注
subpic.text(90,35,'key point one',fontsize=10)
# 批量添加坐标备注
keymenge=[(67,57,'key point two'),(23,66,'key point two')]
for x,y,label in keymenge:
subpic.text(x,y,label,fontsize=12)
# 设置 x 轴区间 0-100
subpic.set_xlim([0,100])
# 设置 x 轴区间 0-100
subpic.set_ylim([0,100])
# xy 表示坐标 xytext 表示备注坐标点
subpic.annotate('beautyful point',xy=(5,23),xytext=(5,23))
# 把画出的图片存储 注意:要找show 之前完成
plt.savefig('Desktop\python_01.svg')
# 设在图片 清晰 ,bbox_inches='tight' 框和画布之间的间距
plt.savefig('Desktop\python_01.png',dpi=400,bbox_inches='tight')
plt.show()
##Savefig的主要参数如下: 图片的存储
fname: 表示绝对或者相对文件路径的字符串,文件具体格式由后缀来决定,譬如.pdf,.png格式等。
dpi: 图像分辨率,默认100,(每英寸点数)
Facecolor,edgecolor: 背景色,默认为“w”白色
Format: 显示设置文件格式,png,jpeg,pdf等等,但不要与fname里的文件格式发生冲突。
PANDAS 作图
PANDAS 作图
sdf,hgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
# ax 指明画框 画到那个画框里 ues_index=Ture(用索引作为刻度坐标)
# grid=Ture (网格线 ) rot (旋转) liabel (b图例)
第一种表示ser.plot(ax=hgh,grid=True)
第二种表示ser.plot(ax=hgh,grid=True,legend=True,label='ser')
Series.plot 方法的常用参数汇总:
label 用于设置图例的标签
ax
确定要被绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot
style 设置传给matplotlib的风格字符串('g*--')
alpha 图表的填充不透明度(数值为0到1之间的数)
kind 各种图形样式line, bar, barh, kde, density, scatter
logy 在Y轴上使用对数标尺
use_index 将对象(Series and DataFrame)的索引用作刻度标签
rot 旋转度数(0到360)
xticks 用作X轴刻度的值
yticks 用作y轴刻度的值
xlim x的值域
ylim y的值域
grid 设置是否显示轴网格线
专用于DataFrame的plot的参数
Subplots 将依据数据框中的每个列绘制的图分别放置到单个的subplot(子画框)里
sharex Subplots=true时,设定是否共享X的刻度和值域
sharey Subplots=true时,设定是否共享y的刻度和值域
figsize 元组,用来表示图像大小(宽,高)
title 设置图像标题
Legend 设定是否添加一个subplot图例
sort_columns 设定是否以字母表中字母先后排列顺序绘制各列。
柱状图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 画布 画框
figure_1,get_information_of_pict=plt.subplots(2,1) # 右2,1 右是1 只能出现义个矢量
datas=pd.Series(np.random.rand(20),index=list('qwertyuiopasdfghjklz'))
datas.plot(kind='barh',ax=get_information_of_pict[0],figsize=(8,12),color='g')
# kind='bar' 水平图
datas.plot(kind='bar',ax=get_information_of_pict[1],figsize=(8,12),color='r')
plt.show()
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
Framedata_1=pd.DataFrame(np.arange(16).reshape(4,4)**(1/2)+np.arange(16).reshape(4,4)*3+6,index=['spring','sommer','autumn','winter'],columns=['Benz','BMW','Porsche','VW'])
import matplotlib.pyplot as plt
# # 画布 画框
picrange,pic_inf=plt.subplots(2,1)
Framedata_1.plot(kind='bar',ax=pic_inf[0],title='2018年德系车销售额',rot=50,figsize=(8,12))
Framedata_1.plot(kind='barh',ax=pic_inf[1],title='2018年德系车销售额',rot=130,figsize=(8,12))
plt.show()
累计图 看增幅
算统计平面图
serie_1=pd.Series([3,4.5,5,3,6,9,4.7,4.7,4.7,4.7,4.5,4.5,6,6,3,7,7,7,7])
serie_1.value_counts().plot(kind='bar')
每个数出现的频率用柱状图表示出来
直方图:
asd,fgh=plt.subplots(1,1,dpi=140,figsize=(8,6))
arrt = np.random.normal(0,size=500) # 数据
arrt_1=pd.Series(arrt) #转Series 格式
arrt_1.hist(ax=fgh,grid=True) # 画图
plt.show()
unique() 去重
7.24
series_3.value_counts() 频数计数
数组名字.value_counts() b
每个出现的次数
d 2
we 2
c 2
a 1
e 1
f 1产
dtype: int64
pd.value_counts() 必须是一维的数字 参数 cascending=True
series_3.values 变成一维数组
必须是一维的数字
返回的值对应 他的频数
# 对数据框的处理
isin() series_3.isin([‘a’])
0 False
1 False
2 False
3 True 这个索引值是a
4 False
5 False
6 False
7 False
8 False
dtype: bool
series_3[ss] 把对应 Ture 的值返回出来 一个对象
0 c
3 a
4 c
dtype: object
上两种 不适合在数据框里
np.column_stack()
有用
None 随机补值
可以使用随机数补值(不建议用,小方差用随机补值,大方差用差减法)
随机补值的话 在空值的附近找几个数据的值 进行范围内随机补值
平均数补值只适合小方差
平均数越小 说明数值越集中 补值越精确
ser_1 = pd.Series(np.random.rand(20))
ser_1[12] = None
ser_1[7] = None
# 使用随机进行补空值
有两个挡 1. 0-5
2. 数较大 1000以上 0-10 随机数
随机补值
ser_1.fillna(np.random.normal(0.42,size=1)[0])
循环补值
np.where(ser_1.isnull()) # 取出 数组里为None的索引
<!-- np.where(ser_1.isnull())[0][0] -->
(array([ 7, 12], dtype=int64),)
np.where(ser_1.isnull())[0]
array([ 7, 12], dtype=int64)
for i in np.where(ser_1.isnull())[0]:
# 在set_1列表里 最后 None的值 向上取两位 向下取两为
list1 = [ser_1[i-1],ser_1[i-2],ser_1[i+1],ser_1[i+2]]
# 进行给None 赋值
ser_1[i] = (max(list1)+min(list1))/2
NAN 的数据处理
fillna(9) 补值 只能补一个相同的值 局限型太大
# 属于瞎补 不建议 这样补值有问题
isnull 处理空值 补单值
数组名字.(数组名字.isnull()) = 0 # 快速补充
四种补值 方法
fillna()
数据框 平均值 补值
frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
t = frame_123.isnull()# 转边bool 矩阵
frame_123[t]=0
# 赋值 0
frame_123
frame_new=frame_123
frame_123[frame_123.isnull()]=0 #把Ture 赋值 0
# 把bool 矩阵
bool1 = frame_new[1]==0
#
frame_new[1][bool1]=frame_new[1].sum()/(len(frame_new[1])-(frame_new[1]).value_counts()[0])
fillna() 和 describe() 有效值 补平均值
frame_123=pd.DataFrame([[1,np.nan,np.nan,2,3],[1,2,3,None,8],[6,2.3,8,None,3],[2,3,2,3,2],[3.2,8.9,3,4.5,3],[2,3,0.45,None,8]])
注解:frame_123.describe()
count 6.000000 5.000000 5.000000 3.000000 6.000000
mean 2.533333 3.840000 3.290000 3.166667 4.500000
# 拿出 这这一列 对每一项 进行补值
frame.fillna(frame_123.describe().loc['meam],axis=0)
字典进行 补值 和 上面方法一样
frame.fillna({ 0: 6.000000 ,1:5.000000 ,2:5.000000, 3:3.000000, 4:6.000000 },axis=0)
Dropna 十分重要 处理Nan 数据 特别有效 筛值
series_23=pd.Series([1,4,3,np.nan,4.5,None,3.4,4.5,6,np.nan,4,5,3])
series_23.dropna() # 把空值一次 全部过滤掉
frame_234.dropna(how='all') # 一行全部为空删掉
层次化索引
外层 索引
series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
内层 索引
8,7,6,5,4,3,2,1,0,12,11]])
series_1.index
MultiIndex(levels=[['p1', 'q1', 'r1', 's1', 't1'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]],
# 对应q2索引2*3 个 索引的 对应数字
labels=[[2, 2, 2, 4, 4, 3, 3, 3, 3, 0, 1, 1], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10]])
外层索引 建议唯一性
也可以做切片。但是外层标签必须是
1.经过排序的,必须!
2.每个外层标签的第一个字母不能不一致,要大写,全大写,要小写全小写。
层次化索引
生成外基 np.outer(x,y)
纵数 频数 怎么算? value_counts() 深刻理解
7.25 层次化索引 数据的重建
层次化索引 要用嵌套列表
数据的重建是有条件的:对内层索引的个数在每一个外层索引下 的个数是一值的
不一致的话 只能做层次话索引
seriser 转 DataFrame
series_1=pd.Series(np.random.randn(12),index=[['r1','r1','r1','t1','t1','s1','s1','s1','s1','p1','q1','q1'],[9,
内层 索引
8,7,6,5,4,3,2,1,0,12,11]])
#带有层次化索引的Series可以立马转化为数据框,反之,数据#框也可以转化为带有层次化索引的Series
# 转化为数据框 unstack() 拆分 unstack(0) unstack(1) 参数补同进行重组
名字.unstack(1,0) # 补0
还原 stack()
重建的数据框.stack(0) # 还原到 重组前的数组
嵌套 层次化索引
Gamedata=pd.DataFrame(np.array([[31,27,24,60],[26,28,13,29],[27,17,12,27],[29,9,5,18],[31,12,4,70],[45,11,12,12]]),index=[['A_Morning','A_Morning','A_Morning','B_Afternoon','B_Afternoon','B_Afternoon'],[1,2,3,1,2,3]],columns=[['Junior','Junior','Youth','Youth'],['Zhang','Wang','Li','Zhao']])
层次化索引 命名 数据框
重要 name 命名
Gamendata.index.names= ['time','sequs']
Gamendata.列.names= ['time','sequs']
age Junior Youth
name Zhang Wang Li Zhao
time sequence
A_Morning 1 31 27 24 60
2 26 28 13 29
3 27 17 12 27
B_Afternoon 1 29 9 5 18
2 31 12 4 70
3 45 11 12 12
多重标签的顺序互换:
Gamedata.swaplevel('sequence','time')
Out[52]:
age Junior Youth
name Zhang Wang Li Zhao
sequence time
1 A_Morning 31 27 24 60
2 A_Morning 26 28 13 29
3 A_Morning 27 17 12 27
1 B_Afternoon 29 9 5 18
2 B_Afternoon 31 12 4 70
3 B_Afternoon 45 11 12 12
索引的排序
级别相加 251 页
Gamedata.sum(level='sequence')
每个级别包含两个元素,分别两两相加。
Gamedata.sum(level='time')
Out[71]:
age Junior Youth
name Zhang Wang Li Zhao
time
A_Morning 84 72 49 116
B_Afternoon 105 32 21 100
每个级别包含三个元素,分别相加即可
把数据框的列转化为行索引
面板 数据
Dataframe_3 = pd.Panel(np.random.randn(2,5,4),items=['Item1','Item2'],major_axis=pd.date_range('2000-01-01','2000-01-05'),minor_axis=['A','B','C','D'])
# 返回数据结构
Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D
处理数据
常用的把 cvs 转化 成为 数据框 DataFrome
用小青蛙 转化
缺失数据 要么没有 要么用标记值表示
数组的合拼 柱状未完成
ser_1=np.random.normal(0,1,200)
ser_2=np.random.normal(16,1,200)
# 两个数组的合拼
A=np.concatenate((ser_1,ser_2))
value = pd.Series(A) # 变成一维数组
散布图 column_stack 把一维数组一列一列的 排列起来
X5=np.random.beta(2,1,1001)
test_data=np.column_stack((np.column_stack((np.column_stack((np.column_stack((X1,X2)),X3)),X4)),X5))
画图的复杂的分隔
def subpicnr_invisible(fig):
for i, ax in enumerate(fig.axes): #利用list(enumerate(plt.gcf().axes))枚举函数生成元组列表[(画框编号,画框对象)(),...]
ax.text(0.5, 0.5, "ax%d" % (i+1))
#3D 绘制立体图
曲面图: 442页
to_csv 数据下载
DataFrame_2.to_csv (‘Desktop\DataFrame_3.csv’)
空值标识
DataFrame_2.to_csv(‘Desktop\DataFrame_4.csv’,na_rep=‘Cat’)
!type Desktop\DataFrame_4.csv
注:
1.Read_csv可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为逗号。
2.Read_table可以读取文件,url,文件型对象,但被加载文件必须有分割符,默认的分割符为制表符‘\t’。这一点与read_csv不同,烦请再加载有逗号的数据时用seq属性注明,也即seq=‘,’!
3.Read_fwf读取(或称加载)没有分隔符数据,但是各数据之间间距要恒定。
4.Read_clipboard 通常用来读取网络数据,在使用前,必须把网页内容先复制到粘贴板上,例如:
pd.read_clipboard(sep=’\s+’) 读取内存里的数据显示出来
Out[73]:
北 京 220956 209468 11488 697.02 264.30 253555 44087 701.42
0 天 津 93162 90080 3082 330.68 126.98 106063 15983 340.10
1 河 北 209740 200012 9728 963.39 327.27 262396 62384 982.31
2 山 西 131802 114466 17336 628.55 192.27 214625 100159 669.39
3 内蒙古 71196 65627 5569 306.82 110.15 101829 36202 308.10
4 NaN
5 辽 宁 211502 199611 11891 838.09 305.58 268741 69130 846.25
上面函数常用关键字列表
filepath_or_buffer: 文件系统位置,url,文件型对象的字符串
delimiter或sep 源文件各数据间分隔符或正则表达式
header 上载数据成数据框时,数据框的列名,默认为上载数据的第一行。即‘0’行。如果不需要列标签,那么使header=None
index_col 就是给行层次化索引命名,行层次索引一般有两列,内列和外列。
skiprows 需要忽略的行数,跳过无用行
na_values 实质就是把源数据中的指定字符串转化为空值。
converters 由列名或者说列号或者说列标签和函数组成字典,例如{‘A’:f}说明f函数应用到’A’列中的每一个数据。
nrows 需要读取的数据行数
skip_footer 需要忽略的行数,注意从源数据最后一行向上数
encoding 用于指明unicode文本文件的文本编码格式
Squeeze 如果数据仅有一列,自动返回seri es
thousands 千分位分隔符,如’.’或’,’
import math 通过landba 函数 计算
converters_1={i: lambda x:float(x)**3+math.sin((np.pi/6)*float(x)) for i in range(3)}
计算
pd.read_csv('Desktop\dong123.csv',delimiter=',',usecols=['A','B','C'],converters=converters_1)
pandas 替换
df.ix[df['sex']=='f','sex']=0
df.ix[df['sex']=='m','sex']=1
设置索引列
df_inner.set_index('id')
按照特定列的值排序: df_inner.sort_values(by=['age'])
按照索引列排序:df_inner.sort_index()
如果prince列的值>3000,group列显示high,否则显示low:
f_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
对复合多个条件的数据进行分组标记
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))
五、数据提取
主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。
1、按索引提取单行的数值
df_inner.loc[3]
1
2、按索引提取区域行数值
df_inner.iloc[0:5]
1
3、重设索引
df_inner.reset_index()
1
4、设置日期为索引
df_inner=df_inner.set_index('date')
1
5、提取4日之前的所有数据
df_inner[:'2013-01-04']
1
6、使用iloc按位置区域提取数据
df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。
1
7、适应iloc按位置单独提起数据
df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
1
8、使用ix按索引标签和位置混合提取数据
df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据
1
9、判断city列的值是否为北京
df_inner['city'].isin(['beijing'])
1
10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来
df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])]
1
11、提取前三个字符,并生成数据表
pd.DataFrame(category.str[:3])
1
六、数据筛选
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
1、使用“与”进行筛选
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
1
2、使用“或”进行筛选
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age'])
1
3、使用“非”条件进行筛选
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id'])
1
4、对筛选后的数据按city列进行计数
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
1
5、使用query函数进行筛选
df_inner.query('city == ["beijing", "shanghai"]')
1
6、对筛选后的结果按prince进行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
1
七、数据汇总
主要函数是groupby和pivote_table
1、对所有的列进行计数汇总
df_inner.groupby('city').count()
1
2、按城市对id字段进行计数
df_inner.groupby('city')['id'].count()
1
3、对两个字段进行汇总计数
df_inner.groupby(['city','size'])['id'].count()
1
4、对city字段进行汇总,并分别计算prince的合计和均值
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])
1
八、数据统计
数据采样,计算标准差,协方差和相关系数
1、简单的数据采样
df_inner.sample(n=3)
1
2、手动设置采样权重
weights = [0, 0, 0, 0, 0.5, 0.5]
df_inner.sample(n=2, weights=weights)
1
2
3、采样后不放回
df_inner.sample(n=6, replace=False)
1
4、采样后放回
df_inner.sample(n=6, replace=True)
1
5、 数据表描述性统计
df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
1
6、计算列的标准差
df_inner['price'].std()
1
7、计算两个字段间的协方差
df_inner['price'].cov(df_inner['m-point'])
1
8、数据表中所有字段间的协方差
df_inner.cov()
1
9、两个字段的相关性分析
df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
1
10、数据表的相关性分析
df_inner.corr()
pd.set_option(“display.max_row”,2000) 显示2000行
pandas 给指定索引的 某列赋值 :
data_S.loc[data_S.index==索引,改变值的列] = 赋值
data_S.loc[data_S.index==n,"Case Id"] = list_all[m]
删除重复的行:
data_xls = data_xls.drop_duplicates(subset=['Start Time', 'End Time', 'Duration'],keep='first')
pandas 两表合并 :
按字段合并:
datafame = marge(表1,表2,on=[列名1,列名2],how=以那边表为坐标)
pandas 多表合并、
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
参数axis=0表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引
需求:pandas groupby 分组之后取 每个数据的值,写到不同的sheet中:
data = pd.read_excel(excel_path)
writer = pd.ExceWriter(res_file)
groupby_df = data.groupby([列])
for i in groupby_by:
i[1].to_excel(writer,index=false,sheet_name=i[0])
writer.save()
需求 保持原表sheet2不变,替换sheet1中的数据
import pandas as pd
import openpyxl
import xlwings as xw
# 首先这excel 中删除sheet1
File = "路径:"
wb = openpyxl.load_woekbook(File)
ws = wb["sheet1"]
wb.remove(ws)
wb.save(File)
# 创建dataframe数据
data = pd.DataFrame({"id":[1,2,3,4,5]})
#写入数据
book = openpyxl.load_workbook(File)
writer = pd.ExceWriter(File,engine="openpyxl") # 参数代表报留原有数据格式
# 测试writer 里还只是读写器,然后将上面读取的book复制给writer
writer.book = book
writer.sheets = dict((ws.title,ws) for ws in book.worksheets)
data.to_excel(writer,sheet_name="sheet1",index=False)
writer.save()
xlrd 读取 使用
读取 xlsx 信息
book = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\example.xlsx')
# 读取sheet
table = book.sheet_by_index(0)
rec_data_list = []
# print(table.nrows,"----",'\n') #获取该sheet中的有效行数
# print(table.row(1),"----",'\n') #返回由该行中所有的单元格对象组成的列表
for i in range(table.nrows):
print(table.row_values(i),"----",'\n')
# 读取每一行的values 详情信息 ['Food', '2013-01-16', 300.0, ''] 列表形式
rec_data = [{'仪表': table.row_values(i)[0], '测项': table.row_values(i)[1] }]
rec_data_list.append(rec_data)
xlsxwriter 写入
# 创建 xlsx 文件
workbook = xlsxwriter.Workbook(r'C:\Users\Administrator\Desktop\example1.xlsx')
# 字体
bold_format = workbook.add_format({'bold': True})
# sheel 命名
worksheet_nsiot = workbook.add_worksheet("haha")
# 命名列名
worksheet_nsiot.write('A1', '仪表', bold_format)
worksheet_nsiot.write('B1', '测项', bold_format)
worksheet_nsiot.write('C1', '芯片', bold_format)
worksheet_nsiot.write('D1', 'Case Id', bold_format)
# 写入行列
row = 1
col = 0
for rec_data in rec_data_list:
item = rec_data[0]
# 重写入第1行,第0列开始,因为第0行是列名
worksheet_nsiot.write_string(row, col, item['仪表'])
worksheet_nsiot.write_string(row, col + 1, str(item['测项']))
worksheet_nsiot.write_string(row, col + 2, str(item['芯片']))
worksheet_nsiot.write_string(row, col + 3, str(item['Case Id']))
显示第几行第几列的数据
print(table.cell_value(1,1))
# 设置第一行类名的格式 和 背景颜色
bold_format = workbook.add_format({
‘bold’: True,
‘border’: 1,
‘fg_color’: ‘#B8B8B8’,
})
pandas 存入mysql
df.to_sql(name='wx1',con='mysql+mysqlconnector://root:123456@localhost:3306/wechat?charset=utf8',if_exists='replace',index=False)
pandas 分组统计 归类
1.格式变化 : reset_index()
data = pd.DataFrame({'id': [1, 1, 2, 2], 'time': [1, 1, 22, 222],'品牌': ['A', 'B', 'C', 'D']})
# 合并数据
data_new = data.groupby(['id','time'])['品牌'].apply(list).to_frame()
id time
1 1 [A, B]
2 22 [C]
222 [D]
data_new['品牌'] = data_new['品牌'].apply(lambda x: str(x).replace('[', '').replace(']', ''))
print(data.groupby(['id','time'])['品牌'].apply(list).reset_index())
id time 品牌
0 1 1 [A, B]
1 2 22 [C]
2 2 222 [D]
print(data.groupby(['id','time'])['品牌'].apply(list).reset_index())
data = pd.DataFrame({'id': ['t1', 't2'],'time': [1, 2 ],'品牌': ['A,B', 'C,D,E']})
id time 品牌
0 t1 1 A,B
1 t2 2 C,D,E
a = data.drop('品牌', axis=1).join(data['品牌'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('品牌'))
print(a)
id time 品牌
0 t1 1 A
0 t1 1 B
1 t2 2 C
1 t2 2 D
1 t2 2 E