官方調(diào)研重磅發(fā)布,Pandas或?qū)⒅貥?gòu)?
為指引 Pandas 未來開發(fā)方向,Pandas 官方團(tuán)隊(duì)于 2019 年夏搞了一次調(diào)研,這次調(diào)研歷時(shí) 15 天,共有 1250 條反饋數(shù)據(jù)。問卷數(shù)據(jù)保存在 data 文件夾的 2019.csv.zip 文件里。
這里又學(xué)一招,原來 pandas 可以直接從壓縮文件里讀取數(shù)據(jù)文件,原文用的是 .gz 文件,呆鳥這里用 .zip 也可以。
下列代碼讀取問卷數(shù)據(jù),并對(duì) matplotlib、seaborn 的字體進(jìn)行設(shè)置,其中還包括了,如何在 macOS 里顯示中文。
- import pandas as pd
- import seaborn as sns
- import matplotlib.pyplot as plt
- %matplotlib inline
- plt.rcParams['figure.dpi'] = 150
- # 讓 matplotlib 支持中文
- plt.rcParams['font.sans-serif'] = ['SimHei']
- # 讓 seaborn 的文字大一些
- sns.set( font='SimHei', font_scale=1.2)
- # # 讓 MacOS 下的 Matplotlib 與 Seaborn 支持中文
- # plt.rcParams['font.family'] = ['Arial Unicode MS']
- # sns.set_style('whitegrid',{'font.sans-serif':['Arial Unicode MS','Arial']})
- # 用來正常顯示負(fù)號(hào),這里其實(shí)用不上
- plt.rcParams['axes.unicode_minus'] = False
- df = pd.read_csv("data/2019.csv.zip", parse_dates=['日期時(shí)間'], encoding="GBK")
- # df.head()
答卷人分析
絕大多數(shù)答卷人都具有豐富的 pandas 使用經(jīng)驗(yàn),使用頻率也很高。
- order = [
- '少于 3 個(gè)月',
- '3 個(gè)月 至 1 年',
- '1 至 2 年',
- '3 至 5 年',
- '5 年以上',
- ]
- sns.countplot(y='您用 pandas 多久了?',
- data=df, orderorder=order,
- color='k').set(title="您用 pandas 多久了?",
- ylabel="")
- sns.despine()
- order = [
- "剛開始用",
- "偶爾",
- "每周",
- "每天"
- ]
- sns.countplot(y='pandas 使用頻率', data=df, orderorder=order,
- color='k').set(title="pandas 使用頻率",
- ylabel="")
- sns.despine()
為了對(duì)比 Pandas 與 Python 的流行度,我們的問卷里提出了一些 Python 開發(fā)者調(diào)研問卷問過的問題。
90% 的答卷人把 Python 作為主開發(fā)語言,Python 軟件基金會(huì)調(diào)研報(bào)告里的數(shù)據(jù)為 84%。
- pct_format = "{:0.2%}".format
- df['Python 是您的主打語言嗎?'].str.replace(
- "否.*", "否").value_counts(normalize=True).apply(pct_format)
- 是 90.67%
- 否 9.33%
- Name: Python 是您的主打語言嗎?, dtype: object
數(shù)據(jù)顯示 Windows 用戶居多。
- oses = [
- "Linux",
- "Windows",
- "MacOS"
- ]
- df['您用哪種操作系統(tǒng)?'].str.split(';').explode().value_counts().div(
- len(df)).loc[oses].apply(pct_format)
- Linux 61.57%
- Windows 60.21%
- MacOS 42.75%
- Name: 您用哪種操作系統(tǒng)?, dtype: object
這里用 0.25 版推出的 explode 方法定義了個(gè)函數(shù)。
- def split_and_explode(s):
- return s.str.split(";").explode().to_frame()
conda 是最流行的虛擬環(huán)境工具。
- replace = {
- "否,我不用虛擬環(huán)境": "否"
- }
- col = '您是否用過下列 Python 虛擬環(huán)境工具?(多選)'
- sns.countplot(y=col,
- data=split_and_explode(df[col]).replace(replace),
- color='k').set(title='您是否用過下列 Python 虛擬環(huán)境工具?',
- ylabel="")
- sns.despine()
絕大多數(shù)答卷人只用 Python 3。
- df['Python 2 還是 3?'].value_counts(normalize=True).rename(
- index={"2;3": "2 & 3"}).apply(pct_format)
- 3 92.39%
- 2 & 3 6.80%
- 2 0.81%
- Name: Python 2 還是 3?, dtype: object
Pandas API
開源軟件團(tuán)隊(duì)很難了解用戶實(shí)際愛用哪些功能,這次調(diào)研,我們特地提了一些問題,了解了大家的喜好。
CSV 與 Excel 是最流行的文件類型,真是讓人喜憂參半。
- sns.countplot(y='您常用哪個(gè)讀寫器讀取數(shù)據(jù)?',
- data=df['您常用哪個(gè)讀寫器讀取數(shù)據(jù)?'].str.split(';').explode().to_frame(),
- color='k').set(title="您常用哪個(gè)讀寫器讀取數(shù)據(jù)?",
- ylabel="")
- sns.despine();
為了做好重構(gòu) pandas 內(nèi)核的準(zhǔn)備,我們還調(diào)研了 100 列及以上大型 DataFrame 的處理情況。
- sns.countplot(y='處理 100 列及以上大型 DataFrame 的頻率',
- data=df, color='k').set(title="處理大型 DataFrame 的頻率",
- ylabel="");
- sns.despine()
Pandas 增加新擴(kuò)展類型的速度較慢。類別型(Categorical)是最常用的,此外,可空整數(shù)(Nullable Integer)與帶時(shí)區(qū)的 Datetime 也很常用。
- sns.countplot(y='您常用的擴(kuò)展數(shù)據(jù)類型是什么?',
- data=split_and_explode(df['您常用的擴(kuò)展數(shù)據(jù)類型是什么?']),
- color='k').set(title="您常用的擴(kuò)展數(shù)據(jù)類型是什么?",
- ylabel="")
- sns.despine();
我們還提出了一些問題,用以了解用戶最想要的功能。
- sns.countplot(y='您現(xiàn)在最想看到的改進(jìn)是什么?',
- data=df,
- color='k').set(title="您現(xiàn)在最想看到的改進(jìn)是什么?",
- ylabel="")
- sns.despine()
- common = (df[df.columns[df.columns.str.startswith("迫切想要的功能")]]
- .rename(columns=lambda x: x.lstrip("迫切想要的功能 [").rstrip(r"]")))
- counts = (
- common.apply(pd.value_counts)
- .T.stack().reset_index()
- .rename(columns={'level_0': '問題', 'level_1': "重要程度", 0: "關(guān)注數(shù)量"})
- )
- order = ["無關(guān)緊要", "還算有用", '至關(guān)重要']
- g = (
- sns.FacetGrid(counts, col="問題", col_wrap=2,
- aspect=1.5, sharex=False, height=3)
- .map(sns.barplot, "重要程度", "關(guān)注數(shù)量", orderorder=order)
- )
一眼就能看出來,優(yōu)化大規(guī)模數(shù)據(jù)集的處理能力是大家最想要的,從此圖還能觀測(cè)出:
- Pandas 文檔應(yīng)該加大力度推廣處理大規(guī)模數(shù)據(jù)集的支持庫,如 Dask, vaex、 modin。
- 從對(duì)原生字符串?dāng)?shù)據(jù)類型與更少的內(nèi)部復(fù)制需求來看,優(yōu)化內(nèi)存效率也是要值得一做的事情。
緊接其后的優(yōu)化需求是整數(shù)缺失值,這個(gè)功能其實(shí)已經(jīng)在 Pandas 0.24 時(shí)已經(jīng)推出了,但還不是默認(rèn)方式,與其它 pandas API 的兼容性也有待優(yōu)化。
與 NumPy 相比,pandas 略顯激進(jìn)。在即將推出 1.0 版里,我們將廢棄很多功能,并對(duì)很多 API 進(jìn)行翻天覆地的改變,好在大部分人都能接受這樣的改變。
- df['Pandas 能滿足您的需求嗎'].value_counts(normalize=True).apply(pct_format)
- 是 94.89%
- 否 5.11%
- Name: Pandas 能滿足您的需求嗎, dtype: object
不少人,甚至 pandas 維護(hù)人員都覺得 pandas API 的規(guī)模太大了。為了量化這個(gè)問題,我們還向用戶提出了關(guān)于 pandas API 規(guī)模的問題,看看大家覺得是太大,還是太小,還是剛剛好。
- renamer = {"pandas 接口太大了(難找到要用的方法或難記)還是太小了(需要提供更多功能)": "pandas 接口太大嗎?"}
- sns.countplot(y="pandas 接口太大嗎?",
- data=df.rename(columns=renamer),
- color='k').set(title="pandas 接口太大嗎?",
- ylabel="")
- sns.despine();
最后,我們還提出了滿意度的問題,從 1 (非常不滿意)至 5 (非常滿意)。
- sns.countplot(y='Pandas 滿意度',
- data=df[['Pandas 滿意度']].dropna().astype(int),
- color='k').set(title="Pandas 滿意度",
- ylabel="")
- sns.despine();
大多數(shù)人都對(duì) pandas 非常滿意。滿意度的平均分為 4.39。我們希望以后能跟蹤這一數(shù)據(jù)的變化。