者:Roman Orac
鱼羊 编译整理
量子位 报道 | 公众号 QbitAI
数据分析,如何能错过 Pandas 。
现在,数据科学家 Roman Orac 分享了他在工作中相见恨晚的 Pandas 使用技巧。
了解了这些技巧,能让你在学习、使用 Pandas 的时候更加高效。
话不多说,一起学习一下~
用 Pandas 做数据分析,最大的亮点当属 DataFrame。不过,在展示成果的时候,常常需要把 DataFrame 转成另一种格式。
Pandas 在这一点上其实十分友好,只需添加一行代码。
DataFrame 转 HTML
如果你需要用 HTML 发送自动报告,那么 to_html 函数了解一下。
比如,我们先设定这样一个 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,就可以将表格转入 html 文件:
df_html = df.to_html()
with open(‘analysis.html’, ‘w’) as f: f.write(df_html)
与之配套的,是 read_html 函数,可以将 HTML 转回 DataFrame。
DataFrame 转 LaTeX
如果你还没用过 LaTeX 写论文,强烈建议尝试一下。
要把 DataFrame 值转成 LaTeX 表格,也是一个函数就搞定了:
df.to_latex()
DataFrame 转 Markdown
如果你想把代码放到 GitHub 上,需要写个 README。
这时候,你可能需要把 DataFrame 转成 Markdown 格式。
Pandas 同样为你考虑到了这一点:
print(df.to_markdown())
注:这里还需要 tabulate 库
DataFrame 转 Excel
说到这里,给同学们提一个小问题:导师/老板/客户要你提供 Excel 格式的数据,你该怎么做?
当然是——
df.to_excel(‘analysis.xlsx’)
需要注意的是,如果你没有安装过 xlwt 和 openpyxl 这两个工具包,需要先安装一下。
另外,跟 HTML 一样,这里也有一个配套函数:read_excel,用来将excel数据导入pandas DataFrame。
DataFrame 转字符串
转成字符串,当然也没问题:
df.to_string()
此前,Roman Orac 还曾分享过 5 个他觉得十分好用,但大家可能没有那么熟悉的 Pandas 技巧。
1、data_range
从外部 API 或数据库获取数据时,需要多次指定时间范围。
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”,该函数就会分别返回按天、月、年递增的日期。
2、合并数据
当你有一个名为left的DataFrame:
和名为right的DataFrame:
想通过关键字“key”把它们整合到一起:
实现的代码是:
df_merge = left.merge(right, on = ‘key’, how = ‘left’, indicator = True)
3、最近合并(Nearest merge)
在处理股票或者加密货币这样的财务数据时,价格会随着实际交易变化。
针对这样的数据,Pandas提供了一个好用的功能,merge_asof。
该功能可以通过最近的key(比如时间戳)合并DataFrame。
举个例子,你有一个存储报价信息的DataFrame。
还有一个存储交易信息的DataFrame。
现在,你需要把两个DataFrame中对应的信息合并起来。
最新报价和交易之间可能有10毫秒的延迟,或者没有报价,在进行合并时,就可以用上 merge_asof。
pd.merge_asof(trades, quotes, on=”timestamp”, by=’ticker’, tolerance=pd.Timedelta(‘10ms’), direction=‘backward’)
4、创建Excel报告
在Pandas中,可以直接用DataFrame创建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)
不只是数据,还可以添加图表。
# 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、节省磁盘空间
Pandas在保存数据集时,可以对其进行压缩,其后以压缩格式进行读取。
先搞一个 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 · 头条号签约
关注我们,第一时间获知前沿科技动态
.本文为公测版,一旦发现有任何错误内容,会立即进行修复,请持续关注本站。
2.本文在正式版之前会不断的邀请各路黑客大手进行评价测试,欢迎提出异议。
本文仅针对网站部分,本文会对typecho,wordpress进行测试
如果你root端口为22,并且密码是123456,就没必要往下看了。
网站环境为linux tengine/nginx mariaDB,同理,apache也有相关设置,百度实验下即可。
**本文会阐述以下部分
1.基础权限控制
2.执行目录限制
3.PHP的限制
4.webshell写入与执行
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
在网上很多教程会告诉我们,吧nginx和phpfpm改成同样的用户,我们看看会发生什么。
[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,现在我要用它来getshell
我会选择uploads目录
-rw-r--r-- 1 apache apache 0 Aug 19 18:11 1.php
完美写入,接着你的站就会被玩坏了,写入shell后我们可以插件数据库链接密码,进网站后台,脱裤,挂黑链等等等等
网站里有几个目录是默认可以写入的?在你的网站目录下执行ls -l
通常plugins themes uploads
这三个目录都是可以写入的。
你还有其他目录可以写入?赶紧修改权限吧!
加入我们的网站在/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
如果你有某些插件也需要写入权限,给他权限,并认真看下面的内容。
2.执行目录限制
我们的apache权限有多大呢?相同的网站拥有相同的权限。
默认情况下,我们的apache权限能浏览大部分目录。最要命的问题在于,他可以跨站执行,从你的网站一直接执行到网站二。
我们需要给他一个限制,每个虚拟主机一个单独的限制,没错就是open_basedir。
这里我们需要特别的技巧,每个虚拟机都要限制
这样虚拟主机将只允许在网站目录和tmp目录执行,而不能穿越到其他目录
在乌云有一篇讨论绕过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的执行?
在php.ini里,我们可以选择关闭某些不安全的函数
但是由于php这玩意分之多又复杂,这里只能整理出一部分不安全的函数。
直接添加到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,我们会发现里面空空如也了,并不能执行命令了。
4.webshell写入与执行
现在我们的网站已经很安全了,他能否更加安全?
现在,我们就要说说我们必须要有执行权限的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.
我们的效果得到验证,即使写入也不能执行。
5.必须要写入权限但是又包含php文件的目录。
例如我的用的邮件通知插件目录内有cache和和log目录,是必须有写入权限的
这里千万不要犯懒,直接给CommentToMail
写入
location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/CommentToMail/log)/.*\.(php|php5)?$
{
deny all;
}
既可以实现写入文件,又可以让php无法执行。
总结,上面的所有配置:
用户与PHP运行权限分离
nginx:apache
执行目录限制
open_basedir
PHP函数限制
php.ini
特殊目录关闭PHP解析
deny all
权限细分
xx|xx|xx
欢迎拍砖,同时 起司靶场v2 上线,完全脱离安全锁之类的软件,欢迎测试。
起司靶场v2
DF转HTML在网络应用中越来越受到重视,PDF作为一种电子文件格式广泛应用于各种场景,例如在线教育、电子商务等。但是PDF作为一种专有格式,在网络应用中存在一定的限制,比如不便于搜索引擎索引的问题。因此,将PDF转换为HTML格式就显得尤为重要。HTML作为一种开放标准,在浏览器中的兼容性强,结构清晰,方便搜索引擎抓取,能很好地解决PDF在网络应用中的一些问题。那你们知道PDF怎么转HTML吗?下面就为大家分享几种不错的方法。
以下是可以将PDF转HTML的方法:
一、使用全能PDF转换助手将PDF转HTML
这是一款功能丰富的PDF转换工具,支持将PDF文件转换为多种格式,包括HTML。它具有直观的操作界面和简单易用的操作流程,即使对于初学者也很友好。
【转换步骤】
步骤一:打开软件后,选择“PDF转HTML”功能。
步骤二:添加PDF文件,接着调整“页码选择”,然后点击“开始转换”即可。
二、使用HODO将PDF转HTML
这是一个受欢迎的PDF转HTML平台,它专注于提供出色的转换质量和准确性。它的转换引擎使用先进的算法,可以保留原始PDF文件的布局和格式,并将其转换为高质量的HTML文件。
【转换步骤】
步骤一:使用浏览器打开平台的网站后,选择“PDFto HTML”功能。
步骤二:添加PDF文件,接着平台就会自动识别并进行转换。
三、使用ZAMZAR将PDF转HTML
这是另一个在线文件转换平台,提供多种文件格式之间的转换服务,包括PDF到HTML的转换。这个平台非常方便使用,我们不需要安装任何软件。
【转换步骤】
步骤一:打开平台后,通过“ChooseFiles”上传PDF文件。
步骤二:在“WebFormats”中选择“HTML”格式,接着点击“ConvertNow”就能完成转换。
看完这篇文章,大家都学会PDF怎么转HTML了吗?以上三种方法都可以很好地实现PDF到HTML的转换,帮助我们利用PDF内容在网页中发挥更广泛的价值。具体选择哪种方法,需要大家结合自身实际转换需求来定。
*请认真填写需求信息,我们会在24小时内与您取得联系。