文章目录
Python
0. python基础
-
is与“==”的区别。is是判断两变量的位置是否一致(id),“==”是判断值是否一致。
-
# 单一cell显示多结果 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" # 十进制与二进制转换 >>> bin(11) '0b1011' >>> '{0:b}'.format(11) '1011' >>> int('11',base=2) 3
-
深浅copy问题:
""" copy是只复制了一层,副本值的改变是受数据结构的影响的; deepcopy是完全复制,副本改变与原变量无关。 通俗来讲,copy只改变最外层地址指向,deepcopy是对每一层的对象地址完全改变 具体参照以下案例: """ >>> x = [1,2,3] >>> y = x >>> print(id(x),id(y)) 2580089611648 2580089611648 >>> for i,j in zip(x,y): ... print(id(i),id(j)) 140736824616752 140736824616752 140736824616784 140736824616784 140736824616816 140736824616816 ''' 赋值什么都没有改变 ''' >>> import copy >>> x = [1,2,3] >>> y = copy.copy(x) >>> print(id(x),id(y)) 2580089611648 2580090066176 >>> for i,j in zip(x,y): ... print(id(i),id(j)) 140736824616752 140736824616752 140736824616784 140736824616784 140736824616816 140736824616816 """ 浅copy只改变列表的地址,并没有改变每个值的地址 """ >>> z = copy.deepcopy(x) >>> print(id(x),id(z)) 2580089611648 2580089624256 >>> for i,k in zip(x,z): ... print(id(i),id(k)) ... 140736824616752 140736824616752 140736824616784 140736824616784 140736824616816 140736824616816 """ 深copy列表与每个值的地址都改变 """
-
多线程与多进程 参考链接
python是一个线性的语言,然而当你需要更大的处理性能时,python多线程模块就有他的作用了。即使Python无法用于CPU的并行计算(由于全局解释器锁的原因素),但是他在处理I/O操作时仍然很棒。python里面由于全局解释锁的原因,导致多线程失效。但是可以使用多进程来加速代码的运算,此时每一个线程中都会受到全局解释锁导致线程无法并行,但是多个进程也加速了代码的运行速度。
-
rank方法分类
data = pd.DataFrame() data['index'] = np.random.choice(list('ABCD'),20) data['value1'] = np.random.randint(0,10,20) """从字面意思可以看出,min方法就是常规的rank;注意min与dense的区别""" data['min_method'] = data.groupby('index')['value1'].rank(method='min') data['max_method'] = data.groupby('index')['value1'].rank(method='max') data['average_method'] = data.groupby('index')['value1'].rank(method='average') data['dense_method'] = data.groupby('index')['value1'].rank(method='dense') # 看一下结果 data.query('index == "B"').sort_values(by='min_method')
index | value1 |min_method |max_method | average_method |dense_method
-------- | ----- | -------- | ----- |-------- | ----- |-------- | ----- |
0 |B | 1 |1.0 |2.0 |1.5 |1.0
10 |B | 1 |1.0 |2.0 | 1.5 | 1.0
3 |B | 2 | 3.0 | 3.0 |3.0 | 2.0
5 |B | 5 |4.0 |4.0 |4.0 |3.0 -
字符串打印方法
# 居中操作 ^居中,<右居中,>左居中 >>> print('{:#^13}'.format('这是一个分界线')) ###这是一个分界线### >>> x,y = 0.1415926,198203 >>> print('{:.2f}'.format(x)) # 保留小数 0.14 >>> print('{:.3%}'.format(x)) # 百分比,并保留多少小数 14.159% >>> print('{:,}'.format(y)) # ","分割 198,203 >>> print('{:2e}'.format(y)) # 科学计数法 1.982030e+05 >>> print('{:b}'.format(19)) # 十进制转换二进制 10011 >>> print('我叫{},今年{:d}岁了,成绩是年级前{:.2%}'.format('小明',13,0.1573)) 我叫小明,今年13岁了,成绩是年级前15.73%
-
长宽表的转换
>>> data = pd.DataFrame() >>> data['A'] = np.random.choice(list('acb'),10) >>> data['B'] = np.random.choice(['m1','m2'],10) >>> data['c'] = np.random.randint(0,10,10) >>> data.drop_duplicates(subset=['A','B'],inplace=True) >>> data A B c 0 c m2 2 1 c m1 5 3 a m1 1 4 b m1 6 7 b m2 2 9 a m2 0 >>> data1 = data.pivot(index='A',columns='B',values='c') >>> data1 B m1 m2 A a 1 0 b 6 2 c 5 2 >>> data1.reset_index().melt(id_vars='A',var_name='C',value_name='Value') A C Value 0 a m1 1 1 b m1 6 2 c m1 5 3 a m2 0 4 b m2 2 5 c m2 2 >>>
1. 深色背景下,画图坐标轴问题。
# 方法1
from jupyterthemes import jtplot
# grade3 | oceans16 | chesterish | monokai | solarizedl | solarizedd
jtplot.style(theme='monokai') #选择一个绘图主题
# 方法2
plt.style.use('seaborn-darkgrid') # 设置画图的风格
2. heatmap图
s = X.drop('intercept',axis=1).corr()
plt.subplots(figsize=(9, 9))
sns.heatmap(s, annot=True, vmax=1, square=True, cmap="Blues")
plt.show()
3. 从根目录与子目录导入变量及方法
import pandas as pd
import numpy as np
# 导入同等目录下的变量与方法
from test2 import tmp_,get_groups
# 导入子目录下的变量与方法
from tmp1.test3 import tmp_,get_groups
# 导入父亲目录下的变量与方法
import sys
sys.path.append('..')
from test4 import tmp_,get_groups
# 测试
if __name__ == '__main__':
"""
文件结构
|test4.py
|base_test
||test1.py
||test2.py
||tmp1
|||test3.py
"""
xx1 = pd.DataFrame(np.random.randint(0,10,(5,2)),columns=list('AB'))
print(get_groups(xx1))
4. 优于os.path的库pathlib
import pathlib2 as pl
# 获得当前目录
>>> Path.cwd()
WindowsPath('C:/Users/xxx')
# 目录的文件夹,返回迭代器
>>> current_path.iterdir()
<generator object Path.iterdir at 0x00000240F9DCE350>
# 父目录
>>> current_path.parent
WindowsPath('C:/Users')
# 所有父目录
>>> [i for i in current_path.parents]
[WindowsPath('C:/Users'), WindowsPath('C:/')]
# 返回最后文件的后缀,前缀
>>> p = Path(r"E:\Desktop\tmp\xxxxxxxx.xlsx")
>>> p.name
'xxxxxxxxxlsx'
>>> p.stem
'xxxxxxxx'
>>> p.suffix
'.xlsx'
>>> p.with_name('xxxxxxxx.xlsx')
WindowsPath('E:/Desktop/tmp/xxxxxxxx.xlsx')
>>> Path('/Users/Anders/Documents/').joinpath('python_learn.csv')
WindowsPath('/Users/Anders/Documents/python_learn.csv')
# 是否文件夹
p.is_dir()
# 是否文件
p.is_file()
- 创建与删除文件夹
# 创建文件夹
p = Path('base_test/xx/xx1/xx2/xx3')
# 返回相对路径的绝对路径
p.resolve() # WindowsPath('E:/Desktop/tmp/base_test/xx')
p.exists() # 该路径是否存在
# parents代表如果父目录不存在,是否生成父目录;exist_ok表示如果目标文件夹已存在也不报错
p.mkdir(parents=True, exist_ok=True)
# 该方法只能删除空的文件夹
pl.Path('base_test/xx').rmdir()
# 删除非空文件夹,递归删除法
import shutil
shutil.rmtree('base_test/xx')
5. 装饰器分析
装饰器用于希望增加函数功能,又不可轻易改函数的情形中
from functools import wraps
def test(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
print('funtion name is {}'.format(fun.__name__))
return fun(*args,**kwargs)
return wrapper
import time
def get_time(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
t1 = time.time()
fun(*args,**kwargs)
t2 = time.time()
print('Using Time {}s'.format((t2-t2)*10000000))
return fun(*args,**kwargs) # 如果函数参数有返回值,就必须加上该行,否则可以不加
return wrapper
# 可以在装饰器外部定义函数,来控制装饰器的相关功能
def isReturnDerive(flag=True):
"""
flag:是否返回score_derive, 如果为True则返回, 否则不返回
"""
def decorate(func):
@wraps(func)
def result(*args, **kwargs):
if len(args) < 2:
p = kwargs.get("param", None)
if p:
outLevel = p.get("outLevel", "")
else:
outLevel = ""
else:
outLevel = args[1].get("outLevel", "")
res = func(*args, **kwargs)
if flag and outLevel == "2":
return res
else:
return {"point": res["point"]}
return result
return decorate
@test
@get_time
def fun1(df):
return df.groupby('C').sum()
xx1 = fun1(xx)
6. 捕捉错误机制
# 主要包括raise与assert
if condition:
raise ValueError('错误的描述')
# 用于捕捉,该声明的变量却没有申明的错误
assert condition # 等价于
if not condition:
raise AssertionError()
7. 可视化
- 多bar图同一窗口参考
def ana_oot_features(data1, data2, col): df = pd.DataFrame(index=data1[col].unique()).sort_index() # df可以自动索引对其 df['a'] = data1[col].value_counts(normalize=True) df['b'] = data2[col].value_counts(normalize=True) df['psi'] = (df.a - df.b) * np.log(df.a / df.b) b_with = 0.3 plt.figure(figsize=(5, 3)) plt.bar(x=range(len(df)), height=df.a, color='r', width=b_with, label='data1', alpha=0.6) plt.bar(x=np.arange(len(df)) + b_with + 0.05, height=df.b, color='g', width=b_with, label='data2', alpha=0.6) plt.legend(loc='best') plt.xticks(ticks=range(len(df)),labels=['分箱{}'.format(i) for i in range(len(df))]) plt.xlabel('变量{}'.format(col), fontsize=12) plt.title('PSI = {}'.format(df['psi'].sum()))
8. 正则初步
8.1 sub替换
>>> import re
>>> text = """
... ##################################Var_In_Model###################################
... ws7 = wb.add_worksheet('7.Var_In_Model')
... ws7.hide_gridlines(2)
... var_in_model(wb,ws7)
... """
>>>
>>> def plus(searched):
... value = int(searched.group(1))
... return str(value-1)
...
>>> print(re.sub('(\d+)',plus,text))
"""
##################################Var_In_Model###################################
ws6 = wb.add_worksheet('6.Var_In_Model')
ws6.hide_gridlines(1)
var_in_model(wb,ws6)
"""
9. python设计模式
- 设计模式的作用
设计模式是经过总结、优化的,对我们经常会碰到的一些编程问题的可重用解决方案。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码。反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板。设计模式不会绑定具体的编程语言。
-
设计模式1
- pass
- pass
-
设计模式2
- pass
- pass