整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

不容错过的Pandas小技巧:万能转格式、轻松合并、压缩数据

者:Roman Orac
鱼羊 编译整理
量子位 报道 | 公众号 QbitAI

数据分析,如何能错过 Pandas

现在,数据科学家 Roman Orac 分享了他在工作中相见恨晚的 Pandas 使用技巧。

了解了这些技巧,能让你在学习、使用 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’)

需要注意的是,如果你没有安装过 xlwtopenpyxl 这两个工具包,需要先安装一下。

另外,跟 HTML 一样,这里也有一个配套函数:read_excel,用来将excel数据导入pandas DataFrame。

DataFrame 转字符串

转成字符串,当然也没问题:

df.to_string()

5个鲜为人知的Pandas技巧

此前,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 · 头条号签约

关注我们,第一时间获知前沿科技动态

字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined)。

JavaScript 拥有动态类型

JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型:

实例

var x; // x 为 undefined

var x = 5; // 现在 x 为数字

var x = "John"; // 现在 x 为字符串

JavaScript 字符串

字符串是存储字符(比如 "Bill Gates")的变量。

字符串可以是引号中的任意文本。您可以使用单引号或双引号:

实例

var carname="Volvo XC60";

var carname='Volvo XC60';

您可以在字符串中使用引号,只要不匹配包围字符串的引号即可:

实例

var answer="It's alright";

var answer="He is called 'Johnny'";

var answer='He is called "Johnny"';

JavaScript 数字

JavaScript 只有一种数字类型。数字可以带小数点,也可以不带:

实例

var x1=34.00; //使用小数点来写

var x2=34; // //不使用小数点来写

极大或极小的数字可以通过科学(指数)计数法来书写:

实例

var y=123e5; // 12300000

var z=123e-5; // 0.00123

JavaScript 布尔

布尔(逻辑)只能有两个值:true 或 false。

var x=true;

var y=false;

布尔常用在条件测试中。您将在本教程稍后的章节中学到更多关于条件测试的知识。

JavaScript 数组

下面的代码创建名为 cars 的数组:

var cars=new Array();

cars[0]="Saab";

cars[1]="Volvo";

cars[2]="BMW";

或者 (condensed array):

var cars=new Array("Saab","Volvo","BMW");

或者 (literal array):

实例

var cars=["Saab","Volvo","BMW"];

数组下标是基于零的,所以第一个项目是 [0],第二个是 [1],以此类推。

JavaScript 对象

对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:

var person={firstname:"John", lastname:"Doe", id:5566};

上面例子中的对象 (person) 有三个属性:firstname、lastname 以及 id。

空格和折行无关紧要。声明可横跨多行:

var person={

firstname : "John",

lastname : "Doe",

id : 5566

};

对象属性有两种寻址方式:

实例

name=person.lastname;

name=person["lastname"];

Undefined 和 Null

Undefined 这个值表示变量不含有值。

可以通过将变量的值设置为 null 来清空变量。

实例

cars=null;

person=null;

声明变量类型

当您声明新变量时,可以使用关键词 "new" 来声明其类型:

var carname=new String;

var x= new Number;

var y= new Boolean;

var cars= new Array;

var person= new Object;

JavaScript 变量均为对象。当您声明一个变量时,就创建了一个新的对象。

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

件是 Web 开发的方向,现在的热点是 JavaScript 组件,但是 HTML 组件未来可能更有希望。 本文就介绍 HTML 组件的基础知识:自定义元素(custom elements)。

一、浏览器处理

我们一般都使用标准的 HTML 元素。

<p>Hello World</p>

上面代码中,<p>就是标准的 HTML 元素。

如果使用非标准的自定义元素,会有什么结果?

<greeting>Hello World</greeting>

上面代码中,<greeting>就是非标准元素,浏览器不认识它。这段代码的运行结果是,浏览器照常显示Hello World,这说明浏览器并没有过滤这个元素。

现在,为自定义元素加上样式。

greeting {
 display: block;
 font-size: 36px;
 color: red;
}

运行结果如下。

接着,使用脚本操作这个元素。

function customTag(tagName, fn){
 Array
 .from(document.getElementsByTagName(tagName))
 .forEach(fn);
}
function greetingHandler(element) {
 element.innerHTML = '你好,世界';
} 
customTag('greeting', greetingHandler);

运行结果如下。

这说明,浏览器对待自定义元素,就像对待标准元素一样,只是没有默认的样式和行为。这种处理方式是写入 HTML5 标准的。

“User agents must treat elements and attributes that they do not understand as semantically neutral; leaving them in the DOM (for DOM processors), and styling them according to CSS (for CSS processors), but not inferring any meaning from them.”

上面这段话的意思是,浏览器必须将自定义元素保留在 DOM 之中,但不会任何语义。除此之外,自定义元素与标准元素都一致。

事实上,浏览器提供了一个HTMLUnknownElement对象,所有自定义元素都是该对象的实例。

var tabs = document.createElement('tabs');
tabs instanceof HTMLUnknownElement // true
tabs instanceof HTMLElement // true

上面代码中,tabs是一个自定义元素,同时继承了HTMLUnknownElement和HTMLElement接口。

获取方式:

1.在你手机的右上角有【关注】选项,或点击我的头像,点击关注!(关注我)

2.关注后,手机客户端点击我的主页面,右上角有私信,请私信发我:编程

电脑已经设置好了关键词自动回复,自动领取就好了!这几天上万个消息,真的回复不过来,所以回复的时候请注意关键词!

其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里请私信我“编程”不管你是小白还是大牛欢迎入住大家一起交流成长。小编会在里面不定期分享干货源码,包括我精心整理的一份零基础教程。欢迎各位感兴趣的的小伙伴。

学习思路:


二、HTML import

有了自定义元素,就可以写出语义性非常好的 HTML 代码。

<share-buttons>
 <social-button type="weibo">
 <a href="...">微博</a>
 </social-button>
 <social-button type="weixin">
 <a href="...">微信</a>
 </social-button>
</share-buttons>

上面的代码,一眼就能看出语义。

如果将<share-buttons>元素的样式与脚本,封装在一个 HTML 文件share-buttons.html之中,这个元素就可以复用了。

使用的时候,先引入share-buttons.html。

<link rel="import" href="share-buttons.html">

然后,就可以在网页中使用<share-buttons>了。

<article>
 <h1>Title</h1>
 <share-buttons/>
 ... ...
</article>

HTML imports 的更多用法可以参考教程(1,2)。目前只有 Chrome 浏览器支持这个语法。


三、Custom Elements 标准

HTML5 标准规定了自定义元素是合法的。然后,W3C 就为自定义元素制定了一个单独的 Custom Elements 标准。

它与其他三个标准放在一起—- HTML Imports,HTML Template、Shadow DOM—-统称为 Web Components 规范。目前,这个规范只有 Chrome 浏览器支持。

Custom Elements 标准对自定义元素的名字做了限制。

“自定义元素的名字必须包含一个破折号(-)所以<x-tags>、<my-element>和<my-awesome-app>都是正确的名字,而<tabs>和<foo_bar>是不正确的。这样的限制使得 HTML 解析器可以分辨那些是标准元素,哪些是自定义元素。”

注意,一旦名字之中使用了破折号,自定义元素就不是HTMLUnknownElement的实例了。

var xTabs = document.createElement('x-tabs');
xTabs instanceof HTMLUnknownElement // false
xTabs instanceof HTMLElement // true

Custom Elements 标准规定了,自定义元素的定义可以使用 ES6 的class语法。

// 定义一个 <my-element></my-element>
class MyElement extends HTMLElement {...}
window.customElements.define('my-element', MyElement);

上面代码中,原生的window.customElements对象的define方法用来定义 Custom Element。该方法接受两个参数,第一个参数是自定义元素的名字,第二个参数是一个 ES6 的class。

这个class使用get和set方法定义 Custom Element 的某个属性。

class MyElement extends HTMLElement {
 get content() {
 return this.getAttribute('content');
 }
 set content(val) {
 this.setAttribute('content', val);
 }
}

有了这个定义,网页之中就可以插入<my-element>了。

<my-element content="Custom Element">
 Hello
</my-element>

处理脚本如下。

function customTag(tagName, fn){
 Array
 .from(document.getElementsByTagName(tagName))
 .forEach(fn);
}
function myElementHandler(element) {
 element.textConent = element.content;
}
customTag('my-element', myElementHandler);

运行结果如下。

ES6 Class 的一个好处是,可以很容易地写出继承类。

class MyNewElement extends MyElement {
 // ...
}
customElements.define('my-new-element', MyNewElement);

今天的教程就到这里,更多用法请参考谷歌的官方教程。