官方調研重磅釋出,Pandas或將重構?

呆鳥發表於2019-10-23

原文地址:2019 Pandas User Survey

為指引 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, order=order,
              color='k').set(title="您用 pandas 多久了?",
                             ylabel="")
sns.despine()

order = [
    "剛開始用",
    "偶爾",
    "每週",
    "每天"
]

sns.countplot(y='pandas 使用頻率', data=df, order=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, "重要程度", "關注數量", order=order)
)

一眼就能看出來,優化大規模資料集的處理能力是大家最想要的,從此圖還能觀測出:

  1. Pandas 文件應該加大力度推廣處理大規模資料集的支援庫,如 Dask, vaexmodin
  2. 從對原生字串資料型別與更少的內部複製需求來看,優化記憶體效率也是要值得一做的事情。

緊接其後的優化需求是整數缺失值,這個功能其實已經在 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。我們希望以後能跟蹤這一資料的變化。

相關文章