前言
目录
1.Jupyter Notebook哪里舒服了
2.Pandas常用的时间处理操作
1.Jupyter Notebook哪里舒服了
1.1 一些优点
- 是一个交互式笔记本,网页版的IDE,便捷持久化输出和分享,支持多种语言如R\Spark等
- 不需要用vim在服务器上编码了
jupyter可以部署到服务器,通过设置的密码登录
或者通过ssh建立一个本机和服务器的端口映射,端口映射命令ssh -N -f -L localhost:8889:localhost:8888 remote_name
在本地浏览器可以进行:上传文件,下载导出为.html .md .pdf.py等,运行python,bash命令,交互式的可视化图像
- 运行模式
- 一个文件由多个cell组成,每个cell是一个可编辑执行和展示的小单元
- 变量,函数,包 等都保存在内存中,不需要重复运行,可实时查看
- 输出结果也会保留再页面上,便于预处理数据和展示,相互不影响
- 最后一行会直接输出结果,免去print
- plot出来的图片会保存在页面内,甚至可以进行选取平移等操作,支持markdown,支持github渲染,让分享更快捷
- 有许多扩展插件:Configurable nbextensions(单独安装):
- Variable Inspector:实时查看变量
- Code prettify:格式化代码
- Table of Contents:显示md的目录结构,类似书签
- 一键隐藏代码或者输出结果等等
- 冷冻部分代码不运行不可更改
- 许多魔法命令,如
- %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 页面介绍及使用
-
工具栏:
image.png
从左到右依次是 Cell的常规操作(移动,中断,重启);Cell类型(md还是运行的代码);隐藏当前cell的代码;全部隐藏;冰冻cell使其不能run或者change;监控变量;字的大小;书签展示;美化代码等
-
目录 这个插件我觉得非常的有用,值得推荐!
image.png
你可以先用markdown写一下算法的大致流程,然后一个一个步骤的去完成,同时也会清晰的看到自己目前正在编写第几个步骤(黄色标识),点击即可跳转,想必都体验过一行一行找代码的痛苦吧
- 主页面以及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'
网友评论