Pandas
遍历行
for index, row in df.iterrows():
print(df['row1'])
排序
ascending 为False为降序,反之升序
df.sort_values(by='max_salary',ascending=False)
函数映射
df.apply()
# 例如:
def get_num(row):
data = re.findall('\d+-\d+',row)
if len(data)==0:
data=re.findall('\d+',row)
return data[0]
df['company_employees_num'].apply(get_num)
用0替换所有NaN值
例如:
df2['company_investment'].fillna('无融资',inplace=True)
根据条件删除行
df = df.drop(df[df.score < 50].index)
快速查找并统计pandas数据框中每一列有多少缺失值(nan)
df2['keyword'].isnull().sum()
数据区间分段
df['new']=pd.cut(df['mean_salary'],[-1,3,5,8,10,15,20,30,60,9999999],
labels=['0-3','3-5','5-8','8-10','10-15','15-20','20-30','30-60','60+'])
Dataframe.transform()函数的用法
transform保持了与原始数据集相同数量的行
Dataframe.rank()函数的用法
分组排序
trn_click['rank'] = trn_click.groupby(['user_id'])['click_timestamp'].rank(ascending=False).astype(int)
value_counts()统计各值的占比
trn_click['click_environment'].value_counts(normalize=True)
head()与tail()函数
head()函数是显示前5条,tail()函数显示后5条
多个相同表合并
append()
user_click_merge = trn_click.append(tst_click)
dataframe分组偏移得出下一项
tmp = user_click_merge.sort_values('click_timestamp') # 升序
# 升序则 下一个新闻往上移动
tmp['next_item'] = tmp.groupby(['user_id'])['click_article_id'].transform(lambda x:x.shift(-1))
其中shift函数
dataframe中的stack()、unstack()区别
https://blog.csdn.net/S_o_l_o_n/article/details/80917211
pandas dataframe 导入mysql
不需提前在Mysql中创建表结构
import pandas as pd
import sqlalchemy
host = '192.168.11.22'
port = 3306
user = 'user'
password = '1234'
db_name = '其他'
engine = sqlalchemy.create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(user, password, host, port, db_name))
table = 'tmp_210705'
#读数据
df = pd.read_excel(r'用品.xlsx')
# 写入数据库
pd.io.sql.to_sql(df,table,con=engine,schema=db_name,if_exists='append',index
=False)
#关闭
engine.dispose()
pandas dataframe 导入mongodb
from pymongo import MongoClient
client = MongoClient(host='192.168.50.2', port=27017)
db_name='aws_verifi_result'
table_name = 'xxx'
data = client[db_name][table_name]
df = pd.DataFrame(list(data.find()))
# 如果需要指定字段
df = pd.DataFrame(list(data.find({},{'asin':1}))) # 前面需要有个空括号表示条件为空,下一个括号为需要指定的字段,值为1时显示,0不显示
# 分批读取
len_data = data.count()
num=700000
batch = len_data//num
df= pd.DataFrame(list(data.find().skip(batch * num).limit(num)))
mysql
窗口函数
排序函数
row_number:输出行号
rank:输出排名,但是排名之间会根据行数跳跃
dense_rank:输出排名不跳跃
切片函数
偏移函数
lag向上
lead向下
日期间隔函数
datediff(a,b)
查询连续问题
k = 行号(需要判断连续的字段) - 组内行号
count k的个数 就可以知道连续多少次
示例1
SELECT
distinct num
FROM
(
SELECT
*,(
# 行号 - 组内行号
ROW_NUMBER() over ( ORDER BY id ASC ) - ROW_NUMBER() over ( PARTITION BY num ORDER BY id ASC )
) a
FROM
`test`
) b
GROUP BY
num ,b.a
HAVING
COUNT( b.a ) >= 3
示例2
switch语句
MongoDB
子文档条件查询
方法1:
# $or 为或 $and 为且
# $eq 为完全相等
db.getCollection("com_automotive_211202").find({
"$or": [
{
"additionalInformation.ranks.categoryName": {
"$eq": "Automotive Replacement Air Filters"
}
},
{
"additionalInformation.ranks.categoryName": {
"$eq": "Automotive Replacement Passenger Compartment Air Filters"
}
},{
"additionalInformation.ranks.categoryName": {
"$eq": "Automotive Replacement Air Conditioning Products"
}
}
]
})
方法2:
db.getCollection("com_automotive_211202").find({
"$or": [
{
"additionalInformation.ranks.categoryID": "2425155011"
}
]
})
机器学习
监督学习
KNN
KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
贝叶斯/朴素贝叶斯
贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
由于朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差。其
优点主要体现在以下四个方面。
- 训练和预测的速度非常快。
- 直接使用概率预测。
- 通常很容易解释。
- 可调参数(如果有的话)非常少。
朴素贝叶斯分类器非常适合用于以下应用场景。
- 假设分布函数与数据匹配(实际中很少见)。
- 各种类型的区分度很高,模型复杂度不重要。
- 非常高维度的数据,模型复杂度不重要。
这5种算法适合应用在不同的数据场景下,我们应该根据特征变量的不同选择不同的算法,下面是一些常规的区别和介绍。
GaussianNB
高斯朴素贝叶斯,特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。
这种模型假设特征符合高斯分布。
MultinomialNB
特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。不支持负数,所以输入变量特征的时候,别用StandardScaler进行标准化数据,可以使用MinMaxScaler进行归一化。
这个模型假设特征复合多项式分布,是一种非常典型的文本分类模型,模型内部带有平滑参数图片。
ComplementNB
是MultinomialNB模型的一个变种,实现了补码朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,比较适用于不平衡的数据集,在文本分类上的结果通常比MultinomialNB模型好,具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。
BernoulliNB
模型适用于多元伯努利分布,即每个特征都是二值变量,如果不是二值变量,该模型可以先对变量进行二值化,在文档分类中特征是单词是否出现,如果该单词在某文件中出现了即为1,否则为0。在文本分类的示例中,统计词语是否出现的向量(word occurrence vectors)(而非统计词语出现次数的向量(word count vectors))可以用于训练和使用这个分类器。BernoulliNB 可能在一些数据集上表现得更好,特别是那些更短的文档。如果时间允许,建议对两个模型都进行评估。
CategoricalNB
对分类分布的数据实施分类朴素贝叶斯算法,专用于离散数据集, 它假定由索引描述的每个特征都有其自己的分类分布。对于训练集中的每个特征 X,CategoricalNB估计以类y为条件的X的每个特征i的分类分布。样本的索引集定义为J=1,…,m,m作为样本数。
决策树
随机森林
SVM 支持向量机
逻辑回归
无监督学习
K-means/K-means++/bi-kmeans
划分式聚类方法需要事先指定簇类的数目或者聚类中心,通过反复迭代,直至最后达到"簇内的点足够近,簇间的点足够远"的目标。经典的划分式聚类方法有k-means及其变体k-means++、bi-kmeans、kernel k-means等。
K-means:
Kmeans算法过程详解
一般来说,经典k-means算法有以下几个特点:
- 需要提前确定K值
- 对初始质心点敏感
- 对异常数据敏感
K-means++:
k-means++是针对k-means中初始质心点选取的优化算法。该算法的流程和k-means类似,改变的地方只有初始质心的选取,该部分的算法流程如下
bi-kmeans:
一种度量聚类效果的指标是SSE(Sum of Squared Error),他表示聚类后的簇离该簇的聚类中心的平方和,SSE越小,表示聚类效果越好。 bi-kmeans是针对kmeans算法会陷入局部最优的缺陷进行的改进算法。该算法基于SSE最小化的原理,首先将所有的数据点视为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否能最大程度的降低SSE的值。
详解准确率、精确率、召回率、F1值等评价指标的含义
https://cloud.tencent.com/developer/article/1486764
特征降维
TSNE
TSNE提供了一种有效的降维方式,让我们对高于2维数据的聚类结果以二维的方式展示出来:
from sklearn.manifold import TSNE
tsne=TSNE()
tsne.fit_transform(df_src) #进行数据降维,降成两维
PCA
PCA,中文名:主成分分析,在做特征筛选的时候会经常用到,但是要注意一点,PCA并不是简单的剔除掉一些特征,而是将现有的特征进行一些变换,选择最能表达该数据集的最好的几个特征来达到降维目的。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
df= pca.fit_transform(df)
# inverse_transform(newData) 将降维后的数据转换成原始数据,但可能不会完全一样,会有些许差别。