先总结一部分吧,边总结边改错
一些代码的使用
定时任务APScheduler:
安装pip install apscheduler
- 调度器Scheduler:
- BlockingScheduler:作为独立进程
- 需要单独编写文件
- BlockingScheduler:作为独立进程
from apscheduler.schedulers.blocking import BlockingScheduler
#创建调度器
a=BlockingScheduler()
#定义定时任务
def my_job():
pass
#向调度器添加定时任务,将参数传给定时函数
a.add_job(my_job,'date',args=[100,'python'])
#启动定时任务调度器工作
a.start()#阻塞主进程
-
调度器BackgroudScheduler:
- 由后台进程完成,不会阻塞,可以与其他程序集成
- 用法与上述基本相同
-
执行器executors:
-
使用方法:
-
from apscheduler.executors.pool import ThreadPoolExecutor ThreadPoolExecutor(max_workers) ThreadPoolExecutor(20) # 最多20个线程同时执行 from apscheduler.executors.pool import ProcessPoolExecutor ProcessPoolExecutor(max_workers) ProcessPoolExecutor(5) # 最多5个进程同时执行 executors = { 'default': ThreadPoolExecutor(20) } scheduler = BackgroundScheduler(executors=executors)
-
-
-
触发器Trigger:
-
date 在特定的时间日期执行
-
from datetime import date # 在2100年11月6日00:00:00执行 sched.add_job(my_job, 'date', run_date=date(2100, 11, 6)) # 在2100年11月6日16:30:05 sched.add_job(my_job, 'date', run_date=datetime(2100, 11, 6, 16, 30, 5)) sched.add_job(my_job, 'date', run_date='2100-11-06 16:30:05') # 立即执行 sched.add_job(my_job, 'date') sched.start()
-
interval 经过指定的时间间隔执行
weeks (int) – number of weeks to wait
days (int) – number of days to wait
hours (int) – number of hours to wait
minutes (int) – number of minutes to wait
seconds (int) – number of seconds to wait
start_date (datetime|str) – starting point for the interval calculation
end_date (datetime|str) – latest possible date/time to trigger on
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations
from datetime import datetime # 每两小时执行一次 sched.add_job(job_function, 'interval', hours=2) # 在2100年10月10日09:30:00 到2104年6月15日的时间内,每两小时执行一次 sched.add_job(job_function, 'interval', hours=2, start_date='2100-10-10 09:30:00', end_date='2104-06-15 11:00:00')
-
cron 按指定的周期执行
- year (int|str) – 4-digit year
- month (int|str) – month (1-12)
- day (int|str) – day of the (1-31)
- week (int|str) – ISO week (1-53)
- day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
- hour (int|str) – hour (0-23)
- minute (int|str) – minute (0-59)
- second (int|str) – second (0-59)
- start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)
- end_date (datetime|str) – latest possible date/time to trigger on (inclusive)
- timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)
# 在6、7、8、11、12月的第三个周五的00:00, 01:00, 02:00和03:00 执行 sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3') # 在2104年5月30日前的周一到周五的5:30执行 sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2104-05-30')
-
使用:
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id') # 添加任务 scheduler.remove_job('my_job_id') # 删除任务 scheduler.pause_job('my_job_id') # 暂定任务 scheduler.resume_job('my_job_id') # 恢复任务 #调整任务调度周期 job.modify(max_instances=6, name='name') scheduler.reschedule_job('my_job_id', trigger='cron', minute='*/5') #停止APScheduler运行 scheduler.shutdown()
-
RPC使用:
-
安装:
- pip install grpc python编写代码的库
- pip install grpcio-tools 将接口描述文件,变为python代码或还原
-
编写接口描述文件.proto:
- 分析接口:
- 接口名称、请求参数、
- 使用编译器生成syud代码
- 编写补充服务器、客户端逻辑代码
- 分析接口:
-
使用:
- 定义接口
- 生成代码库
- 补全代码
- 服务器:
- 服务器本身运行的代码(需要对外提供网络连接和调用请求)
- 被调用的业务逻辑
- 客户端:
- 服务器:
-
HTTP/1.1:
- 设置客户端没过时间间隔请求一次http,hppt是被动的必须接受请求才会回复,不会主动发送数据。
- HTTp 响应频繁
- Comet(长连接轮询)HTTP/1.1 keepalive 默认开启长连接
- 长连接不可靠
- 设置客户端没过时间间隔请求一次http,hppt是被动的必须接受请求才会回复,不会主动发送数据。
-
HTTP/2 还未完全推广
-
WebSocket 80端口(TLS时443端口):
- HTML5 定义的协议
- 目前主流浏览器都支持,使用真正的长连接完成即时通信。
- 建立在单个TCP上的全双工通信协议,双方随时都可以主动向对方发送数据。
- 在双方都可以长连接时三次握手后 ,客户端发起wbesocket通信,http返回101并将协议切换至WebSocket 完成连接(WebSocket 握手)。链接一直存在。;断开时要发送断开声明,完成四次挥手。
Socket.IO:
- 是一个能同时提供轮询和websocket通讯的实时框架工具
- Socket.IO!= websocket,做出过调整,客户端服务器接口必须一致。
- 优点:能自动适配前端轮询或websocket
- 缺点:前后端必须使用socket.IO
Elasticsearch(java):
- 本身是一个基于lucene的数据库
- 可进行分布式,有多个供使用的API接口
- 全文检索
- 结构化搜索
- 分析
- 倒排:
- 根据值查找负荷要求的许多键
- 分析:
- 分词(分词器analyzer),标准化
- 相关性排序:
- Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF
Relational DB -> Databases 数据库 -> Tables 表 -> Rows 行 -> Columns 列
Elasticsearch -> Indices 索引库 -> Types 类型 -> Documents 文档 -> Fields 字段/属性
-
集群:
- 复制集 + 分布式(类似于Reids cluster)
- 分片:主分片,复制分片
- es集群服务器一台机器可包括多个分片,es自动分配
- 自动故障转移
- 创建索引数据库时需要明确主分片复制分片数量
- 默认端口9200
- 查询集群状态信息
- curl -X GET 127.0.0.1:9200/_cluster/health?pretty
-
curl
- linux自带http请求命令
curl -x请求方式 请求网址 -h 请求头 -d请求体
curl -X GET 请求网址/pettr
-
安装IK中文分析器elasticsearch-analysis-ik
-
创库:
-
# 创建blogs名字的库 curl -X PUT 127.0.0.1:9200/blogs -H 'Content-Type:application/json' -d ' { "settings" : { "number_of_shards" : 3, 主分片数量 "number_of_replicas" : 1 每个主分片对应的复制分片的数量 } }' 删库 DELETE /库 修改 PUT /库 按照创库方式重写
-
-
**表(types)映射:**一个库一张表 5.*版本
-
创表:
-
curl -X PUT 127.0.0.1:9200/库/_mappong/表名 -H 'Content-Type:application/json' -d ‘{ "all":{ "analyzer":"ik_max_word" }, "properties":{ "字段名":{ "type":"long", "analyzer":"ik_max_word" #指明中文分析器 "include_in_all":"false"#是否可以被all索引查出 “boost”:设置权重 } } }’
-
-
查表:
- curl -X PUT 127.0.0.1:9200/库/_mappong/表名/pretty
-
改表:
-
新增字段:
- 不需要写all层
-
不允许修改老子段。只能新建库,表
-
允许数据迁移到新表
-
curl -X POST 127.0.0.1:9200/_reindex -H 'Content-Type:application/json' -d '{ "soure":{ “index”:老库名字 } }, "dest":{ “index”:新库名字 } '
-
删除旧库改新库的名字
curl -X PUT 127.0.0.1:9200/新库名/_lias/要改的名字
-
-
-
文档(数据):
-
增:
curl -X PUT 127.0.0.1:9200/库名/表名/增加数据的指定id(可以不指定) -H 'Content-Type:application/json' -d “{数据}”
-
查:
- 主键查询:
curl -X GTT 127.0.0.1:9200/库名/表名/数据id
- 主键查询:
-
-
-
数据导入:
-
从mysql导入
- Logstash工具
- 修改其中配置文件
tar -zxvf mysql-connector-java-8.0.13.tar.gz
-
-
搜索查询:
- 所有文本:
- curl -X GET 127.0.0.1:9200/库名/表名/_serach?_source=只显示规定字段\分割
- 默认分页10条
- %20表示空格 q=查询字段(_all):查询关键词
- 所有文本:
-
Elasticsearch是如何实现Master选举的?
- 对所有可以成为master的节点根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
- 如果对某个节点的投票数达到一定的值(过半)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。
- 补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能。
numpy:
释放了GIL锁
-
z.T z.transpose()矩阵转置 z.reshape()设置矩阵
-
z.loadtxt。(文件名,切割字符delimiter,展示类型dtype,unpack是否转置)
-
z.arange(定义数组)
-
nan =不是数字 numpy.nan赋值 inf无穷
-
z.astype()转换类型
-
z.sum(,axis=0/行 1/列) 总和
-
z.mean 均值 median 中值 max min ptp极值 std标准差
-
np.zeros()全为0 np.ones
-
np.hastack(数据,添加列,水平拼接)
-
np.vstack((竖直拼接))
-
np.eye()创建方正
-
np.argmax/min(数据,axis=0)获取当前行/列最大/小值的位置
-
np.random.randit(范围,范围(行,列))整数.uniform小数 .seed()随机一样
-
a = b.copy() 互不影响,直接复制会影响
-
索引、切片**:
- 取行:z[行数],不连续z[[2,3,5,8]]
- 取列:z[:,列] 以行的形式显示
- t.[t<10]=3 将其中满足条件的替换
- t.where(t>10, 100,200)
- t.clip(10,20)只存在10-20之间的数
-
nan&±inf:
- numpy.count_nonzero(z) 显示所有不为0的个数
- np.isnan 效果和np.nan != np.nan相同
pandas:
-
Series (一维,带标签的数组):
- pd.Series(【数据】,index=指定索引)可放字典
- t.as type(设置类型)
- 取值:像字典一样,也可通过索引 t【1,3,5】
- t.index 显示所有索引, 可迭代
- t.value 显示所有值, 遍历、
len
、list什么的 - 读取外部数据:
- pd.read_csv(当前目录文件)
- pd.read_sql(sql语句,mysql链接)
-
DataFrame( 二维,Series 的容器):
- 为x,y两处索引index,columns
pd.DataFrame(np.arange(12).reshape(3,4),index=list(“abc”),columns=list(‘wxyz’))
- 先从数据库读取在放入DataFrame中,放入前可筛选字段。
- t.index 显示行索引 .columns 列索引
- t.values t.shape t.dtypes t.ndim(维度)
- t.head(显示前几行) .tail
- t.info 展示t的概括 t.describe 展示数字的概括
- t.sort_values(by=排序的列,ascending=升序降序)
- 切片:
t[:][字段]
得到某一行前几个- t.loc[行,列] t.iloc[行列的数字]
- 判断时分开t[(800<t[字段])&(t【字段】<1000)]
- 字符串t[字段].str.
- len 长度 split 切割 contains 包含 replace 替换
- +tolist转换为列表
- pd.isnull(t)判断是否为nan,如何处理
- t.dropna(axis=0,how=‘any’有一个nan就删一行|all全部为空才删,inplace=true相当于all)
- t.fillna(填充所有nan的数据)or t.mean()
-
常用统计方法:
- t.tolist()转换为列表 .unique()唯一
- np.array(数据).flatten()将数据展开1为(不推荐)
- 数组.join(数组,how=连接方式,left_on=要合并的行数)合并行,必须有相同的行或列
- left inner right outer并集
- 数组.merge(数组)合并列
-
分组聚合:
- t.groupby(by=分组的字段,可写列表)
- 分组后可用.聚合函数
- .count .sum .mean品均值 .median中位数 .std标准差 .var方差
-
索引:t.index() t.index=重新赋值索引
- t.set_index(字段,drop=false(保留字段))设置索引 .index.unque()返回index唯一值
- t.swaplevel() 从内层开始取值
-
时间序列:
- pd.date_range(start开始时间,end,fred频率10d就是10天,periods生成个数)fred:
- D天 b工作日 h小时 t分 s秒 m日历日 bm工作时
- t[时间字段] = pd.to_datetime(t.[时间字段],format=’%Y‘设定类型)
- pandas重采样
- t.reasmple(‘M/D/H’) 时间戳
- 时间段 pd.PeriodUndex()
- pd.date_range(start开始时间,end,fred频率10d就是10天,periods生成个数)fred:
单元测试:
assert(断言)
-
单元测试模块unittest:
-
导入main中的执行路径,并根据当前文件修改路径 import unittest #对assert进行了封装 import craete_app import 配置中的测试类 class TestClass(unittest.TestCase): #首先执行,测试的准备工作 def setUp(self): pass #利用python提供http请求模块urllib2、request发送请求,执行前必须开启服务器。 #flask框架提供了单元测试客户端对象,发送http请求,这种情况不需要运行flask服务器。a = app.test_client(),a.get()就会发送get请求 #导入craete_app 封装一个test模式下的配置 app = craete_app(集成测试类) self.client = app.test_client() #会在测试代码完成后执行,测试后的扫尾工作。例:清理测试添加数据库的数据 def tearDown(self): pass #自己的测试代码,函数名必须test_开头 def test_xxxxx(self): pass resp = self.client.get(‘直接写路径’) #resp是响应对象,resp.data是原始响应体数据,resp.atatus_code状态码 self.assertEqual(resp.atatus_code, 200) #检测等值 #解析json字符串 导入json resp_dict = json.loads(resp.data) self.assertIn(数据的键,数据集) #数据体是否存在字段 if __name__ == '__main__': unittest.main()
-
一般在app同级目录(工程目录)下建立test文件夹:
- 测试正常情况与异常情况
-
web框架Gunicorn&uWSGI:
- Gunicorn -w 进程数(CPU*1.2倍) -b ip:端口 文件名 --access–logfile 访问日志 --error–logfile 错误日志
Supervisor(必须使用python):
python实现的进程管理工具,只要需要自动维护进程管理都可以使用,不局限于web开发。
可以帮助我们看护进程,若进程以外退出supervisor可以自动重启
特征提取:
- 字典提取:
from sklearn.feature_extraction import DictVectorizer
创建 DictVectorizer(sparse=false就是矩阵)对象 使用.fit_transform(字典列表) one-hot编码
matplotlib:
-
plt.figure(figsize=(20, 8), dpi=80) #创建画布 plt.plot(x, y_shanghai) #生成图像 x_ticks_label = ["11点{}分".format(i) for i in x] #构造x刻度 y_ticks = range(40) #构造Y刻度 # 修改x,y轴坐标的刻度显示 plt.xticks(x[::5], x_ticks_label[::5]) plt.yticks(y_ticks[::5]) plt.grid(True, linestyle='--', alpha=0.5) #添加网格 #添加x,y轴名字以及标题信息 plt.xlabel("时间") plt.ylabel("温度") plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20) plt.savefig("./test.png") #保存图像 plt.show() #显示图像 多次绘图是只需要在pt.plot就可以(同一个图) plt.plot(x, y_beijing, color='r', linestyle='--') #加lable才会显示图例 plt.legend(loc="best") #显示图例 #创建多个画布可用下标使用,通过添加set_方法设置不同画布 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100) 折线图 pt.plot 散点图pt.scatter 柱状图plt.bar(x, width(图形宽度), align='center'(对齐方式), **kwargs(颜色)) 直方图 matplotlib.pyplot.hist(x, bins=None(组距)) 饼图 plt.pie(x, labels=(每部分名称),autopct=(占比显示指定%1.2f%%),colors)
-
图形颜色:
颜色字符 风格字符 r 红色 - 实线 g 绿色 - - 虚线 b 蓝色 -. 点划线 w 白色 : 点虚线 c 青色 ’ ’ 留空、空格 m 洋红 y 黄色 k 黑色 -
配置中文:
-
解决方案一: 下载中文字体(黑体,看准系统版本) 步骤一:下载 SimHei 字体(或者其他的支持中文显示的字体也行) 步骤二:安装字体 linux下:拷贝字体到 usr/share/fonts 下: sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf windows和mac下:双击安装 步骤三:删除~/.matplotlib中的缓存文件 cd ~/.matplotlib rm -r * 步骤四:修改配置文件matplotlibrc vi ~/.matplotlib/matplotlibrc 将文件内容修改为: font.family : sans-serif font.sans-serif : SimHei axes.unicode_minus : False 解决方案二: from pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] = False
-
-