者: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 · 頭條號簽約
關注我們,第一時間獲知前沿科技動態
字符串(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);
今天的教程就到這里,更多用法請參考谷歌的官方教程。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。