设计(论文)名称

基于Python的中国地震数据分析与可视化系统的设计与实现

设计(论文)类型

C

指导教师

刘思思

学 院

计算机学院

专    业

数据科学与大数据技术

姓 名

祁浩

学 号

2020135211

班  级

20大数据本科2班

  • 选题依据(包括项目研究的背景、研究或应用的意义、国内外研究或应用现状,附主要参考文献)

(一)研究的背景和意义

地震是一个全球性的自然灾害,对人类社会和自然环境都造成了极大的影响。中国位于环太平洋地震带和欧亚地震带之间,是世界上地震活动最频繁的国家之一,地震给人们的生命和财产安全带来极大的危害。因此,通过对地震数据的分析和可视化,可以更好地了解地震的分布、发生规律和发展趋势。

地震数据分析与可视化不仅可以提高对地震的认识,为地震预测和预防提供帮助,还可以为政府和企业提供决策支持,减少地震造成的损失。

国内外研究或应用现状:在地震数据分析与可视化方面,国内外已经有很多研究工作。例如,利用地震震级和发生时间的数据,进行地震预测和预防的研究;利用地震数据的空间分布和时间序列分析,研究地震活动的特征和规律等。此外,一些商业软件和开源软件也被广泛应用于地震数据的分析和可视化。

(二)国内外研究现状

随着互联网技术的迅速发展和大数据时代的到来,如何在各种资源中获取地震数据变得尤为重要。中国地震数据分析与可视化研究已经取得了很多成果。例如,利用Python中的Pandas库对地震数据进行处理和分析[1][2],利用Matplotlib库对地震数据进行可视化,利用NumPy库对地震数据进行数学建模和模拟等。

国外地震数据分析与可视化研究也取得了很多成果。例如,利用Python中的NumPy和Pandas库对地震数据进行处理和分析[3][4],利用Matplotlib和Seaborn库对地震数据进行可视化,利用PyQt和PySide库[5]开发地震数据可视化交互式界面[6]等。

在地震数据分析方面,常用的数据分析方法包括历史数据分析、趋势分析等。地段分析,了解地震以往的发生频率与趋势,从而为目标用户提供更准确的可视化分析。

近年来,越来越多的学者开始关注Python在地震数据分析应用研究[6]。例如王超群.网络爬虫技术研究就利用爬虫技术[7],我们系统就可以利用此项技术对地震数据抓取以积累并使用历史数据[5][8]对比,然后进行可视化分析。

类似地, 范开勇,陈宇收MySQL 数据库性能优化研究[9] 使用MySQL数据库对爬虫回来的数据进行持久化存储,因为爬虫抓取的会有大量数据,参考数据库性能优化研究就很必要,系统的好坏跟数据库设计优化息息相关。

(三)参考文献

[1] 陈剑雪.Python 程序设计课程教学研究[J.南方农机.2019.(24).

[2] 詹重咏MySQL 数据库中数据导入与导出探析.数字技术与应用2017(12):231+233.

[3] Beecham ,Matthew.Global market review of front-end modules for passenger cars and lighttrucks - forecasts to 2017: 2010 edition: Appendix 2 Q&A with PYTHONJJJust - Auto, 2018.pp.32-35.

[4] Myers D, Mcguffee J W. Choosing ScrapylJ]. Journal of Computing Sciences in Colleges.2018.31(1):83-89.

[5]Yu-Jin Kim. Tracking Dynamics between Digital Design Agencies and Clients of HybridOutsourcing in the Double Diamond Website Development Process[J. Archives of DesignResearch.2020.33(1).

[6] 蔡敏.Python 语言的 Web 开发应用分析J.无线互联科技,2019.(4)

[7] 吴俊杰.Python 语言与 javascript 语言的区别吴俊杰[J].电子制作,2019,(2).

[8] 王超群.网络爬虫技术研究[.移动信息,2016(6):00181-00182

[9] 范开勇,陈宇收MySQL 数据库性能优化研究J中国新通信,2019.21(01):57.

二、设计或研究内容、预期目标及拟解决的关键问题(此部分为重点阐述内容)。

(一)研究内容

本文利用爬虫框架爬取中国地震台网站上的数据,并对爬取到的数据进行清洗和预处理,利用Python语言对数据进行处理、分析和可视化,PC端用来展示中国地震数据分析和可视化的结果。具体研究内容包括数据爬取、数据存储、数据预处理、数据分析和可视化、系统的设计和实现等模块。

数据采集:利用Pandas库读取地震数据,并进行相应的数据处理,包括数据清洗、数据转换等,动态参数决定网站URL,动态设置爬虫内容字段,通过可配置方式。

数据分析:利用Pandas、NumPy等库对地震数据进行深入分析,分析地震的频率,次数统计,趋势,包括地震数据的统计特征、分布规律等。

数据可视化:利用Matplotlib、Seaborn、Plotly等库进行地震数据的可视化,包括散点图、地图、热力图等,以便更直观地展示地震数据的信息。

系统展示模块:利用Flask框架技术开发一个网站用来展示数据分析与可视化的结果,根据系统需求分析,本文设计的网页功能模块如图1所示。

图1 系统功能模块图

用户管理:管理员可以创建、存储和管理用户的信息,包括他们的用户名和密码。

数据管理:管理员可以对数据库中的数据进行管理。

登录和注册:提供登录和注册的界面。注册界面应该包括一个密码字段和一个确认密码字段,用户可以输入他们的详细信息并提交。登录界面应该包括一个用户名字段和一个密码字段,用户可以输入他们的用户名和密码并提交。登录成功后,用户应被重定向到首页。

首页信息:首页显示一些关于中国地震的基本信息,例如最新的地震消息、地震统计数据等。

视频信息:这个功能涉及上传和播放与地震相关的视频。这涉及到一些额外的库,例如用于处理视频的库。

地震信息:这个功能能够显示所有记录在案的地震信息,包括地震的日期、时间、地点和震级。可能还需要一个地图显示所有地震的地点。

地震发生地分析:这个功能可以通过热力图或其它可视化工具分析地震的集中区域,以及这些区域的地震活动趋势。

地震趋势分析:这个功能可以通过数据分析和可视化工具,例如matplotlib或seaborn,分析随时间变化的地震活动频率,从而得出地震活动的趋势。例如,可以查看在过去十年中地震活动的变化情况。

(二)预期目标

1.实现对地震数据的分析,包括用频率分析、趋势分析、地段统计等,从而了解以往地震的大致情况;

2.实现对地震数据的读取与处理,满足后续分析工作的需要;

3.结合数据分析方法,实现对地震数据的深入分析,包括地震数据的统计特征、分布规律等;

4.结合可视化技术,实现对地震数据的可视化,以便更直观地展示地震数据的信息;

5.将地震数据的分析结果以及可视化图像呈现出来,以便更好地进行展示;

6.以数据分析结果为标准划分地震带,以更加直观的了解地震分布与趋势;

6.实现对地震数据的有效管理,包括数据的存储、检索、输出等;

7.通过实现一个基于地震分析可视化系统,为其他类似系统的设计和实现提供参考和借鉴;

(三)拟解决的关键问题

数据获取问题:地震数据来源不一,需要明确数据获取的来源和方式,保证数据的准确性和可靠性;

数据处理问题:地震数据可能存在缺失、异常值等问题,需要进行数据清洗和预处理,提高数据质量;

数据分析问题:需要利用合适的统计分析方法对地震数据进行深入分析,如频度分析、震级分析等,提取有价值的信息;

数据可视化问题:地震数据可视化能够将分析结果直观地呈现出来,需要选择合适的可视化工具和方法,提高数据的可读性和可理解性;

数据存储和检索问题:地震数据量较大,需要考虑如何高效地存储和检索数据,保证系统的运行效率。

核心算法代码分享如下:

#Flink连接HDFS上面的CSV文件 使用Flink_SQL分析完入表
## 启动hadoop
## cd /data/hadoop/sbin
## sh /data/hadoop/sbin/start-all.sh
## 启动hive
## cd /data/hive
## nohup hive --service metastore &
## nohup hive --service hiveserver2 &
import os
from pyflink.common import Row
from pyflink.table import (EnvironmentSettings, TableEnvironment, TableDescriptor, Schema,
                           DataTypes, FormatDescriptor)
from pyflink.table.expressions import lit, col
from pyflink.table.udf import udtf
import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="%(message)s")

env_settings = EnvironmentSettings.in_streaming_mode()
table_env = TableEnvironment.create(env_settings)


jars = []
for file in os.listdir(os.path.abspath(os.path.dirname(__file__))):
    if file.endswith('.jar'):
        file_path = os.path.abspath(file)
        jars.append(file_path)

str_jars = ';'.join(['file:///' + jar for jar in jars])
table_env.get_config().get_configuration().set_string("pipeline.jars", str_jars)
# table_env.get_config().get_configuration().set_float('taskmanager.memory.network.fraction',0.8)
# table_env.get_config().get_configuration().set_string('taskmanager.memory.network.min','8gb')
# table_env.get_config().get_configuration().set_string('taskmanager.memory.network.max','16gb')
table_env.get_config().get_configuration().set_string('parallelism.default','1')
#先读取hadoop_hdfs上的CSV文件
table_env.execute_sql(
                """
                   create  table ods_earthquake(
                    `magnitude` double COMMENT '震级(M)',
                    `stime_long` string COMMENT '发震时刻(UTC+8)',
                    `latitude` string COMMENT '纬度(°)',
                    `longitude` string COMMENT '经度(°)',
                    `depth` bigint COMMENT '深度(千米)',
                    `addr`  string COMMENT '参考位置',
                    `stime_short` string COMMENT '年月日',
                    `data_type` string COMMENT '数据类型(用于区分中国外国)',
                    `long_province` string COMMENT 'echarts中国地图省份专用字段(外国是:无(外国))',
                    `stime_year` string COMMENT '年',
                    `stime_month` string COMMENT '月',
                    `stime_clock` string COMMENT '时刻中的时'
                    
                    ) WITH(
                           'connector' = 'filesystem',
                            'path' ='hdfs://bigdata:9000/earthquake/ods_earthquake/earthquake_hdfs.csv',
                            'format' = 'csv'
                )   
                """
                      )

#设置下沉到mysql的表
table_env.execute_sql(
                """
                create  table table06(
                    `addr` string primary key ,
                    `num` bigint 
                ) WITH(
                    'connector' = 'jdbc',
                    'url' = 'jdbc:mysql://bigdata:3306/hive_earthquake',
                    'table-name' = 'table06',
                    'username' = 'root',
                    'password' = '123456',
                    'driver' = 'com.mysql.jdbc.Driver'


                )   
                """
                      )


#数据分析并且导入
#result=table_env.sql_query("select * from ods_zymk limit 10 ")
table_env.execute_sql("""
                        insert into table06
                        select addr  , count(*) num
                        from ods_earthquake
                        GROUP BY addr 
                        order by num desc
                        limit 10;
                                                
                        


                  """).wait()
#print("表结构",result.get_schema())
#print("数据检查",result.to_pandas())

Logo

更多推荐