【Python+Flask+Echarts】可视化练习题 --- 航空火箭信息分析处理
程序员文章站
2024-01-02 11:55:58
【Python+Flask+Echarts】可视化练习题 — 航空火箭信息处理本篇的数据来源 https://www.kaggle.com/datasets该数据集源含一张张数据表,主要包含世界各地的火箭发射信息,通过一些简单的数据清洗处理绘制简单的图像 ☆ミ(o*・ω・)ノ目录:一、数据清洗1、数据提取2、数据类型转换&nb...
【Python+Flask+Echarts】可视化练习题 — 航空火箭信息处理
本篇的数据来源 https://www.kaggle.com/datasets
该数据集源含一张张数据表,主要包含世界各地的火箭发射信息,通过一些简单的数据清洗处理绘制简单的图像 ☆ミ(o*・ω・)ノ
目录:
一、数据清洗
1、数据提取
2、数据类型转换
3、填补法处理空值
4、简单去重
二、数据可视化
任务一:绘制各公司总成本不为0的横向条形图
任务二:绘制每年\每月的发射数量
任务三:绘制任务状态统计图
一、数据清洗
原始数据:
1、数据提取
# 提取有效列
data = data.iloc[:,1:]
# 重命名 ['公司','发射地点','发射基准和时间','火箭名','火箭状态','任务成本','任务状态']
data.columns = ['公司','发射地点','发射基准和时间','火箭名','火箭状态','任务成本','任务状态']
# 提取相关的发射国家信息
country_split = [x.split(', ') for x in data['发射地点']]
# 创建空数组存储国家,自定义函数提取国家
country = []
def country_select(list):
for i in range(len(country_split)):
country.append(list[i][-1])
return country
# 调用方法获取国家
country_select(country_split)
# 新加一列国家
data['国家'] = country
2、数据格式处理、类型转换
#处理空格、符号
data['任务成本'] = data['任务成本'].str.replace(' ', '')
data['任务成本'] = data['任务成本'].str.replace(',', '')
# 转换数据类型,便于后续各公司成本累计求和
data['任务成本'] = data['任务成本'].astype(float)
# 转换时间序列
data['发射基准和时间'] = pd.to_datetime(data['发射基准和时间'])
3、填补法处理空值:
# 处理空值 --- 填充0
data_nan1 = data.isnull().sum()
data['任务成本'] = data['任务成本'].fillna(0)
data_nan2 = data.isnull().sum()
4、简单去重:
# 查看数据集整体信息
print(data.info())
# 获取重复记录并删除
duplicate = data[data.duplicated()]
sum1 = data.shape
data.drop_duplicates(inplace=True)
sum2 = data.shape
#data.to_csv("data/Space/Space_data_prepared.csv",index=True)
注意:在空值填补处理的时候需要先进行数据类型的转换,也就是第二步要在第三步的前面完成,否则在填值的时候数据类型不匹配无法填充,我在做的时候就是前两步颠倒了位置,导致在控制台查看data_nan1、data_nan2的时候显示空值已经被填,但是最终生成文件中nan值并没有被替换。
简单处理后的表格:
以上步骤有关解析参见本人博客:【数据清洗实战 — Deep Dive in the Space Race】数据清洗+可视化
任务一:绘制各公司总成本不为0的横向条形图
data_info = data.dtypes
# 1.提取有效列
data_use = data[['公司','任务成本']]
sum = data_use.groupby('公司').sum().sort_values(by='任务成本',ascending=True).reset_index()
sum_final = sum[sum['任务成本']!=0]
list = sum_final.values.tolist()
app = Flask(__name__)
@app.route('/')
def index():
sheets_list = list
return render_template("太空_总成本.html",sheets = sheets_list)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="height: 100%">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="../static/echarts%20(1).js"></script>
<script type="text/javascript">
var dom = document.getElementById("container");
var myecharts = echarts.init(dom);
var data1 = [{% for item in sheets %}'{{ item.0 }}',{% endfor %}];
var data2 = [{% for item in sheets %}{{ item.1 }},{% endfor %}];
var option = null;
option = {
title: {
text: '各公司总成本不为0的横向条形排名图'
},
tooltip: {
show: true,
trigger: 'axis'
},
legend:{
show:true,
right:'4%'
},
gird: {
top: '10%',
right: '4%',
left: '4%',
bottom: '0%',
containLabel:true
},
xAxis: {
type: 'value'
},
yAxis: {
type:'category',
data: data1
},
series:{
name:'总成本',
type:'bar',
data:data2
}
}
if (option && typeof option=='object'){
myecharts.setOption(option);
}
</script>
</body>
</html>
任务二:绘制每年\每月的发射数量
# -*- coding: utf-8
# @Time : 2020/12/7 16:11
# @Author : ZYX
# @File : 太空任务_绘制每年每月火箭发射数量柱状图.py
# @software: PyCharm
import pandas as pd
from flask import Flask,render_template
# 数据集读取
df = pd.read_csv("data/Space/Space_data_prepared.csv",index_col=0,encoding='utf-8')
# 提取相关信息
# 需要再次转换数据类型为时间格式
print(df['发射基准和时间'].dtype)
df['发射基准和时间'] = pd.to_datetime(df['发射基准和时间'])
print(df['发射基准和时间'].dtype)
# 提取时间 --- 年
df['Year'] = df['发射基准和时间'].apply(lambda datetime:datetime.year)
# 提取时间 --- 月
df['Month'] = df['发射基准和时间'].apply(lambda datetime:datetime.month)
# 提取
data_use = df[['Year','Month']]
year_count = data_use.groupby('Year').count().reset_index()
month_count = data_use.groupby(['Month']).agg(count=('Month','count')).reset_index()
list_year = year_count.values.tolist()
list_month = month_count.values.tolist()
list = [list_month,list_year]
app = Flask(__name__)
@app.route('/')
def index():
sheet_list = list
return render_template("太空_发射数量.html",sheets=sheet_list)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="height: 100%">
<div id="container1" style="height: 50%;width: 50%"></div>
<div id="container2" style="height: 50%;width: 50%"></div>
<script type="text/javascript" src="../static/echarts%20(1).js">
</script>
<script type="text/javascript">
var dom = document.getElementById("container1");
var myecharts = echarts.init(dom);
var data1 = [{% for item in sheets.0%}'{{ item.0 }}',{% endfor %}];
var data2 = [{% for item in sheets.0%}{{ item.1}},{% endfor %}];
var option = null;
option = {
title:{
text:'每个月发射火箭总数'
},
tooltip:{
show:true,
trigger:'axis',
axisPointer: {
style:"shadow"
}
},
legend:{
show:true,
right:'4%',
top:'5%'
},
xAxis:{
type:'category',
data:data1,
containLabel:true
},
yAxis:{
type:'value',
},
series:{
name:'火箭发射总数',
type:'bar',
data:data2
}
}
if (option && typeof option=='object'){
myecharts.setOption(option);
}
</script>
<script type="text/javascript">
var dom = document.getElementById("container2");
var myecharts = echarts.init(dom);
var data1 = [{% for item in sheets.1%}'{{ item.0 }}',{% endfor %}];
var data2 = [{% for item in sheets.1%}{{ item.1}},{% endfor %}];
var option = null;
option = {
title:{
text:'每年发射火箭总数'
},
tooltip:{
show:true,
trigger:'axis',
axisPointer: {
style:"shadow"
}
},
legend:{
show:true,
right:'4%',
top:'5%'
},
xAxis:{
type:'category',
data:data1,
containLabel:true
},
yAxis:{
type:'value',
},
series:{
name:'火箭发射总数',
type:'bar',
data:data2
}
}
if (option && typeof option=='object'){
myecharts.setOption(option);
}
</script>
</body>
</html>
任务三:绘制任务状态统计图 — 统计各国家火箭发射成功状态的排名图
# -*- coding: utf-8
# @Time : 2020/12/8 9:02
# @Author : ZYX
# @File : 太空任务_任务状态统计图.py
# @software: PyCharm
import pandas as pd
from flask import Flask,render_template
data = pd.read_csv('data/Space/Space_data_prepared.csv',index_col=0)
# 提取任务状态为Success的记录
data_use = data[data['任务状态']=='Success']
# 提取国家、任务状态相关列
data_final = data_use[['国家','任务状态']].groupby('国家').agg(count=('任务状态','count')).sort_values('count').reset_index()
list = data_final.values.tolist()
# 可视化
app = Flask(__name__)
@app.route('/')
def index():
sheets_list = list
return render_template("太空_任务状态.html",sheets = sheets_list)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="height: 100%">
<div style="height: 100%" id="container"></div>
<script src="../static/echarts%20(1).js" type="text/javascript"></script>
<script type="text/javascript">
var dom = document.getElementById("container");
var myecharts = echarts.init(dom);
var data1 = [{% for item in sheets %}'{{ item.0 }}',{% endfor %}];
var data2 = [{% for item in sheets %}{{ item.1 }},{% endfor %}];
var option = null;
option = {
title: {
text: '各国家火箭发射成功状态的排名图'
},
grid:{
top:'5%',
right:'4%',
left:'4%',
bottom:'3%',
containLabel:true
},
tooltip: {
show: true,
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend:{
show:true,
right:'4%'
},
xAxis: {
type: 'value'
},
yAxis: {
type: 'category',
data: data1
},
series: [
{
name: '火箭发射状态',
type: 'bar',
data: data2
}
]
}
if (option&&typeof option=='object'){
myecharts.setOption(option);
}
</script>
</body>
</html>
本文地址:https://blog.csdn.net/qq_45797116/article/details/110820317