前言
目錄
1.Jupyter Notebook哪里舒服了
2.Pandas常用的時間處理操作
1.Jupyter Notebook哪里舒服了
1.1 一些優(yōu)點
- 是一個交互式筆記本,網(wǎng)頁版的IDE,便捷持久化輸出和分享,支持多種語言如R\Spark等
- 不需要用vim在服務(wù)器上編碼了
jupyter可以部署到服務(wù)器,通過設(shè)置的密碼登錄
或者通過ssh建立一個本機和服務(wù)器的端口映射,端口映射命令ssh -N -f -L localhost:8889:localhost:8888 remote_name
在本地瀏覽器可以進行:上傳文件,下載導(dǎo)出為.html .md .pdf.py等,運行python,bash命令,交互式的可視化圖像
- 運行模式
- 一個文件由多個cell組成,每個cell是一個可編輯執(zhí)行和展示的小單元
- 變量,函數(shù),包 等都保存在內(nèi)存中,不需要重復(fù)運行,可實時查看
- 輸出結(jié)果也會保留再頁面上,便于預(yù)處理數(shù)據(jù)和展示,相互不影響
- 最后一行會直接輸出結(jié)果,免去print
- plot出來的圖片會保存在頁面內(nèi),甚至可以進行選取平移等操作,支持markdown,支持github渲染,讓分享更快捷
- 有許多擴展插件:Configurable nbextensions(單獨安裝):
- Variable Inspector:實時查看變量
- Code prettify:格式化代碼
- Table of Contents:顯示md的目錄結(jié)構(gòu),類似書簽
- 一鍵隱藏代碼或者輸出結(jié)果等等
- 冷凍部分代碼不運行不可更改
- 許多魔法命令,如
- %magic:查看所有魔法命令
- %%timeit : 測試整個單元中代碼的執(zhí)行時間
!+linux命令 就可以直接運行,還用什么shell
?pd.qcut() 顯示相關(guān)函數(shù)的說明文檔,附帶sample
%run ./note.ipynb 可以直接運行其他的notebook,其渲染的圖片也會顯示在當(dāng)前的shell中
%load ./hello_world.py 載入py文件的代碼到當(dāng)前cell里
%store data 將在不同的notebook間共享變量,輸入%store -r data 即可加載
%%writefile pythoncode.py 可以把當(dāng)前cell的內(nèi)容保存到外部文件中區(qū),%%pycat 可以查看
%prun some_useless_slow_function() 顯示每個內(nèi)部函數(shù)的耗時情況
LaTex公式:用兩個$$包含住P(A \mid B) = \frac{P(B \mid A) , P(A)}{P(B)}即可
%%bash %%ruby... 在不同cell開頭加上聲明,就可以運行不同內(nèi)核的代碼了
conda install -c r r-essentials 安裝r等不同的內(nèi)核命令
1.2 Notebook 頁面介紹及使用
-
工具欄:
從左到右依次是 Cell的常規(guī)操作(移動,中斷,重啟);Cell類型(md還是運行的代碼);隱藏當(dāng)前cell的代碼;全部隱藏;冰凍cell使其不能run或者change;監(jiān)控變量;字的大小;書簽展示;美化代碼等
image.png -
目錄 這個插件我覺得非常的有用,值得推薦!
你可以先用markdown寫一下算法的大致流程,然后一個一個步驟的去完成,同時也會清晰的看到自己目前正在編寫第幾個步驟(黃色標識),點擊即可跳轉(zhuǎn),想必都體驗過一行一行找代碼的痛苦吧
image.png
- 主頁面以及Cell
cell就是一個命令窗口,里面可以放markdown文本或者要執(zhí)行的代碼
第一個是代碼塊,運行一次,結(jié)果很持久;后面是渲染的一個圖,分享給別人打開就能看到圖,不需要再次運行
image.png
1.3 Tips:
- 兩種狀態(tài):命令模式(Command Mode)與編輯模式(Edit Mode),編輯下可以ctrl-enter運行cell內(nèi)的代碼,或者Esc切換到命令狀態(tài);shitf-enter運行當(dāng)前代碼并移動到下一個cell
- esc后敲
- s保存(可以回滾到最近一個保存的checkpoint);
- m將cell變成一個markdown;
- 數(shù)字變成md的Heading級別;
- a在上方插入一個cell;
- b在下方插入一個cell;
- z回滾最近的操作;
- l展示行數(shù)
- 創(chuàng)建的時候可以選擇不同的kernel,比如py2,py3,R,spark等
2. Pandas常用的時間處理操作
- 基礎(chǔ)操作
# 生成
pd.DataFrame([1,2,3,4])
# 讀取文件,json sql html...
pd.read_csv('a.csv')
# 寫入文件
df.to_csv()
# 合并
pd.merge()
pd.concat()
# 移除重復(fù)數(shù)據(jù)(去重)
df.duplicated()
# df.map() df.apply() 可以將操作應(yīng)用到一列或者每一個元素
# 選取
df[df['column'] == -1] = 1
- 更多內(nèi)容看 十分鐘了解pandas
- 時間序列的一些操作
- 時間戳->日期 + 時區(qū)轉(zhuǎn)換
# 時區(qū)問題 # 單個字符串 時間戳->日期的轉(zhuǎn)換 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是協(xié)調(diào)世界時,時區(qū)是以UTC的偏移量的形式表示的,但是注意設(shè)置utc=True,是讓pandas對象具有時區(qū)性質(zhì),對于一列進行轉(zhuǎn)換的,會造成轉(zhuǎn)換錯誤 unit='ms' 設(shè)置粒度是到毫秒級別的 上面的輸出就是: Timestamp('2019-04-11 16:19:00+0800', tz='Asia/Shanghai') ''' # 列轉(zhuǎn)換 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')#先賦予標準時區(qū),再轉(zhuǎn)換到東八區(qū) 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') # 索引設(shè)置為時間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 需要設(shè)置為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 往前數(shù) pd.bdate_range(end=end, periods=20) # start 往后數(shù) 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'