17

提高效率,拒绝重复!7个Pandas数据分析高级技巧

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxNTc0Mjg0Mg%3D%3D&%3Bmid=2653297976&%3Bidx=1&%3Bsn=a682e11a58a01bca076da4450b9629b4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Vj6R3qb.jpg!web

标星★ 置顶 公众号      爱你们    

作者:Revert       编译:1+1=6

AfmYBfv.png!web

1

用df.groupby ().iter ()分析数据样本

与Excel相比,在Jupyter Notebook中逐行或逐组地查看数据集通常比较困难。一个有用的技巧是 使用生成器并使用 Ctrl + Enter 而不是 Shift + Enter 来迭代地查看同一个单元格中的不同样本。

首先,使用  . g roupby() (或 .iterrows() )生成器创建一个单元格,并添加 ._ iter__()

generator = df.groupby(['identifier']).__iter__()

然后,使用键盘快捷键 Ctrl + Enter ,尽可能多地运行以下单元格,以观察对你来说最重要的数据:

group_id, grouped_data = generator.__next__()
print(group_id) 
grouped_data

下面是一个分析泰坦尼克号数据集中的乘客的例子,这些乘客的机票号码完全相同。你没有能力把每一组乘客单独分开,所以使用这种方法可以让你用一种非常简单的方法分析每一组乘客:

Zn6Nb2j.gif

2

用于数据探索和数据质量评估技巧

在数据科学中,我们常常倾向于从头开始编写我们的数据分析代码。因为所有的数据集都是不同的。然而,有一个神奇的  pandas_profiling  包使得这种逻辑毫无意义。这个包实际上自动化了数据探索和数据质量评估步骤!看一看:

yiuE3ub.gif

显然,它不能解决所有的数据分析问题,例如,如果数据中有文本变量。但它应该是你开始分析任何数据集的方式!

3

多重chain

一旦你理解了可以使用链接方法组合多个操作,Pandas就变得非常有趣。链接基本上是在相同的代码“行”中添加操作。

运行下面的代码:

  • 在数据集中添加新列( .merge

  • 计算女乘客比例( .apply(female_proportion)

  • 乘客人数超过一人的团体( df.Ticket.value_counts()>1

  • 拥有相同的票号( .groupby('Ticket ')

我们不需要创建新的dataframes,新的变量等任何新的东西。链接方法允许你把你的想法“翻译”成实际的操作。

def female_proportion(dataframe):
    return (dataframe.Sex=='female').sum() / len(dataframe)

female_proportion(df)
df.merge(
    df.loc[
        df.Ticket.isin(
            df.Ticket.value_counts().loc[
                df.Ticket.value_counts()>1
            ].index
        )
    ].groupby('Ticket').apply(female_proportion) \
     .reset_index().rename(columns={0:'proportion_female'}),
     how='left', on='Ticket'
)

下面的例子也是chain方法的一个很好的例子:

4

绘制系数/特征重要性与风格

如果你在做机器学习,如果用外行的话来解释清楚你的机器学习模型你觉得特别困难。 这里有一个方法可以帮助你,那就是 在你的模型中有一个很好的视觉系数或者特征重要性。

Yju2Afe.png!web

以下是我们一直在重复使用的可视化结果(避免重新造轮子):

pd.DataFrame({
    'variable': variables,
    'coefficient': model.coef_[0]
}) \
    .round(decimals=2) \
    .sort_values('coefficient', ascending=False) \
    .style.bar(color=['grey', 'lightblue'], align='zero')

结果如下:

bYZNFjF.png!web

变量是根据系数(或变量重要性)进行排序的,彩色条允许我们快速找到最重要的变量。Pclass列有最大的(负)系数,它的绝对值是第二大的系数Embarked_Q的两倍。

5

sklearn pandas

如果你是一名Pandas爱好者,你会不止一次地意识到,与Pandas DataFrame和sklearn联合并不总是最佳选择。但不要就此止步。一些贡献者创建了sklearn_panda,它介于这两个包之间,为他们架起桥梁。它用一个Pandas友好的 DataFrameMapper 替换了sklearn的 ColumnTransformer

from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn_pandas import DataFrameMapper
from category_encoders import LeaveOneOutEncoder

imputer_Pclass = SimpleImputer(strategy='most_frequent', add_indicator=True)
imputer_Age = SimpleImputer(strategy='median', add_indicator=True)
imputer_SibSp = SimpleImputer(strategy='constant', fill_value=0, add_indicator=True)
imputer_Parch = SimpleImputer(strategy='constant', fill_value=0, add_indicator=True)
imputer_Fare = SimpleImputer(strategy='median', add_indicator=True)
imputer_Embarked = SimpleImputer(strategy='most_frequent')

scaler_Age = MinMaxScaler()
scaler_Fare = StandardScaler()

onehotencoder_Sex = OneHotEncoder(drop=['male'], handle_unknown='error')
onehotencoder_Embarked = OneHotEncoder(handle_unknown='error')

leaveoneout_encoder = LeaveOneOutEncoder(sigma=.1, random_state=2020)

mapper = DataFrameMapper([
    (['Age'], [imputer_Age, scaler_Age], {'alias':'Age_scaled'}),
    (['Pclass'], [imputer_Pclass]),
    (['SibSp'], [imputer_SibSp]),
    (['Parch'], [imputer_Parch]),
    (['Fare'], [imputer_Fare, scaler_Fare], {'alias': 'Fare_scaled'}),
    (['Sex'], [onehotencoder_Sex], {'alias': 'is_female'}),
    (['Embarked'], [imputer_Embarked, onehotencoder_Embarked]), 
    (['Embarked_Pclass_Sex'], [leaveoneout_encoder])
], df_out=True)

mapper.fit(X=train, y=train['Survived']) 

下面是使用. fit ()方法后的输出示例:

aIFvmqq.png!web

6

tqdm

在处理大型数据集时,数据操作需要时间。 使用tqdm来跟踪你的代码是否正在实际运行,以及它需要多长时间 ,而不是在你的Jupyter Notebook无聊的等待,而不知道发生了什么。 对于运行速度太慢的脚本,这也是一种尽早中止的好方法。

from tqdm import notebook
notebook.tqdm().pandas()

现在所有的Pandas DataFrame 都有了新的方法:

  • .progress_apply, .progress_applymap

  • .progress_map

它们与 apply、 applymap 和 map 一样,只是它们将绘制一个进度条。很酷!

7

使用.to clipboard()粘贴数据到Excel中

如果你是Excel的忠实用户, 尽管Pandas有许多选项,但是通过最少的编码很难获得类似的输出水平。

有一件事可以这么干,那就是把我们的结果导出到Excel中。但是 没有使用.to_excel方法 。相反,我们使用更流畅的 .to_clipboard(index=False) 将数据复制到剪贴板。然后在Excel中使用Ctrl + V将数据粘贴到当前电子表格中。

2020年第 78 篇文章

量化投资与机器学习微信公众号,是业内垂直于 Quant、MFE、 Fintech、AI、ML 等领域的 量化类主流自媒体。 公众号拥有来自 公募、私募、券商、期货、银行、保险资管、海外 等众多圈内 18W+ 关注者。每日发布行业前沿研究成果和最新量化资讯。

你点的每个“在看”,都是对我们最大的鼓励


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK