官方調研重磅發佈,Pandas或將重構?

原文地址:2019 Pandas User Surveyhtml

爲指引 Pandas 將來開發方向,Pandas 官方團隊於 2019 年夏搞了一次調研,此次調研歷時 15 天,共有 1250 條反饋數據。問卷數據保存在 data 文件夾的 2019.csv.zip 文件裏。python

這裏又學一招,原來 pandas 能夠直接從壓縮文件裏讀取數據文件,原文用的是 .gz 文件,呆鳥這裏用 .zip 也能夠。

下列代碼讀取問卷數據,並對 matplotlib、seaborn 的字體進行設置,其中還包括了,如何在 macOS 裏顯示中文。app

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 是最流行的虛擬環境工具。spa

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

開源軟件團隊很難了解用戶實際愛用哪些功能,此次調研,咱們特意提了一些問題,瞭解了你們的喜愛。3d

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。咱們但願之後能跟蹤這一數據的變化。

相關文章
相關標籤/搜索