Python
ix的操作比较复杂,在pandas版本0.20.0及其以后版本中,ix已经不被推荐使用,建议采用iloc和loc实现ix。
- 在pandas中遍历DataFrame行
- 使用sklearn进行K_Means聚类算法
- if __ name__ == ‘__ main__’:
参见前两个,旷修和留德华叫兽的回答。
https://www.zhihu.com/question/49136398
一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。
if __ name__ == ‘__ main__’ 就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于__name__的值。
所以,if __ name __ == ‘__ main__’ 我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
- sorted()
http://www.runoob.com/python3/python3-func-sorted.html
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
- str.split()
整理几种正确用法:
# strip spaces and newline characters from every line
lines = list(map(str.strip, f.readlines())) #注意这里strip后面没有括号!
# 字符串按一个空格分开
line.split(' ') # 这么写就只能按一个空格分开,有两个连续空格就凉凉了
# 字符串按单词划分,不管单词之间隔了几个空格
line.split() # 不指定就可以了,是不是so easy
- from functools import partial
https://wiki.jikexueyuan.com/project/explore-python/Functional/partial.html
https://wiki.jikexueyuan.com/project/explore-python/Functional/partial.html - namedtuple
http://www.runoob.com/note/25726 - 运算符product
product(A,B)函数,返回A和B中的元素组成的笛卡尔积的元组,具体见如下代码:
import itertools
for item in itertools.product([1,2,3,4],[100,200]):
print(item)
'''
(1, 100)
(1, 200)
(2, 100)
(2, 200)
(3, 100)
(3, 200)
(4, 100)
(4, 200)
'''
- from itertools import combinations, permutations
- combinations()
combinations(iterable,r),创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序,不带重复。- permutations()
permutations(p[,r]),返回p中任意取r个元素做排列组合的元组的集合的迭代器,r为可选参数,默认为p中的所有元素- 二者的区别在于,combinations强调子序列,permutations强调排列组合。
perm = [0, 1, 2]
for i in combinations(perm, 2):
print(i)
'''
(0, 1)
(0, 2)
(1, 2)
'''
perm = [0, 1, 2]
for i in permutations(perm, 2):
print(i)
'''
(0, 1)
(0, 2)
(1, 0)
(1, 2)
(2, 0)
(2, 1)
'''
- random.shuffle()
https://www.runoob.com/python3/python3-func-number-shuffle.html
random.shuffle() 直接作用于list,没有返回值,所以如果candidate = random.shuffle(candidate)的话,candidate为none。
- global全局变量
https://linux.cn/article-9561-1.html - import循环导入出bug
解决方法有两种:(1)将import flow_shop改为只导入需要的函数 from flow_shop import compile_solution;(2)在函数内部import flow_shop
https://www.cnblogs.com/felixwang2/p/10095740.html
- sys.argv[]
sys.argv是一个列表,存储了用户输入的参数。例如terminal输入:python3 ‘tai50_5.txt’ 4
那么 len(sys.argv) = 3, sys.argv[0] = python3, sys.argv[1] = ‘tai50_5.txt’, sys.argv[2] = 4。
代码测试:https://github.com/zs0129/updated-flow_shop-from-500-lines-or-less
if __name__ == '__main__':
if len(sys.argv) == 2:
data = parse_problem(sys.argv[1])
elif len(sys.argv) == 3:
data = parse_problem(sys.argv[1], int(sys.argv[2]))
else:
print('\n Usage: python3 flow_shop.py <Taillard problem filename> [<instance number>] \n')
(perm, ms) = solve(data)
print_solution(data, perm)
- XGboost如何画出树?
https://blog.youkuaiyun.com/anshuai_aw1/article/details/82988494 - datetime计算时间差
import datetime
t2 = datetime.datetime.strptime(str(row['理货完成时间_SPU']), "%Y-%m-%d %H:%M:%S")
t1 = datetime.datetime.strptime(str(row['理货开始时间_SPU']), "%Y-%m-%d %H:%M:%S")
print((t2 - t1).seconds) # 忽略天,只看时分秒
print((t2 - t1).days) # 差的天数,貌似是直接删除小数位/向下取整了
print((t2 - t1).total_seconds) # 真正意义上的时间差
- 利用GridSearch对XGBoost调参
https://blog.youkuaiyun.com/jh1137921986/article/details/84754868
其中,xgboost可调参数见
https://easezyc.github.io/2017/12/07/XGBoost-Parameters/ - RFregressor调参
- max_features
决策树划分时考虑的最大特征数max_features:可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2(n_features)个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑sqrt(n_features) 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
参数效果:max_features 值越大,模型学习能学习到的信息越多,越容易过拟合- max_depth
决策树最大深度max_depth, 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
参数效果:值越大,决策树越复杂,越容易过拟合。- min_samples_split
内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
参数效果:值越大,决策树越简单,越不容易过拟合。- min_samples_leaf
叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
参数效果:值越大,叶子节点越容易被被剪枝,决策树越简单,越不容易过拟合。- min_weight_fraction_leaf
叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。- max_leaf_nodes
最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
参数效果:值越小,叶子节点个数越少,可以防止过拟合。- min_impurity_split
节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。
21. XGBregressor调参
https://xgboost.readthedocs.io/en/latest/parameter.html#general-parameters
https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/
22. 不同于Java的 Python深拷贝浅拷贝
简洁文字版
莫烦一步到位
23.Python随机数种子
np.random.seed()
np.random.RandomState()
-
dataframe连接(列名完全相同):
import pandas as pd
df = pd.concat([df1, df2, …])
- python矩阵乘积运算(multiply/maumul/*/@)解析
- python next()完成后引发StopIteration异常的解决办法
def gen(n):
i=0
while True:
if i<=n:
yield i
i+=1
else:
raise StopIteration
iter_gen=iter(gen(10))
try:
while True:
print(next(iter_gen))
except StopIteration:
pass