Python tricks

1. 绘图显示中文标签
plt.rcParams['font.sans-serif']=['SimHei'] 
2. 将数组转为字符串

str.join() 用str将括号内的字符连接起来

stack = ['a','b','c']
"".join(stack)

输出'abc'
3.

df_month[‘Price’] 是pd.Series

df_month[[‘Price’]] 是pd.DataFrame

4. 判断一个月有多少天
calendar.monthrange(2020, 10)
5. 倒序循环
for i in range(30,3,-1)
for i in reversed(range(30))
6. 占位符循环

占位符有很多,%d、%s之类,https://blog.csdn.net/coberup/article/details/82856910

['var%d(t-%d)' % (j + 1, 4) for j in range(10)] 或是
["var{}".format(i) for i in range(3)]

遇到<generator object at0x7fab68a9a9d0>,这种运行成功但无法显示的情况,可以考虑加加括号,或者外面加个list。

还可以用f,大括号里的是变量

f"{self.event_type} event at {self.datetime}"
7. continue 与 break
  • continue: 若满足if判断,则直接开始下一次循环,本次循环不再继续执行完
def func():
    for i in range(1,11):
        if i % 2 == 0:
            continue
        print(i)
func()

运行结果:1,3,5,7,9

  • break:一旦if条件被触发,就停止当前循环
def func2():
    for i in range(1,11):
        if i % 2 == 0:
            break
        print(i)
func2()

运行结果:1

8. pd.concat两个df时,会自动根据索引取交集
df1 
   A  B
0  1  2
1  3  4

df2 
   C  B
0  5  2
1  7  4

pd.concat([df1,df2],axis=1)
输出为
    A   B   C   B
0	1	2	5	2
1	3	4	7	4

pd.concat([df1,df2],axis=0)
输出为
    A   B    C
0	1.0	2	NaN
1	3.0	4	NaN
0	NaN	2	5.0
1	NaN	4	7.0
9. 创建一个固定长度的list:
a = [1] * length
10. 地址
import ctypes
 
value='hello world' #定义一个字符串变量
address=id(value) #获取value的地址,赋给address
get_value=ctypes.cast(address, ctypes.py_object).value #读取地址中的变量
print(get_value)
10. floor,ceil,sqrt

不用numpy的话,全部在前面加math,如math.floor

11. 解压
# 路径如果用反斜杠,要在前面加r
# 路径要精确到rar
# 也可以直接用相对路径,正斜杠
import rarfile
rf = rarfile.RarFile("./future2015/FutAC_TickKZ_CTP_Daily_201501.rar")

for f in rf.infolist():
    print(f.filename)
12. 数据格式转化

dataframe里面一定要用astype,不能str(xxx)

df['date'].astype('str')
13. 判断时间先后

str时间格式可以直接判断
‘23:58:59’<‘23:59:59’

14. 读取文件

encoding = ‘utf-8’,‘gbk’,‘gb2312’

15. plt
plt.gca()获得当前的Axes对象ax

plt.title("title")

x = [1, 2, 3, 4]
labels = ['Frogs', 'Hogs', 'Bogs', 'Slogs']
plt.xticks(x, labels, rotation='vertical')
用labels的值取代图中坐标上的x,rotation是label的旋转角度

plt.margins(0.2)

plt.ylabel('True label')
16. dataframe里根据值定位
df[df==3] = 30
17. dataframe里把bool型掩码换成某个数值

https://www.jb51.net/article/141653.htm

df.replace()

df.where(df.isin([1, 3, 12]),other=30)
18. pd.series
- 如果要取series的第一列,如果用s.iloc[0],只能得到一个数,得不到series,要用s.iloc[0:1]
- 插入, insert(位置,data),extend(data), append(另一个series)
- 删除,del s[3],Series.pop(index),s.drop([2,3])
19. inf, nan

可以表示为np.inf, np.nan

20. __slots__

https://blog.csdn.net/sxingming/article/details/52892640

21. __str__

返回一个对象的描述信息

22. 单下划线和双下划线

变量前的单下划线表示表面上私有,变量前的双下划线表示真正的私有

23. *args和**kwargs

https://zhuanlan.zhihu.com/p/50804195

*args就是传递一个可变参数列表给函数,列表的数目未知;

**kwargs则是将一个可变的关键字参数的字典传给函数

def test_kwargs(**kwargs):

    for k, v in kwargs.items():
        print ((k, v))
        
    if 'k2' in kwargs:
        print(kwargs['k2'])

test_kwargs(k2=6)

输出

('k2', 6)
6

当函数的形参是**kwargs的时候,在给函数传参的时候,不能传字典进去;函数里的kwargs是个字典

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)
    
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)

当函数的形参不是**kwargs的时候,调用函数的时候,可以使用**kwargs

24. 判断每个值出现了多少次(value_counts())
data['weekday'].value_counts()
25. 时间
np.datetime64('today','D')
np.timedelta64(1,'D')
pd.to_datetime(...)
df['datetime'].dt.week
datetime.datetime(2014,9,1)
datetime.timedelta(days=1)
26. 构建新dataframe

需要从空白搭建一个dataframe的时候,如果不方便直接往df里加数据,可以先写成list,然后再转换成df,因为list很好插入数据。

27. groupby

之后,索引默认变成group的列,如果不想变,用参数groupby(‘weekday’,as_index=False)

28. iterrows
df = pd.DataFrame([[1,2,3],[3,4,5]],columns=['a','b','c'],index=['A','B'])
for i,j in df.iterrows():
    print(i)
    print('--------')
    print(j)

输出

A
--------
a    1
b    2
c    3
Name: A, dtype: int64
B
--------
a    3
b    4
c    5
Name: B, dtype: int64
29. groupby.count

想计算个数df[‘xx’].groupby([‘day’],as_index=False).count()

30. df中通过两列的值匹配

df长这样

	A	B	C
0	100	2	b
1	200	a	3
2	300	a	4

现在要查找B=a,C=3的A值

for index, (B, C) in enumerate(zip(df.B.values,df.C.values)):
    if B=='a' and C==3:
        print(df.loc[index,'A'])
31. join

将序列中的元素以指定的字符连接生成一个新的字符串

wordslist = ['我非常喜欢看电视剧','我非常喜欢旅行']
textTest = ['aa'.join(jieba.cut(words)) for words in wordslist]

# result
['我aa非常aa喜欢aa看aa电视剧',
 '我aa非常aa喜欢aa旅行']
32. queue.get(block)
  • queue.put(10): 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为True。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
  • q.get(): 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
  • block=True 一般会和timeout搭配使用
33. try
try:
    ...
except ValueError:
    ...
except:
    ...
    # 除了valueerror以外的错误的处理都放在这
else:
    ...
    # 如果没有出现错误,则执行此处
finally:
    ...
    # 不管有没有异常,都会执行此处
34. 函数传参数

这个参数如果不是值类型(比如int、string这种),那就传的是指针

35. pandas.melt
把
	A	B
a	2	4
b	6	8
给变成
    1	2	3
0	a	A	2
1	a	B	4
2	b	A	6
3	b	B	8
代码是
df2 = pd.melt(df.reset_index(), id_vars='index',value_vars=['A','B'])
df2
其中 id_vars 是不变的基准列,value_vars 是要变的列
36. 判断变量是否为空 if not stack
stack = []
if not stack:
	pass
37. tolist()

在dataframe里,需要转化为列表的话,可以用df.columns.tolist()

38. pipeline

在pipeline里会给变量名字,比如下面的pca和logistic,这个名字的意义和params里,两个下划线前面的字符一致。到了GridSearchCV里,会根据名字找对应值。

logistic = linear_model.LogisticRegression()
pca = decomposition.PCA()

pipe = Pipeline(steps=[('pca', pca), ('logistic', logistic)])

params = {
     'pca__n_components': [20, 40, 64],
     'logistic__C': np.logspace(-4, 4, 3),
    }
    
estimator = GridSearchCV(pipe, params)
39. imshow

plt.imshow()热图

40. if…else…写在一行

color = ‘white’ if cm[i, j] > thresh else ‘black’

41. clf.class_, predict_proba、decision_function

https://blog.csdn.net/cxx654/article/details/106727812

  • classes_属性中按顺序保存着训练样本的类别标记。
  • predict_proba: 模型预测输入样本属于每种类别的概率,概率和为1,每个位置的概率分别对应classes_中对应位置的类别标签。
  • decison_function: 输出样本距离各个分类器的分隔超平面的置信度
    • ‘ovr’:One-vs-Rest; ‘ovo’:One-vs-One
  • 计算ROC和AUC时,需要预测结果的置信度,由predict_proba或decison_function表示,如果分类器的参数中有probability=True,可以使用predict_proba,但如果probability=False,则只能使用decison_function。
42. clf.coef_, clf.intercept_
43. deque的切片

deque切片时需要使用islice

from collections import deque
from itertools import islice

a = deque(maxlen=20)
for i in range(20):
    a.append(i)
    
list(islice(a,2,5))

>> [2,3,4]
44. 生成唯一标识符uuid
import uuid

name = 'test_name'
# namespace = 'test_namespace'
namespace = uuid.NAMESPACE_URL

print uuid.uuid1()  # 全球范围内的唯一性
print uuid.uuid3(namespace,name)  # 可以保证命名空间中的不同名字具有不同的uuid,
但是相同的名字就是相同的uuid了
print uuid.uuid4()  # 通过伪随机数得到uuid,是有一定概率重复的
print uuid.uuid5(namespace,name)
45. 把True/False转换成1/0
import numpy as np
a = np.array([True, False])
a.astype(int)
46. 计算程序运行时间
tic = time.process_time()
# 这儿写代码
toc = time.process_time()
print("time=" + str(1000*(toc-tic)) + 'ms')
47. 对矩阵的平方求和
np.sum(np.square(W))
48. 对一组数打乱重排
p = 6
np.random.permutation(p)
49. 用numpy求数组倒序
a = np.arange(10)
a[8::-2] 
输出  array([8, 6, 4, 2, 0])

a[8:1:-2]
输出array([8, 6, 4, 2])

-np.sort(-a)
输出array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
50. numpy数组去掉冗余的维度
a = np.array([[[10, 2, 3]]])
a_sque = np.squeeze(a)
51. 求一组随机数在每个数值处的个数
Z = np.random.randint(0, 10, 50)
np.bincount(Z)
52. 找出给定一维数组中非 0 元素的位置索引
Z = np.nonzero([1, 0, 2, 0, 1, 0, 4, 0])
53. Z.sort() 和 np.sort(Z)

都可以运行,但如果要赋值,只能用 Z = np.sort(Z)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值