Numpy具有处理大型多维数组和矩阵的能力,常用于数据科学、数值算法等
pandas是基于NumPy的数据分析库,可以清洗、转换、分析和处理各种数据。pandas常用的俩个数据结构,series (一维的,带标签的数组,可以保存任意类型的数据) 和 DataFrame (多维的,带标签表格数据结构,可以看作为excel 电子表格或SQL表的python版本)
numpy
import numpy as np
array = np. array([数组],dtype=np.int32) # array 定义一种有序数据集合 /. dtype=数据类型(int、float)
array = np.arange(4).reshape((2,2)) # aranage定义数据集合(0,1,2,3),并以2 X 2 排列
array.ndim, # 查看array 是几维数组
array.shape, # 查看array 的行数和列数 reshape(3,4) 重新定义数列的展示
一维数组: array.shape[0] : 数组中的元素个数 二维数组 [0] : 行数。[1] : 列数
array.size # 查看数组中的元素的数量
np.random.random((2,4)) #取随机数组成2 X 4 数列
np.sum(array) : 数据表中的和
np.min(array) :数据表中的最小值 np.argmin(array) : 索引的最小值
np.max(array) :数据表中的最大值 np.argmax(array) : 索引的最大值
np.mean(array) : 平均值 np.median(array) : 中位数
np.cumsum(array) : 从第一个数开始累积相加 获得的数组
for i in array.T # 迭代列
for i in array.flat #迭代array的所有元素
np.vstack((A,B)) #对A数组和B数组进行合并 (上下合并)
np.hstack((A,B)) #对A数组和B数组进行合并 (左右合并)
np.split(array,2,axis=1) #对array数组进行分割, 2: 分割成俩列。axis=1 : 1表示按列 0 :表示按行
np.arange(0,100). #0-100个数的集合列表。
np.dot(a,b,out-None) #获取俩个数的乘积
pandas
导入csv文件或者xlsx文件
df = pd.DataFrame(pd.read_csv(‘name.csv’),header=1). # header=1. 除去表头
df = pd.DataFrame(pd.read_excel(‘name.xlsx’))
创建数据表
df=pd.Series([1,2,4,‘a’,‘f’]) # 按照数据信息排序,并以显示索引为列表头,
#取随机数6X4排列,以index为列表头,以columns为行表头 :不指定index 和columns 默认以数字0开始
df = pd.DataFrame(np.random.randn(6,4),index=[1,2,3,4,5,6],columns=[‘a’,‘b’,‘c’,‘d’])
数据表信息查看
df=pd.DataFrame({“id”:[1,2,3],“date”:[2021,2022,2023]})
df.shape #维度查看
df.info() #查看数据表基本信息(维度、列名称、数据格式、所占空间)
df.dtype #查看每一列的格式
df[‘id’].dtype #查看某一列的格式
df.isnull #查看所有列的空值
np.df.isnull().sum() # 查看每列空值的个数
df[‘id’].isnull #查看某一列的空值
df[‘id’].unique() #查看某一列的唯一值
df.values #查看数据表的值
df.columns[] #查看每一列的列名称
df.head(n) #查看前n行
df.tail(n) #查看后n行
数据提取
df=pd.DataFrame({“id”:[1,2,3],“date”:[2021,2022,2023]})
df.loc[2] #按索引取出第三行的所有数据
df.query(‘city==“SH”’) # 通过变量筛选出数据
df.iloc[0:3] #按索引去处0-5行的所有数据
df.loc[1,‘price’] = 1 # 索引为1,标签为price的字段 == 1
df.reset_index() #重新设置索引
df=df.set_index(‘date’) #设置日期列为索引
df.iloc[:1,:2] #取出前1行,和前2列的所有数据
df.iloc[[0,1],[1]] #取出第1行,第2行第2列的所有数据
df[‘date’].isin([2021]) #判断date列中,有2021字段的数据,返回True 或 Flase
df.loc[[df[‘date’].isin([2021])]] #取出date列中,包含2021字段的数据
pd.DataFrame(df[‘date’].str[2]) # 提取date列中的前三个字符,并生成数据表
数据清洗
df.dropna(axis=0,how=‘any’) #丢弃掉所有包行NULL值的行(axis=0,1为列)how={any(只要有一个为NaN,则全部丢 弃),all(全部是NaN,则全部丢弃)}
df.fillna(value=0,inplace=True) # 对NaN值填充为value值, inplace=True ,表示直接修改主文件不修改副本,df.dropna(how=‘all’):过滤NaN的行或列 axis 过滤 (fillna 用指定的值填充缺失的数据,dropna 对缺失的数据进行过滤)
df.isnull() #如果是NaN值,则返回True(列表形式),不是则Flase df.notnull()
df.isnull().sum() #汇总每列的NaN值的个数
np.any(df.isnull() == True) #表示每行只要存在一个NaN则返回True ,np.all 每行有一行全部是NaN值返回True
df.[‘city’].str.lower() # 大小写转换
df[‘city’].map(str.strop) #删除city 字段中的字符空格,str.strop 清除空格
df[‘city’].astype(‘int’) # 将city的字符串格式转换成int
df.rename(columns={‘city’:‘citycoun’}) # 将标签city 变成citycoun
df[‘city’].drop_duplicates() # 删除后出现的重复值,保留最开始的一条
df[‘city’].drop_duplicates(keep=‘last’) #删除最先出现的重复值,保留最后一条
df[‘city’].replace(‘sh’,‘shanghai’) #数据替换
df=pd.DataFrame #数据预处理
df[‘age’].mode()[0] # 取出age中出现最多的一个
df.age.value_counts()) #取出age中的每个字段出现个个数
数据合并:
df1 = pd.DataFrame(np.ones((3,4))*0,columns=‘a’,‘b’,‘c’,‘d’)
df2 = pd.DataFrame(np.ones((3,4))*1,columns=‘a’,‘b’,‘c’,‘d’)
df3 = pd.DataFrame(np.ones((3,4))*2,columns=‘a’,‘b’,‘c’,‘d’)
方法一: concat
pd.concat([df1,df2,df3],axis=0,ignore_index=True,join=‘outer’,join_axes=[df1.index]).
合并,axis=0 ,纵向合并,ignore_index : 忽略之前的索引,重新排序 ,
join=‘outer’. <> outer : 表示:如果df1 和df2 中标签不一致,合并后不一致的数据为NaN,,inner : 表示:如果df1 和df2 中标签不一致,只对标签一致的数据进行合并,移除俩方不同的标签,
,join_axes=[df1.index].合并后按照df1.index的索引进行排序,不存在的值为NaN
方法二 :_append()
df1._append([df2,df3],ignore_indx=True)
方法三 : merge
pd.merger(df1,df2,how=‘inner’,on=‘a’) #交集
pd.merger(df1,df2,how=‘left’) #
pd.merger(df1,df2,how=‘right’,indicator=True) # right: 表示以右边的df2为基准去merge,indicator :表示合并方式,both为俩边都有相同的数据
pd.merger(df1,df2,how=‘outer’,om=‘a’, suffixes=[‘_df1’,‘_df2’]) # 并集,只合并a标签,其他补齐NaN, suffixes表示取分df1和df2中相同标签,相同数据的标识
图形:
import matplotlib.pyplot as plt
df.plot.scatter(x=‘id’,y=‘price’)
#plt.bar(range(16),df.age.value_counts())
plt.show()
面试高频
panads 函数
applymap ():让函数作用于DataFrame每一个元素的操作,每个参数返回一个对应值。
df.applymap(lambda id : id +1 )
apply () : 让函数作用于列或者行的操作 , 可以传函数,并且可以传一个参数。 不可以传字典
df[‘id’].apply(func,resg=1 )
map(): 让函数作用于Series 每一个元素的操作,可以传字典
df[‘id’].map(func) df[‘id’].map({101:103,102:104})
loc和iloc的区别。:
loc是按照标签去索引数据,也可以是数字,但是不是从0开始,要看具体标签的意义
iloc是按照顺序数字去索引数据,不能使用标签,数字必须从0开始。
loc和query的区别:
query是按照变量的方式去查找数据,使用比loc简洁。df.query(‘city==“SH”’)
DataFrame 的底层是基于 RDD(弹性分布式数据集)
reshape 和 shpae 的区别:shape是个属性,显示数组的行列个数,reshape是方法,可以改变数组的形状,按照行列排列
pandas 排序 : 可以使用sort_values (按列值排序) 和 sort_index (按照索引值排序) ,
异常数据的处理方法:
- 数据清洗:数据清洗是处理异常数据的一种常见方法。它包括删除重复数据、处理缺失值、删除异常值等。通过这些步骤,我们可以将数据清洗得更加干净,从而提高数据质量。
- 数据转换:数据转换是一种将原始数据转换为更适合分析的形式的方法。例如,将连续变量转换为分类变量,或者使用数学变换(如对数变换、平方根变换等)来调整数据的分布。通过数据转换,我们可以使数据更符合预期的数据分布,从而更好地进行数据分析。
- 数据可视化:通过绘制图表(如直方图、箱线图等),我们可以直观地观察到数据的分布情况。通过这些图表,我们可以快速地发现异常数据,并进行处理。
- 使用异常检测算法:异常检测算法是一种专门用于检测异常数据的算法。比如 均方差,判断数据是否是异常值或者是离群点
pandas 的异常数据检测算法:
均方差:
标准差 :std()
均值 : mean()
求上下边界值 :
上边界: max = mean(data) + std(data) * 3
下边界 : min = mean(data) - std(data) * 3
大于上边界,小于下边界,都属于异常值
如何辨别虚假流量 (加一个对流量的监控机制,get流量 )
- 比如下载一个文件,判断文件的下载流量和实际流量是否一致,不一致则为虚假流量
- 分析流量来源,网站流量发出的实际地理位置,虚假流量一般很难模拟地理位置
- 流量发出的ip,如果一个服务器发出多次同样的ip流量请求,那么这个可以定义为ddos攻击