Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

作者:Roman Orac
魚羊 編譯整理
量子位 報道 | 公眾號 QbitAI

數據分析,如何能錯過 Pandas

現在,數據科學家 Roman Orac 分享了他在工作中相見恨晚的 Pandas 使用技巧。

瞭解了這些技巧,能讓你在學習、使用 Pandas 的時候更加高效。

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

話不多說,一起學習一下~

Pandas實用技巧

用 Pandas 做數據分析,最大的亮點當屬 DataFrame。不過,在展示成果的時候,常常需要把 DataFrame 轉成另一種格式。

Pandas 在這一點上其實十分友好,只需添加一行代碼。

DataFrame 轉 HTML

如果你需要用 HTML 發送自動報告,那麼 to_html 函數了解一下。

比如,我們先設定這樣一個 DataFrame:

<code>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)],
    }
)/<code>

用上 to_html,就可以將表格轉入 html 文件:

<code>df_html = df.to_html()
with open(‘analysis.html’, ‘w’) as f: f.write(df_html)/<code>
Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

與之配套的,是 read_html 函數,可以將 HTML 轉回 DataFrame。

DataFrame 轉 LaTeX

如果你還沒用過 LaTeX 寫論文,強烈建議嘗試一下。

要把 DataFrame 值轉成 LaTeX 表格,也是一個函數就搞定了:

<code>df.to_latex()/<code>
Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

DataFrame 轉 Markdown

如果你想把代碼放到 GitHub 上,需要寫個 README。

這時候,你可能需要把 DataFrame 轉成 Markdown 格式。

Pandas 同樣為你考慮到了這一點:

<code>print(df.to_markdown())/<code>
Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

注:這裡還需要 tabulate 庫

DataFrame 轉 Excel

說到這裡,給同學們提一個小問題:導師/老闆/客戶要你提供 Excel 格式的數據,你該怎麼做?

當然是——

<code>df.to_excel(‘analysis.xlsx’)/<code>

需要注意的是,如果你沒有安裝過 xlwtopenpyxl 這兩個工具包,需要先安裝一下。

另外,跟 HTML 一樣,這裡也有一個配套函數:read_excel,用來將excel數據導入pandas DataFrame。

DataFrame 轉字符串

轉成字符串,當然也沒問題:

<code>df.to_string()/<code>

5個鮮為人知的Pandas技巧

此前,Roman Orac 還曾分享過 5 個他覺得十分好用,但大家可能沒有那麼熟悉的 Pandas 技巧。

1、data_range

從外部 API 或數據庫獲取數據時,需要多次指定時間範圍。

Pandas 的 data_range 覆蓋了這一需求。

<code>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)/<code>

freq = “D”/“M”/“Y”,該函數就會分別返回按天、月、年遞增的日期。

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

2、合併數據

當你有一個名為left的DataFrame:

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

和名為right的DataFrame:

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

想通過關鍵字“key”把它們整合到一起:

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

實現的代碼是:

<code>df_merge = left.merge(right, on = ‘key’, how = ‘left’, indicator = True)/<code>

3、最近合併(Nearest merge)

在處理股票或者加密貨幣這樣的財務數據時,價格會隨著實際交易變化。

針對這樣的數據,Pandas提供了一個好用的功能,merge_asof

該功能可以通過最近的key(比如時間戳)合併DataFrame。

舉個例子,你有一個存儲報價信息的DataFrame。

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

還有一個存儲交易信息的DataFrame。

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

現在,你需要把兩個DataFrame中對應的信息合併起來。

最新報價和交易之間可能有10毫秒的延遲,或者沒有報價,在進行合併時,就可以用上 merge_asof。

<code>pd.merge_asof(trades, quotes, on=”timestamp”, by=’ticker’, tolerance=pd.Timedelta(‘10ms’), direction=‘backward’)/<code>
Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

4、創建Excel報告

在Pandas中,可以直接用DataFrame創建Excel報告。

<code>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)/<code>

不只是數據,還可以添加圖表。

<code># 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()/<code>

注:這裡需要 XlsxWriter 庫

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

5、節省磁盤空間

Pandas在保存數據集時,可以對其進行壓縮,其後以壓縮格式進行讀取。

先搞一個 300MB 的 DataFrame,把它存成 csv。

<code>df = pd.DataFrame(pd.np.random.randn(50000,300))
df.to_csv(‘random_data.csv’, index=False)/<code>

壓縮一下試試:

<code>df.to_csv(‘random_data.gz’, compression=’gzip’, index=False)/<code>

文件就變成了136MB。

Pandas還能這麼玩?花式導數據、合併、壓縮,數據分析更高效

gzip壓縮文件可以直接讀取:

<code>df = pd.read_csv(‘random_data.gz’)/<code>

這一份Pandas技巧筆記,暫且說到這裡。各位同學都做好筆記了嗎?

Talk is cheap, show me the code。學會了,就用起來吧

— 完 —

量子位 QbitAI · 頭條號簽約

關注我們,第一時間獲知前沿科技動態


分享到:


相關文章: