官方調研重磅發布,Pandas或將重構?
為指引 Pandas 未來開發方向,Pandas 官方團隊于 2019 年夏搞了一次調研,這次調研歷時 15 天,共有 1250 條反饋數據。問卷數據保存在 data 文件夾的 2019.csv.zip 文件里。
這里又學一招,原來 pandas 可以直接從壓縮文件里讀取數據文件,原文用的是 .gz 文件,呆鳥這里用 .zip 也可以。
下列代碼讀取問卷數據,并對 matplotlib、seaborn 的字體進行設置,其中還包括了,如何在 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']})
- # 用來正常顯示負號,這里其實用不上
- plt.rcParams['axes.unicode_minus'] = False
- df = pd.read_csv("data/2019.csv.zip", parse_dates=['日期時間'], encoding="GBK")
- # df.head()
答卷人分析
絕大多數答卷人都具有豐富的 pandas 使用經驗,使用頻率也很高。
- order = [
- '少于 3 個月',
- '3 個月 至 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()
為了對比 Pandas 與 Python 的流行度,我們的問卷里提出了一些 Python 開發者調研問卷問過的問題。
90% 的答卷人把 Python 作為主開發語言,Python 軟件基金會調研報告里的數據為 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
數據顯示 Windows 用戶居多。
- oses = [
- "Linux",
- "Windows",
- "MacOS"
- ]
- df['您用哪種操作系統?'].str.split(';').explode().value_counts().div(
- len(df)).loc[oses].apply(pct_format)
- Linux 61.57%
- Windows 60.21%
- MacOS 42.75%
- Name: 您用哪種操作系統?, dtype: object
這里用 0.25 版推出的 explode 方法定義了個函數。
- def split_and_explode(s):
- return s.str.split(";").explode().to_frame()
conda 是最流行的虛擬環境工具。
- replace = {
- "否,我不用虛擬環境": "否"
- }
- col = '您是否用過下列 Python 虛擬環境工具?(多選)'
- sns.countplot(y=col,
- data=split_and_explode(df[col]).replace(replace),
- color='k').set(title='您是否用過下列 Python 虛擬環境工具?',
- ylabel="")
- sns.despine()
絕大多數答卷人只用 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
開源軟件團隊很難了解用戶實際愛用哪些功能,這次調研,我們特地提了一些問題,了解了大家的喜好。
CSV 與 Excel 是最流行的文件類型,真是讓人喜憂參半。
- sns.countplot(y='您常用哪個讀寫器讀取數據?',
- data=df['您常用哪個讀寫器讀取數據?'].str.split(';').explode().to_frame(),
- color='k').set(title="您常用哪個讀寫器讀取數據?",
- ylabel="")
- sns.despine();
為了做好重構 pandas 內核的準備,我們還調研了 100 列及以上大型 DataFrame 的處理情況。
- sns.countplot(y='處理 100 列及以上大型 DataFrame 的頻率',
- data=df, color='k').set(title="處理大型 DataFrame 的頻率",
- ylabel="");
- sns.despine()
Pandas 增加新擴展類型的速度較慢。類別型(Categorical)是最常用的,此外,可空整數(Nullable Integer)與帶時區的 Datetime 也很常用。
- sns.countplot(y='您常用的擴展數據類型是什么?',
- data=split_and_explode(df['您常用的擴展數據類型是什么?']),
- color='k').set(title="您常用的擴展數據類型是什么?",
- ylabel="")
- sns.despine();
我們還提出了一些問題,用以了解用戶最想要的功能。
- sns.countplot(y='您現在最想看到的改進是什么?',
- data=df,
- color='k').set(title="您現在最想看到的改進是什么?",
- 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: "關注數量"})
- )
- order = ["無關緊要", "還算有用", '至關重要']
- g = (
- sns.FacetGrid(counts, col="問題", col_wrap=2,
- aspect=1.5, sharex=False, height=3)
- .map(sns.barplot, "重要程度", "關注數量", orderorder=order)
- )
一眼就能看出來,優化大規模數據集的處理能力是大家最想要的,從此圖還能觀測出:
- Pandas 文檔應該加大力度推廣處理大規模數據集的支持庫,如 Dask, vaex、 modin。
- 從對原生字符串數據類型與更少的內部復制需求來看,優化內存效率也是要值得一做的事情。
緊接其后的優化需求是整數缺失值,這個功能其實已經在 Pandas 0.24 時已經推出了,但還不是默認方式,與其它 pandas API 的兼容性也有待優化。
與 NumPy 相比,pandas 略顯激進。在即將推出 1.0 版里,我們將廢棄很多功能,并對很多 API 進行翻天覆地的改變,好在大部分人都能接受這樣的改變。
- df['Pandas 能滿足您的需求嗎'].value_counts(normalize=True).apply(pct_format)
- 是 94.89%
- 否 5.11%
- Name: Pandas 能滿足您的需求嗎, dtype: object
不少人,甚至 pandas 維護人員都覺得 pandas API 的規模太大了。為了量化這個問題,我們還向用戶提出了關于 pandas API 規模的問題,看看大家覺得是太大,還是太小,還是剛剛好。
- 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();
大多數人都對 pandas 非常滿意。滿意度的平均分為 4.39。我們希望以后能跟蹤這一數據的變化。