Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
者:Roman Orac
魚羊 編譯整理
量子位 報道 | 公眾號 QbitAI
數(shù)據(jù)分析,如何能錯過 Pandas 。
現(xiàn)在,數(shù)據(jù)科學家 Roman Orac 分享了他在工作中相見恨晚的 Pandas 使用技巧。
了解了這些技巧,能讓你在學習、使用 Pandas 的時候更加高效。
話不多說,一起學習一下~
用 Pandas 做數(shù)據(jù)分析,最大的亮點當屬 DataFrame。不過,在展示成果的時候,常常需要把 DataFrame 轉(zhuǎn)成另一種格式。
Pandas 在這一點上其實十分友好,只需添加一行代碼。
DataFrame 轉(zhuǎn) HTML
如果你需要用 HTML 發(fā)送自動報告,那么 to_html 函數(shù)了解一下。
比如,我們先設定這樣一個 DataFrame:
import numpy as np
import pandas as pd
import random
n = 10
df = pd.DataFrame(
{
"col1": np.random.random_sample(n),
"col2": np.random.random_sample(n),
"col3": [[random.randint(0, 10) for _ in range(random.randint(3, 5))] for _ in range(n)],
}
)
用上 to_html,就可以將表格轉(zhuǎn)入 html 文件:
df_html = df.to_html()
with open(‘a(chǎn)nalysis.html’, ‘w’) as f: f.write(df_html)
與之配套的,是 read_html 函數(shù),可以將 HTML 轉(zhuǎn)回 DataFrame。
DataFrame 轉(zhuǎn) LaTeX
如果你還沒用過 LaTeX 寫論文,強烈建議嘗試一下。
要把 DataFrame 值轉(zhuǎn)成 LaTeX 表格,也是一個函數(shù)就搞定了:
df.to_latex()
DataFrame 轉(zhuǎn) Markdown
如果你想把代碼放到 GitHub 上,需要寫個 README。
這時候,你可能需要把 DataFrame 轉(zhuǎn)成 Markdown 格式。
Pandas 同樣為你考慮到了這一點:
print(df.to_markdown())
注:這里還需要 tabulate 庫
DataFrame 轉(zhuǎn) Excel
說到這里,給同學們提一個小問題:導師/老板/客戶要你提供 Excel 格式的數(shù)據(jù),你該怎么做?
當然是——
df.to_excel(‘a(chǎn)nalysis.xlsx’)
需要注意的是,如果你沒有安裝過 xlwt 和 openpyxl 這兩個工具包,需要先安裝一下。
另外,跟 HTML 一樣,這里也有一個配套函數(shù):read_excel,用來將excel數(shù)據(jù)導入pandas DataFrame。
DataFrame 轉(zhuǎn)字符串
轉(zhuǎn)成字符串,當然也沒問題:
df.to_string()
此前,Roman Orac 還曾分享過 5 個他覺得十分好用,但大家可能沒有那么熟悉的 Pandas 技巧。
1、data_range
從外部 API 或數(shù)據(jù)庫獲取數(shù)據(jù)時,需要多次指定時間范圍。
Pandas 的 data_range 覆蓋了這一需求。
import pandas as pd
date_from = “2019-01-01”
date_to = “2019-01-12”
date_range = pd.date_range(date_from, date_to, freq=”D”)
print(date_range)
freq = “D”/“M”/“Y”,該函數(shù)就會分別返回按天、月、年遞增的日期。
2、合并數(shù)據(jù)
當你有一個名為left的DataFrame:
和名為right的DataFrame:
想通過關鍵字“key”把它們整合到一起:
實現(xiàn)的代碼是:
df_merge = left.merge(right, on = ‘key’, how = ‘left’, indicator = True)
3、最近合并(Nearest merge)
在處理股票或者加密貨幣這樣的財務數(shù)據(jù)時,價格會隨著實際交易變化。
針對這樣的數(shù)據(jù),Pandas提供了一個好用的功能,merge_asof。
該功能可以通過最近的key(比如時間戳)合并DataFrame。
舉個例子,你有一個存儲報價信息的DataFrame。
還有一個存儲交易信息的DataFrame。
現(xiàn)在,你需要把兩個DataFrame中對應的信息合并起來。
最新報價和交易之間可能有10毫秒的延遲,或者沒有報價,在進行合并時,就可以用上 merge_asof。
pd.merge_asof(trades, quotes, on=”timestamp”, by=’ticker’, tolerance=pd.Timedelta(‘10ms’), direction=‘backward’)
4、創(chuàng)建Excel報告
在Pandas中,可以直接用DataFrame創(chuàng)建Excel報告。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=["a", "b", "c"])
report_name = 'example_report.xlsx'
sheet_name = 'Sheet1'
writer = pd.ExcelWriter(report_name, engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name, index=False)
不只是數(shù)據(jù),還可以添加圖表。
# define the workbook
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# create a chart line object
chart = workbook.add_chart({'type': 'line'})
# configure the series of the chart from the spreadsheet
# using a list of values instead of category/value formulas:
# [sheetname, first_row, first_col, last_row, last_col]
chart.add_series({
'categories': [sheet_name, 1, 0, 3, 0],
'values': [sheet_name, 1, 1, 3, 1],
})
# configure the chart axes
chart.set_x_axis({'name': 'Index', 'position_axis': 'on_tick'})
chart.set_y_axis({'name': 'Value', 'major_gridlines': {'visible': False}})
# place the chart on the worksheet
worksheet.insert_chart('E2', chart)
# output the excel file
writer.save()
注:這里需要 XlsxWriter 庫
5、節(jié)省磁盤空間
Pandas在保存數(shù)據(jù)集時,可以對其進行壓縮,其后以壓縮格式進行讀取。
先搞一個 300MB 的 DataFrame,把它存成 csv。
df = pd.DataFrame(pd.np.random.randn(50000,300))
df.to_csv(‘random_data.csv’, index=False)
壓縮一下試試:
df.to_csv(‘random_data.gz’, compression=’gzip’, index=False)
文件就變成了136MB。
gzip壓縮文件可以直接讀取:
df = pd.read_csv(‘random_data.gz’)
這一份Pandas技巧筆記,暫且說到這里。各位同學都做好筆記了嗎?
Talk is cheap, show me the code。學會了,就用起來吧
— 完 —
量子位 QbitAI · 頭條號簽約
關注我們,第一時間獲知前沿科技動態(tài)
.本文為公測版,一旦發(fā)現(xiàn)有任何錯誤內(nèi)容,會立即進行修復,請持續(xù)關注本站。
2.本文在正式版之前會不斷的邀請各路黑客大手進行評價測試,歡迎提出異議。
本文僅針對網(wǎng)站部分,本文會對typecho,wordpress進行測試
如果你root端口為22,并且密碼是123456,就沒必要往下看了。
網(wǎng)站環(huán)境為linux tengine/nginx mariaDB,同理,apache也有相關設置,百度實驗下即可。
**本文會闡述以下部分
1.基礎權限控制
2.執(zhí)行目錄限制
3.PHP的限制
4.webshell寫入與執(zhí)行
5.權限細分,必須寫入的目錄**
1.基礎權限控制
什么叫基礎權限?在LNMP架構下,nginx+php-fpm架構需要什么權限?
這里我們先來看一下默認權限
默認我們的nginx運行用戶是nginx,而php-fpm的默認用戶是apache,默認用戶安全嗎?
看一下webshell
uid=48(apache) gid=48(apache) groups=48(apache)
很明顯,我們的默認用戶是apache
我們使用shell新建一個目錄,很明顯,我們是無法建立文件夾的
mkdir: cannot create directory `1': Permission denied
在網(wǎng)上很多教程會告訴我們,吧nginx和phpfpm改成同樣的用戶,我們看看會發(fā)生什么。
[root@gov 1]# sudo -u nginx mkdir 1
[root@gov 1]# ll
total 4
drwxr-xr-x 2 nginx nginx 4096 Aug 19 18:08 1
沒錯,這是一項愚蠢的決定!
所以默認權限是安全的嗎?并不是,你忘了上傳目錄,我們看下上傳目錄的權限
drwxrwx--- 3 nginx apache 4096 Aug 14 17:09 uploads
沒錯,上傳目錄的存在就是放大權限,如果php沒有寫入權限,那么他就無法上傳圖片。
假設,我們手里有一個0day,現(xiàn)在我要用它來getshell
我會選擇uploads目錄
-rw-r--r-- 1 apache apache 0 Aug 19 18:11 1.php
完美寫入,接著你的站就會被玩壞了,寫入shell后我們可以插件數(shù)據(jù)庫鏈接密碼,進網(wǎng)站后臺,脫褲,掛黑鏈等等等等
網(wǎng)站里有幾個目錄是默認可以寫入的?在你的網(wǎng)站目錄下執(zhí)行l(wèi)s -l
通常plugins themes uploads
這三個目錄都是可以寫入的。
你還有其他目錄可以寫入?趕緊修改權限吧!
加入我們的網(wǎng)站在/var/www/html/root
那么下面的命令是極好的,對于必須要有上傳權限的uploads目錄,我們下面再說
chown -R nginx.apache html
find /var/www/html/root -type d -exec chmod 750 {} \;
find /var/www/html/root -not -type d -exec chmod 640 {} \;
chmod 770 /var/www/html/root/uploads -R
如果你有某些插件也需要寫入權限,給他權限,并認真看下面的內(nèi)容。
2.執(zhí)行目錄限制
我們的apache權限有多大呢?相同的網(wǎng)站擁有相同的權限。
默認情況下,我們的apache權限能瀏覽大部分目錄。最要命的問題在于,他可以跨站執(zhí)行,從你的網(wǎng)站一直接執(zhí)行到網(wǎng)站二。
我們需要給他一個限制,每個虛擬主機一個單獨的限制,沒錯就是open_basedir。
這里我們需要特別的技巧,每個虛擬機都要限制
這樣虛擬主機將只允許在網(wǎng)站目錄和tmp目錄執(zhí)行,而不能穿越到其他目錄
在烏云有一篇討論繞過open_basedir
的文章,所以open_basedir
只能讓你更安全而不是徹底安全,所以你還需要往下看。
server {
location ~ .*\.php(\/.*)*$ {
#include pathinfo.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";
3.PHP的限制
我們想一個另類解決辦法,如何限制webshell的執(zhí)行?
在php.ini里,我們可以選擇關閉某些不安全的函數(shù)
但是由于php這玩意分之多又復雜,這里只能整理出一部分不安全的函數(shù)。
直接添加到php.ini最后面即可
disable_functions=exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,dl,popen,pcntl_exec,socket_accept,socket_bind,socket_clear_error,socket_close,socket_connect,socket_create_listen,socket_create_pair,socket_create,socket_get_option,socket_getpeername,socket_getsockname,socket_last_error,socket_listen,socket_read,socket_recv,socket_recvfrom,socket_select,socket_send,socket_sendto,socket_set_block,socket_set_nonblock,socket_set_option,socket_shutdown,socket_strerror,socket_write,stream_socket_server,disk_total_space,disk_free_space,diskfreespace,getrusage,get_current_user,getmyuid,getmypid,dl,leak,listen,chgrp,link,symlink,dlopen,proc_nice,proc_get_stats,proc_terminate,shell_exec,sh2_exec,posix_getpwuid,posix_getgrgid,posix_kill,ini_restore,mkfifo,dbmopen,dbase_open,filepro,filepro_rowcount,posix_mkfifo,putenv,sleep,chmod,chown,chroot,ini_set,phpinfo,proc_get_status,error_log,syslog,readlink,putenv
在看webshell,我們會發(fā)現(xiàn)里面空空如也了,并不能執(zhí)行命令了。
4.webshell寫入與執(zhí)行
現(xiàn)在我們的網(wǎng)站已經(jīng)很安全了,他能否更加安全?
現(xiàn)在,我們就要說說我們必須要有執(zhí)行權限的upload目錄了,nginx同樣提供了解決方案
location ~ /(usr/uploads)/.*\.(php|php5)?$
{
deny all;
}
這個時候我們打開uploads中的php文件會提示403
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
我們的效果得到驗證,即使寫入也不能執(zhí)行。
5.必須要寫入權限但是又包含php文件的目錄。
例如我的用的郵件通知插件目錄內(nèi)有cache和和log目錄,是必須有寫入權限的
這里千萬不要犯懶,直接給CommentToMail
寫入
location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/CommentToMail/log)/.*\.(php|php5)?$
{
deny all;
}
既可以實現(xiàn)寫入文件,又可以讓php無法執(zhí)行。
總結,上面的所有配置:
用戶與PHP運行權限分離
nginx:apache
執(zhí)行目錄限制
open_basedir
PHP函數(shù)限制
php.ini
特殊目錄關閉PHP解析
deny all
權限細分
xx|xx|xx
歡迎拍磚,同時 起司靶場v2 上線,完全脫離安全鎖之類的軟件,歡迎測試。
起司靶場v2
DF轉(zhuǎn)HTML在網(wǎng)絡應用中越來越受到重視,PDF作為一種電子文件格式廣泛應用于各種場景,例如在線教育、電子商務等。但是PDF作為一種專有格式,在網(wǎng)絡應用中存在一定的限制,比如不便于搜索引擎索引的問題。因此,將PDF轉(zhuǎn)換為HTML格式就顯得尤為重要。HTML作為一種開放標準,在瀏覽器中的兼容性強,結構清晰,方便搜索引擎抓取,能很好地解決PDF在網(wǎng)絡應用中的一些問題。那你們知道PDF怎么轉(zhuǎn)HTML嗎?下面就為大家分享幾種不錯的方法。
以下是可以將PDF轉(zhuǎn)HTML的方法:
一、使用全能PDF轉(zhuǎn)換助手將PDF轉(zhuǎn)HTML
這是一款功能豐富的PDF轉(zhuǎn)換工具,支持將PDF文件轉(zhuǎn)換為多種格式,包括HTML。它具有直觀的操作界面和簡單易用的操作流程,即使對于初學者也很友好。
【轉(zhuǎn)換步驟】
步驟一:打開軟件后,選擇“PDF轉(zhuǎn)HTML”功能。
步驟二:添加PDF文件,接著調(diào)整“頁碼選擇”,然后點擊“開始轉(zhuǎn)換”即可。
二、使用HODO將PDF轉(zhuǎn)HTML
這是一個受歡迎的PDF轉(zhuǎn)HTML平臺,它專注于提供出色的轉(zhuǎn)換質(zhì)量和準確性。它的轉(zhuǎn)換引擎使用先進的算法,可以保留原始PDF文件的布局和格式,并將其轉(zhuǎn)換為高質(zhì)量的HTML文件。
【轉(zhuǎn)換步驟】
步驟一:使用瀏覽器打開平臺的網(wǎng)站后,選擇“PDFto HTML”功能。
步驟二:添加PDF文件,接著平臺就會自動識別并進行轉(zhuǎn)換。
三、使用ZAMZAR將PDF轉(zhuǎn)HTML
這是另一個在線文件轉(zhuǎn)換平臺,提供多種文件格式之間的轉(zhuǎn)換服務,包括PDF到HTML的轉(zhuǎn)換。這個平臺非常方便使用,我們不需要安裝任何軟件。
【轉(zhuǎn)換步驟】
步驟一:打開平臺后,通過“ChooseFiles”上傳PDF文件。
步驟二:在“WebFormats”中選擇“HTML”格式,接著點擊“ConvertNow”就能完成轉(zhuǎn)換。
看完這篇文章,大家都學會PDF怎么轉(zhuǎn)HTML了嗎?以上三種方法都可以很好地實現(xiàn)PDF到HTML的轉(zhuǎn)換,幫助我們利用PDF內(nèi)容在網(wǎng)頁中發(fā)揮更廣泛的價值。具體選擇哪種方法,需要大家結合自身實際轉(zhuǎn)換需求來定。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。