? ? ? ? 以前的整理笔记,最近发文发上瘾了,这一起发了吧,主要包含numpy,matplotlib,pandas这三个python做数据分析的常用包的基础函数整理,内容可能有点糙和简单,但胜在拿着就能用。希望在工作中可以帮到老铁们O(∩_∩)O~~
Numpy数组array
创建数组 np.linspace(-3,3,50).reshape(1,-1)产生一组从-3到3的50个均匀分布的二维数组 np.random.uniform(-3,3,(50,1))产生随机数组 np.arange(0,50,1) 运算 &and,|or,~取反 算术运算:+ - * / // % ** 关系运算:> < >= <= == != 逻辑运算:np.all()所有的符合条件返回True,np.any()一个符合条件返回True arr.sum()arr.argmax()arr.argmin(),np.cumsum(arr)累计和np.cumprod(arr)累计积 np内置函数 np.exp(x)e的x次方 np.std()标准差 np.mean()均值 np.var()方差 变形 重新定义形状:arr.reshape(4,5)转化形状有返回值 数组将维:arr.ravel(order=‘C’)将多维数组降为一维数组,有返回值 np.reshape(data, (2,4)) 属性 ndim维度信息 shape形状 size总元素个数 dtype元素数据类型 itemsize元素字节数 astype(np.float64) 合并 np.hstack(arr1,arr2)水平合并 np.vstack(arr1,arr2)垂直合并 np.concatenate((arr1,arr2),axis=0)上下合并0,左右合并1 排序 arr.sort()直接排序 np.argsort(arr)排序后返回数据下标 去重和重复 np.tile(arr(2,2))以整个数组进行重复 np.repeat(arr,2,axis=0)以单个元素重复,axis=0行重复 np.unique(arr, axis=1)0行,1列 读取和保存文本文件 np.load(“name.npz”)读取npz和npy文件 np.loadtxt(“name.txt”, delimiter=’ ‘, dtype=int)读取txt文件 np.savetxt(“name.txt”, arr1, fmt=’%d’, delimiter=" ")保存txt文件 np.save(“arr1”, arr1) 将数据保存到npy文件中 np.savez(“arr2”, table1=arr1, table2=arr2)保存到npz
pyplot画图
折线图plot color=‘r’线颜色 linestyle=’:’, # 线风格 linewidth=1.2, # 线宽度 marker=’*’, # 点样式 markersize=10, # 点大小 markerfacecolor=‘b’, # 点内部颜色 markeredgecolor=‘r’, # 点边缘颜色 alpha=0.5, # 透明度 离散图scatter 柱状图bar width=0.5柱子宽度 color='red’颜色 左右柱状图plt.bar(x_data - width / 2, y_data, width=width) plt.bar(x_data + width / 2, y_data2, width=width) 堆叠柱状图plt.bar(x_data, y_data, width=0.4) plt.bar(x_data, y_data2, bottom=y_data, width=0.4) 直方图hist bins=10划分几个区间 edgecolor='w’柱子边缘颜色 增加网格线plt.grid(b=True,axis=‘y’,alpha=0.3)b是否增加网格线axis基于哪个轴添加 箱线图boxplot notch是否凹陷显示 饼图pie autopct="%.2f%%", # 显示百分比 pctdistance=0.8, # 百分比显示信息 距离圆心的百分比 labels=data_name, # 各百分比名字 explode=[0.01, 0.02, 0.03], # 离心半径; 距离圆心半径 colors=[“r”, “g”, “b”], # 每个百分比数据颜色 labeldistance=1.1, # labels距离圆心的距离 shadow=True # 是否有阴影 雷达图polar 子图 创建画布fig=plt.figure() 调整每个画布大小fig.subplots_adjust(wspace=0.5, hspace=0.5) 激活子图fig.add_subplot(2,2,1) 设置画布宽高fig = plt.figure(figsize=(6, 12)) 基本操作 plt.xticks(x_data,x_name)x_data,x轴刻度,x_name,x轴名字 plt.xlabel(“X_Ⅲ”)x轴名字 plt.title(“Ⅳ型数据”)图形题目 添加汉字 plt.rcParams[“font.sans-serif”] = “SimHei” plt.rcParams[“axes.unicode_minus”] = False for x, y in enumerate(y_data): # 为每个数据添加字体说明 plt.text(x, y+0.5, “%d” % y, horizontalalignment=“center”, verticalalignment=“center”) 设置画布宽高plt.figure(figsize=(6, 12)) 数据直接创建图纸 data = pd.DataFrame([[1,2,3,4],[5,6,7,8]]) fig, axs = plt.subplots(figsize=(4, 4)) data.plot(ax=axs) axs.set_ylabel(“emmmm”) fig.savefig(“s.png”)
pandas数据处理
读写文件 读取excel文件pd.read_excel(‘文件名’) 读取csv文件pd.read_csv(‘文件名’,encoding=‘gbk’)文件形式’utf-8’,“ANSI”, “GBK” 写入csv文件df.to_csv(“stu_info.csv”, header=True, index=False) 保存xlsx文件 writer = pd.ExcelWriter(“stu_info.xlsx”)创建excel文件 df.to_excel(excel_writer=writer, sheet_name=‘sheet1’)保存第一个表格 df.to_excel(excel_writer=writer, sheet_name=‘sheet2’, header=False, index=False) writer.save()文件保存 writer.close()文件关闭 DataFrame 创建df数据df = pd.DataFrame(index=index1, columns=columns1, data=data1) index列索引,columns行索引,data数据 行列索引 修改整个行索引名称 df.reset_index(inplace=True) 修改整个列索引名称 df.colums = [‘姓名’,‘年龄’。。。] 修改列索引df.rename(columns={‘name’:‘姓名’},index={‘001’:‘002’}) 删除 用index,columns删除df.drop(index=[“Stu_10”, “Stu_6”], columns=[“科目”, “出生日期”], inplace=True) 用labels删除 labels 索引名称。当axis=0时行索引; 当axis=1时列索引; stu.drop(labels=[“Stu_10”, “Stu_6”], axis=0, inplace=True) stu.drop(labels=[“科目”, “出生日期”], axis=1, inplace=True) 去除空值 data.dropna(how=“all”, subset=[‘主演’], axis=0, inplace=True) how有any和all,any当这一列存在一个空值时符合删除条件,all当这一列全部是空值符合删除条件。subset,行索引 删除重复值保留第一个data_index = data.drop_duplicates(subset=‘dataset’, keep=‘first’) 取值删除data=data[[‘name’,‘age’]] 增改 insert插入 df.insert(loc=7, column=“期末成绩”, value=df[“平时成绩”] * 0.3 + df[“考试成绩”] * 0.7) 参数loc,希望插入到第几列位置 参数column; 插入列的 列索引名称 参数value; 插入列的 内容 df[“科目”] = “python"直接插入相同的一列 df[“名字”] = df[“姓名”].str[1:]替换列数据不要第一个字符 df.loc[df[“总成绩”] > 60, “等级”] = “优"根据条件插入数值 排序 索引排序sort_index().groupby([“location”]) 列排序 stu.sort_values(by=“hight”, ascending=False,inplace=True) ascending控制升序降序,True升序False降序 时间处理 创建时间pd.to_datetime(data[“use_start_time”]) 定义时间戳pd.Timedelta(days=0) 列表时间取值df[“年”] = df[“时间”].dt.year(year, month, day,hour, minute, second) 时间取值 年t1.year,季度t1.quarter, 月 t1.month, 周t1.week,周天t1.dayofweek,天t1.day, 小时t1.hour, 分钟t1.minute, 秒t1.second 数据分组 groupby分组聚合 df.groupby(by=[‘cls_id’, ‘group_id’])[“hight”].max() agg针对一列计算多个指标 df.groupby(by=‘cls_id’)[“hight”].agg([‘mean’, ‘max’]) agg针对多列计算多个统计指标 df.groupby(by=‘cls_id’)[[‘hight’, ‘score’]].agg([‘mean’, np.max]) transform用法 df.groupby(by=‘cls_id’)[[‘hight’, ‘score’]].transform(sum)sum为函数 pivot_table透视表 number = pd.pivot_table( data=df, 数据 index=‘cls_id’, 行索引可用列表 columns=‘group_id’, 列索引 values=‘name’,分组依据 aggfunc=‘count’, 分组形式 margin=True, # 是否汇总 margins_name=‘aaa’ # 汇总名称 ) crosstab交叉表 number = pd.crosstab( index=df[‘cls_id’], columns=df[‘group_id’], values=df[“score”], aggfunc=‘max’ margin=True, margins_name=‘总和’ ) titanic.agg( { “Age”: [“min”, “max”, “median”, “skew”], “Fare”: [“min”, “max”, “median”, “mean”], } ) 数据合并 pd.concat((data, data), axis=0, join=‘outer’) # 行合并,外连接取并集 data.append(data) # 行合并 df = pd.merge( left=data, right=data, left_on=“姓名”,左表合并依赖的列索引 right_on=“name”,右表合并依赖的列索引 how=‘inner’,outer,left,right suffixes=(”_左表”, “_右表”) # 合并时出现 重命名,如何增加后缀 ) 重叠合并 df1是主表;df1中空缺的位置 使用 df2中的非空值进行填充 df = df1.combine_first(df2) 空值处理 空值检测 data.notnull() ----如果 不是空值 返回True, 否则 返回False data.info() -------仅展示 做了解--------- np.isnan(val) titanic[“Age”].notna() 空值填充 根据分类填充data.fillna({“商品ID”:“无”, “类别ID”:’/’, “门店编号”:‘CDNL’}, inplace=True)
method : {{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}}
前一个非空值进行填充 pad or ffill
后一个非空值进行填充 backfill or bfill
data[“商品ID”].fillna(method=“pad”, inplace=True) 空值删除 data.dropna(axis=0, how=‘any’, inplace=True) weibo.replace(“无”, np.nan, inplace=True) 空值插值 from scipy.interpolate import interp1d # 线性插值 from scipy.interpolate import lagrange # 拉格朗日 非线性问题 f = interp1d(x, y) # 建立函数 f = lagrange(x, y) # 建立函数 f(5)预测函数,根据x预测y 异常值检测 直接业务法:根据业务指标 规定异常值 箱线图检测法 def box_analysis(val): # 1. 计算 下四分位数QL; 上四分位数 QU # 2. IQR:QU-QL # 3. low下限 = QL-1.5IQR; high上限: QU+1.5IQR ql, qu = val.quantile([0.25, 0.75]) iqr = qu - ql low = ql - 1.5 * iqr high = qu + 1.5 * iqr print(“下限和上限”, low, high) return (val >= low) & (val <= high) mask = df[“身高”].transform(box_analysis) df_v2 = df[mask] 3sigma法 def three_sigma(val): # 1. 计算 均值和标准差 # 2. low下限 = 均值-3标准差; high上限: 均值+3标准差 mean_val, std_val = val.mean(), val.std() low = mean_val - 3 * std_val high = mean_val + 3 * std_val print(“下限和上限”, low, high) return (val >= low) & (val <= high) mask = df[“身高”].transform(three_sigma) df_v2 = df[mask] 数据标准化 离差标准化 def max_min_sca(val): max_val, min_val = val.max(), val.min() return (val - min_val) / (max_val - min_val) 标准差标准化 def std_sca(val): mean_val, std_val = val.mean(), val.std() return (val - mean_val) / std_val 小数定标标准化 def abs_max_sca(val): k = np.ceil(np.log10((val.abs()).max())) return val / (10 ** k) 非数值转数值哑变量处理pd.get_dummies(stu[“城市”], prefix=“城市”) 非数值类型数据转化为数值类型数据 out = pd.get_dummies(stu[“城市”], prefix=“城市”) 数据离散化(数据切割) 自定义分组 data[“客户年龄”] = pd.cut(data[“客户年龄”], # bins=3, bins=[21, 25, 30, 35, 40], # include_lowest=True ) 等比分组data[“客户年龄”] = pd.qcut(data[“客户年龄”], q=5) 常用数据方法 df.mean()求平均值 df.median()求中位数 df.mode()求众数 Series pandas.Series( data, index, dtype, name, copy) data:一组数据(ndarray 类型)。 index:数据索引标签,如果不指定,默认从 0 开始。 dtype:数据类型,默认会自己判断。 name:设置名称。 copy:拷贝数据,默认为 False。 print(‘Series的shape’, se.shape) print(‘Series的ndim’, se.ndim) print(‘Series的size’, se.size) print(‘Series的dtype’, se.dtype) print(‘Series的dtypes’, se.dtypes) print(“Series的行索引”, se.index) print(“Series的数据部分”, se.values) print(“Series的数据部分的类型”, type(se.values))
|