【数据清洗实战 --- Deep Dive in the Space Race】数据清洗+可视化

网友投稿 238 2022-08-25

【数据清洗实战 --- Deep Dive in the Space Race】数据清洗+可视化

【数据清洗实战 — Deep Dive in the Space Race】数据清洗+可视化

目录:

​​一、数据清洗​​​       ​​1、数据提取​​       ​​2、数据类型转换​​       ​​3、填补法处理空值​​​​二、数据可视化​​       ​​任务一:绘制各公司总成本不为0的横向条形图​​       ​​任务二:绘制每年\每月的发射数量​​       ​​任务三:绘制世界分布图​​       ​​任务四:绘制任务状态统计图​​

一、数据清洗

原始数据:

1、数据提取

首先对DataFrame数据集进行提取,由原始数据可以看出多出一列 ‘Unamed:0’,所以我们进行切片处理,提取之后所有列记录。同时,对于英文的列名可以替换为中文名便于之后的理解。

# 读取数据df = pd.read_csv('data/Space/Space_Corrected.csv', index_col=0)# 提取数据,修改列名df = df.iloc[:,1:]#print(df.head())df.columns = ['公司','发射地点','发射基准和时间','火箭名','火箭状态','任务成本','任务状态']# df.to_csv('data/Space_data.csv',index=True)print(df.columns)print(df.head())

对于数据处理过程中的提取(根据已有的数据信息找出所需要的信息),这里就以提取具体国家信息为例。在已有列中,我们不难找出国家隐含在发射地点(Location)特征中。对于这种字符串类型的数据主要的提取方法是进行字符串的分离,将其存入数组中,在根据索引提取所需部分;当然对于某些规则排列的数据,可以使用正则表达式进行提取(关于正则表达式,后续会有更新)。

在发射地点列中,观察后可以发现在每部分之间均以“, ”分布,以此特征我们对其进行分离。

a = [x.split(', ') for x in df['发射地点']]print(a)sum = df.shape[0]country = [] #国家# 定义函数选取国家名称def secCountry(data): for i in range(sum): # 注意此处Python要以range范围的形式遍历 country.append(data[i][-1]) # 将截取的当前字符串加到国家空数组 print(country) return countrysecCountry(a)# 增加Country列df['Country'] =

遍历 a :得到分离后的数组存储结果,根据发射地点列的特征,我们只取其中的最后一个字符串即可。(data[i][-1],这里我们只能从后往前取,因为从前往后的话,不能够保证每个分离出的数组长度一样)。同时a得到的是一个​​generateor对象​​,类似groupby()方法一样得到的也是一个对象,需要进行遍历才能看到内部信息。

通过遍历输出 country[] 的存储过程,由于数据过长仅截取最后一部分的。通过上面的遍历提取,每一次将提取的信息加入数组中,就出现了下图所示的阶梯状。

​​​​

2、数据类型转换

接着就对数据类型进行简单的转换操作,便于后续的数据分析处理。

# 转换时间序列df['发射基准和时间'] = pd.to_datetime(df['发射基准和时间'])#处理空格、符号df['任务成本'] = df['任务成本'].str.replace(' ', '')df['任务成本'] = df['任务成本'].str.replace(',', '')# 转换数据类型,便于后续各公司成本累计求和df['任务成本'] = df['任务成本'].astype(float)

简单处理后的表格:

​​​​

3、填补法处理空值:

此处进行0值填补可能会对真实的数据产生偏差,仅供参考!

#处理空值print(df.isnull().sum()) # 获取各列为空值的统计print(df[df['任务成本'].isnull()]) # 任务成本为空值的记录df['任务成本'] = df['任务成本'].fillna(0) # 填补空值print(df.isnull().sum())

以下是本案例中关于记录重复的去重方法,还有一种是特征重复,处理起来相对较复杂。(基本方法可查看本人博客:​​javascript:void(0)​​)

# ##数据清洗#删除重复值n = df.duplicated()print(n.sum())m = df[df.duplicated()]print(m)print(df.shape)df.drop_duplicates(inplace=True)print(df.shape)

至此,数据清洗基本几块都有涉及(去重、缺失值处理),基于本案例是网上找的数据,对于具体的实现不是太了解,而且根据所给数据对于异常值这块不太好进行操作,后续会针案例对异常值进行处理。

​​​​

二、数据可视化

除了数据清洗前进行数据提取外,在可视化阶段也需要根据具体的要求,提取相应的列来绘制图像。在绘图我们常用的是matplotlib.pyplot模块,在网上学习了解到seaborn模块也可以绘图,样式更加好看一点。

任务一:绘制各公司总成本不为0的横向条形图

在这里我们需要得到每个公司参与航空活动的总成本。目前我们具有所有公司的每一条发射火箭的记录汇总,首先就是要按照公司分组(groupby()),然后对每个公司在进行统计,最后提取出总成本不为零的数据即可。明确了目标和流程,接下来实现,整个过程只涉及到了公司和任务成本两个量,所以只需要提取出该两个特征数据进行操作。

# # 任务一:绘制各公司总成本不为0的横向条形图comCount = df[['公司','任务成本']].groupby(by='公司').sum() # 按照公司特征分类comCount = comCount.reset_index() # 重置索引,形成两列comCount.columns = ['Company Name','Spent Money'] # 重置列名comCount = comCount[comCount['Spent Money'] != 0] # 提取非0记录# print(comCount)plt.figure(figsize=(10,8))sns.barplot(data=comCount, y='Company Name',x='Spent Money')#plt.savefig('picture/各公司总成本不为0的横向条形图.png')plt.show()

在按照公司分组的时候会把公司作为索引处理,经过reset_index()方法后相当于将公司列后移,重新设置默认索引,这样就有了满足条件的两列数据进行绘图。

​​​​

任务二:绘制每年\每月的发射数量

在这里按照每年、每月进行绘图,就需要我们进行有关时间序列的数据处理。在原数据中,我们可以找到与时间相关的列,并且经过上面的数据转换后已经是时间类型了,关键要做的就是对其中的年、月、日进行提取。最简单的就是​​使用lambda表达式定义函数​​结合相关的时间函数完成。

# # 任务二:绘制每年\每月的发射数量df['Year'] = df['发射基准和时间'].apply(lambda datetime:datetime.year)df['Month'] = df['发射基准和时间'].apply(lambda datetime:datetime.month)df['Weekday'] = df['发射基准和时间'].apply(lambda datetime:datetime.weekday())# print(df.head())plt.figure(figsize=(12,8))sns.countplot(df['Year'])plt.xticks(rotation=98)plt.title("每年的发射数量统计图")plt.savefig('picture/Space/每年的发射数量统计图.png')plt.show()plt.figure(figsize=(12,8))sns.countplot(df['Month'])plt.title("每月的发射数量统计图")plt.savefig('picture/Space/每月的发射数量统计图.png')plt.show()# 其实在绘图这里我们可以定义一个绘图函数,对于年、月进行不同数据参数传入即可!!!

​​​​

任务三:绘制世界分布图

这部分是绘制动态世界分布图,需要导入新的包:

from iso3166 import countriesimport plotly.express as

以下是绘制的两种不同类型的世界分布图样式,大致了解一下。

# 任务三:绘制世界分布图# for i in countries:# print(i)# print(df[['Country','公司']].groupby(by='Country').count())df.loc[df['Country'] == 'Russia', 'Country'] = 'Russian Federation'df.loc[df['Country'] == 'New Mexico', 'Country'] = 'Mexico'country_dict = {}# 提取国家概况for c in countries: country_dict[c.name] = c.alpha3df['alpha3'] = df['Country']# print(country_dict)# print(df.columns)df = df.replace({"alpha3":country_dict})# print(df)# df.to_csv('data/Space_data_Country1.csv')df.loc[df['Country'] == "North Korea",'alpha3'] = "PRK"df.loc[df['Country'] == "South Korea",'alpha3'] = "KOR"geoMap = df.groupby(['Country','alpha3'])['任务状态'].count().reset_index()continent = ['Asia','Europe','Africa','Americas','Oceania']fig = px.scatter_geo(geoMap, locations="alpha3", hover_name="Country", size="任务状态", projection="natural earth", width=800, height=600, title='Number of missions country-wise')fig.show()

def plot_map(data, target_column): mapDf = data.groupby(['Country', 'alpha3'])[target_column].count().reset_index() fig1 = px.choropleth( mapDf, locations="alpha3", hover_name="Country", color=target_column, projection="natural earth", width=800, height=600, title='Number of missions country-wise' ) fig1.show()plot_map(geoMap,'任务状态')

​​​​

任务四:绘制任务状态统计图

value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。

# 任务四:绘制任务状态统计图susMiss = df[df['任务状态'] == 'Success']# print(susMiss)susMiss = susMiss['Country'].value_counts().reset_index()# print(susMiss)susMiss.columns = ['Country','Number of successful missions']# print(susMiss)plt.figure(figsize=(7,8))sns.barplot(data=susMiss, y='Country', x='Number of successful missions')plt.savefig('picture/Space/发射成功国家统计图.png')plt.show()

对比:

susMiss = df[df['任务状态'] == 'Success']# print(susMiss)susMiss = susMiss['Country'].value_counts().reset_index()

comCount = df[['公司','任务成本']].groupby(by='公司').sum() # 按照公司特征分类#print(comCount)comCount = comCount.reset_index() # 重置索引,形成两列

对于以上的数据处理,我们可以看到形式非常相似,在进行编写的时候,我也在想两种方法是否可以通用。但仔细想想发现了问题:

第一段代码是经过任务状态值统一过后再进行公司统计的,也就是任务状态都是’Success’,公司再怎么统计任务状态是不会改变的,可以通过公司数反应出统计出该公司任务成功的数量;

而第二段代码中任务成本的值并不是统一的,一个公司在一次任务中的成本对应不同,不能像第一段代码中的那样,通过一列就能表示另一列。

综上,针对数据的不同表现,方法之间是有相似处,但是具体要结合实例处理。

​​​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:12强赛赢过日澳,阿曼主帅放言战国足“必须赢”!(12强赛首战国足0-3不敌澳大利)
下一篇:【Python】数据分析.numpy.读/写文件
相关文章

 发表评论

暂时没有评论,来抢沙发吧~