python一些代码的使用

先总结一部分吧,边总结边改错

一些代码的使用

定时任务APScheduler:

安装pip install apscheduler

  • 调度器Scheduler:
    • 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/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()

单元测试:

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
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值