美文网首页
在jupyter中利用pandas处理时间序列

在jupyter中利用pandas处理时间序列

作者: 卢冠男 | 来源:发表于2019-02-02 10:23 被阅读0次

    前言

    目录

    1.Jupyter Notebook哪里舒服了

    2.Pandas常用的时间处理操作

    1.Jupyter Notebook哪里舒服了

    1.1 一些优点

    1. 是一个交互式笔记本,网页版的IDE,便捷持久化输出和分享,支持多种语言如R\Spark等
    2. 不需要用vim在服务器上编码了

    jupyter可以部署到服务器,通过设置的密码登录
    或者通过ssh建立一个本机和服务器的端口映射,端口映射命令ssh -N -f -L localhost:8889:localhost:8888 remote_name
    在本地浏览器可以进行:上传文件,下载导出为.html .md .pdf.py等,运行python,bash命令,交互式的可视化图像

    1. 运行模式
      • 一个文件由多个cell组成,每个cell是一个可编辑执行和展示的小单元
      • 变量,函数,包 等都保存在内存中,不需要重复运行,可实时查看
      • 输出结果也会保留再页面上,便于预处理数据和展示,相互不影响
      • 最后一行会直接输出结果,免去print
    2. plot出来的图片会保存在页面内,甚至可以进行选取平移等操作,支持markdown,支持github渲染,让分享更快捷
    3. 有许多扩展插件:Configurable nbextensions(单独安装):
      • Variable Inspector:实时查看变量
      • Code prettify:格式化代码
      • Table of Contents:显示md的目录结构,类似书签
      • 一键隐藏代码或者输出结果等等
      • 冷冻部分代码不运行不可更改
    4. 许多魔法命令,如
      • %magic:查看所有魔法命令
      • %%timeit : 测试整个单元中代码的执行时间

    !+linux命令 就可以直接运行,还用什么shell
    ?pd.qcut() 显示相关函数的说明文档,附带sample
    %run ./note.ipynb 可以直接运行其他的notebook,其渲染的图片也会显示在当前的shell中
    %load ./hello_world.py 载入py文件的代码到当前cell里
    %store data 将在不同的notebook间共享变量,输入%store -r data 即可加载
    %%writefile pythoncode.py 可以把当前cell的内容保存到外部文件中区,%%pycat 可以查看
    %prun some_useless_slow_function() 显示每个内部函数的耗时情况
    LaTex公式:用两个$$包含住P(A \mid B) = \frac{P(B \mid A) , P(A)}{P(B)}即可
    %%bash %%ruby... 在不同cell开头加上声明,就可以运行不同内核的代码了
    conda install -c r r-essentials 安装r等不同的内核命令

    1.2 Notebook 页面介绍及使用

    • 工具栏:
      从左到右依次是 Cell的常规操作(移动,中断,重启);Cell类型(md还是运行的代码);隐藏当前cell的代码;全部隐藏;冰冻cell使其不能run或者change;监控变量;字的大小;书签展示;美化代码等

      image.png
    • 目录 这个插件我觉得非常的有用,值得推荐!
      你可以先用markdown写一下算法的大致流程,然后一个一个步骤的去完成,同时也会清晰的看到自己目前正在编写第几个步骤(黄色标识),点击即可跳转,想必都体验过一行一行找代码的痛苦吧

      image.png
    • 主页面以及Cell

    cell就是一个命令窗口,里面可以放markdown文本或者要执行的代码
    第一个是代码块,运行一次,结果很持久;后面是渲染的一个图,分享给别人打开就能看到图,不需要再次运行

    image.png

    1.3 Tips:

    • 两种状态:命令模式(Command Mode)与编辑模式(Edit Mode),编辑下可以ctrl-enter运行cell内的代码,或者Esc切换到命令状态;shitf-enter运行当前代码并移动到下一个cell
    • esc后敲
      • s保存(可以回滚到最近一个保存的checkpoint);
      • m将cell变成一个markdown;
      • 数字变成md的Heading级别;
      • a在上方插入一个cell;
      • b在下方插入一个cell;
      • z回滚最近的操作;
      • l展示行数
    • 创建的时候可以选择不同的kernel,比如py2,py3,R,spark等

    2. Pandas常用的时间处理操作

    • 基础操作
    # 生成
    pd.DataFrame([1,2,3,4])
    # 读取文件,json sql html...
    pd.read_csv('a.csv')
    # 写入文件
    df.to_csv()
    # 合并
    pd.merge()
    pd.concat()
    # 移除重复数据(去重)
    df.duplicated()
    # df.map() df.apply() 可以将操作应用到一列或者每一个元素
    # 选取
    df[df['column'] == -1] = 1
    
    • 更多内容看 十分钟了解pandas
    • 时间序列的一些操作
    • 时间戳->日期 + 时区转换
      # 时区问题
      # 单个字符串 时间戳->日期的转换
      pd.to_datetime(df['time_stamp'][1],unit='ms',utc=True).tz_convert('Asia/Shanghai')
      pd.to_datetime(1554970740000,unit='ms').tz_localize('UTC').tz_convert('Asia/Shanghai')
      Timestamp('2019-04-11 16:19:00+0800', tz='Asia/Shanghai')
      '''
      utc是协调世界时,时区是以UTC的偏移量的形式表示的,但是注意设置utc=True,是让pandas对象具有时区性质,对于一列进行转换的,会造成转换错误
      unit='ms' 设置粒度是到毫秒级别的
      上面的输出就是:
      Timestamp('2019-04-11 16:19:00+0800', tz='Asia/Shanghai')
      '''
      # 列转换 2.7需要加dt,localize  
      df = pd.DataFrame([1554970740000, 1554970800000, 1554970860000],columns = ['time_stamp'])
      pd.to_datetime(df['time_stamp'],unit='ms').dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')#先赋予标准时区,再转换到东八区
      pd.to_datetime(df['time_stamp'],unit = 'ms').astype('datetime64[ns, Asia/Shanghai]')
      '''
      上面的正确输出是这样子:
          2019-04-11 16:19:00+08:00
          2019-04-11 16:20:00+08:00
          2019-04-11 16:21:00+08:00
      错误的是这样子:
      pd.to_datetime(df['time_stamp'],unit = 'ms', utc=True)
          2019-04-11 08:19:00
          2019-04-11 08:20:00
          2019-04-11 08:21:00
      pd.to_datetime(df['time_stamp'],unit = 'ms', utc=True).dt.tz_localize('Asia/Shanghai')
          2019-04-11 08:19:00+08:00
          2019-04-11 08:20:00+08:00
          2019-04-11 08:21:00+08:00
          
      '''
      # 格式化 单个字符串没有dt
      pd.to_datetime(df['time_stamp'],unit = 'ms').astype('datetime64[ns, Asia/Shanghai]').dt.strftime('%Y-%m-%d %H:%M')
      # 索引设置为时间datetime后,可以这么操作:
      df['2019-01']
      df['2019-01-24 01:41':'2019-01-24 01:43']
      time_stamp  value  
      2019-01-24 01:41:00+08:00   1548294060000 
      2019-01-24 01:42:00+08:00   1548294120000 
      2019-01-24 01:43:00+08:00   1548294180000 
      
      • 改变时间间隔
      df['time'].asfreq('45Min', method='pad')
      
      • 字符生成日期格式
      pd.Timestamp('2012-05-01')
      Timestamp('2012-05-01 00:00:00')
      
      • 时间重采样,粒度
      # index 需要设置为timedate类型: 
      df.index = pd.to_datetime()
      df.resample('24H',how='count')
      
      • 时间的生成
      # 每个月末
      pd.date_range(start, end, freq='BM')
      # 每隔一周
      pd.date_range(start, end, freq='W')
      # end 往前数
      pd.bdate_range(end=end, periods=20)
      # start 往后数
      pd.bdate_range(start=start, periods=20)
      
      • 选取时间-isin:
      df['date'] = pd.date_range('2017-1-1', periods=30, freq='D')
      in_range_df = df[df["date"].isin(pd.date_range("2017-01-15", "2017-01-20"))]
      ...
      
      • 选取时间-between_time('23:00','00:00')
      back_time.between_time('23:00','00:00')
      out:
      2018-12-19 23:29:00+08:00    1545262140000
      2018-12-21 23:55:00+08:00    1545436500000
      
      • 比较
      # 直接比较 datetime64 类型的column
      df_time['date']>'2018-12-19'
      

    相关文章

      网友评论

          本文标题:在jupyter中利用pandas处理时间序列

          本文链接:https://www.haomeiwen.com/subject/wxcssqtx.html