转自:量化投资与机器学习 作者:Revert 编译:1+1=6 用df.groupby ().iter ()分析数据样本 与Excel相比,在Jupyter Notebook中逐行或逐组地查看数据集通常比较困难。一个有用的技巧是使用生成器并使用Ctrl + Enter而不是Shift + Enter来迭代地查看同一个单元格中的不同样本。 首先,使用 .groupby()(或 .iterrows())生成器创建一个单元格,并添加 ._ iter__(): generator = df.groupby(['identifier']).__iter__()
然后,使用键盘快捷键Ctrl + Enter,尽可能多地运行以下单元格,以观察对你来说最重要的数据: group_id, grouped_data = generator.__next__() print(group_id) grouped_data
下面是一个分析泰坦尼克号数据集中的乘客的例子,这些乘客的机票号码完全相同。你没有能力把每一组乘客单独分开,所以使用这种方法可以让你用一种非常简单的方法分析每一组乘客: 在数据科学中,我们常常倾向于从头开始编写我们的数据分析代码。因为所有的数据集都是不同的。然而,有一个神奇的 pandas_profiling 包使得这种逻辑毫无意义。这个包实际上自动化了数据探索和数据质量评估步骤!看一看: 显然,它不能解决所有的数据分析问题,例如,如果数据中有文本变量。但它应该是你开始分析任何数据集的方式! 一旦你理解了可以使用链接方法组合多个操作,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方法的一个很好的例子: 如果你在做机器学习,如果用外行的话来解释清楚你的机器学习模型你觉得特别困难。 这里有一个方法可以帮助你,那就是在你的模型中有一个很好的视觉系数或者特征重要性。 以下是我们一直在重复使用的可视化结果(避免重新造轮子): pd.DataFrame({ 'variable': variables, 'coefficient': model.coef_[0] }) \ .round(decimals=2) \ .sort_values('coefficient', ascending=False) \ .style.bar(color=['grey', 'lightblue'], align='zero')
结果如下:
变量是根据系数(或变量重要性)进行排序的,彩色条允许我们快速找到最重要的变量。Pclass列有最大的(负)系数,它的绝对值是第二大的系数Embarked_Q的两倍。 如果你是一名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 ()方法后的输出示例: 在处理大型数据集时,数据操作需要时间。使用tqdm来跟踪你的代码是否正在实际运行,以及它需要多长时间,而不是在你的Jupyter Notebook无聊的等待,而不知道发生了什么。对于运行速度太慢的脚本,这也是一种尽早中止的好方法。 from tqdm import notebook notebook.tqdm().pandas()
现在所有的Pandas DataFrame 都有了新的方法: 它们与 apply、 applymap 和 map 一样,只是它们将绘制一个进度条。很酷! 使用.to clipboard()粘贴数据到Excel中 如果你是Excel的忠实用户,尽管Pandas有许多选项,但是通过最少的编码很难获得类似的输出水平。 有一件事可以这么干,那就是把我们的结果导出到Excel中。但是没有使用.to_excel方法。相反,我们使用更流畅的 .to_clipboard(index=False) 将数据复制到剪贴板。然后在Excel中使用Ctrl + V将数据粘贴到当前电子表格中。
|