这是我在python上做的第一个项目,通过这个项目我感受到了python的强大。 我随机找了两个包含很多数据的页面。 它们都是关于太阳耀斑。 我把两页的数据一起取来进行分析和整理

此页面的URL为https://cmsc 320.github.io/files/top-50-solar-flares.html

另一页的URL为http://cdaw.gsfc.NASA.gov/CME _ list/radio/waves _ type2. html

以下大概是这个页面的样子,可以看到他正在显示top50 solar flares的表。 我在下面爬上使用python更改了页面的数据表进行分析。

另一页的情况

这个项目实用地写了谷歌colab。 之所以没有选择用vscode或docker完成,是因为我觉得colab更方便、更强大。 代码错误报告有一个快捷键,您有理由直接跳转到堆栈概述以报告查询错误。 colab是一个强大的在线编译器,强烈建议您编写jupyter book。

下面是第一部分爬网数据的代码。

importrequestsimportpandasimportbs4importnumpyasnpimportjsonimportcopy # step1# srcapingdatafromthewebsiteresponse=requests files/top-50-solar-flares.html features=’ html.parser ‘ ) soup.prett ify (# creatingtablesolar _ table=soup ‘ start_time ‘、’ max_time ‘、’ end_time ‘、’ movie’]、 索引=范围(1(len (solar _ table )1) ) setdataintotableformati=0forrowinsolar _ table 3360 k=0columns=row.finion k ]=col.get _ text (k=1i=1data _ table执行效果,实际出现的50行,即前50名的top flares

下一步是开始数据分析。 删除生成table的最后一列,并分别合并日期和上面三列中有关数据开始时间的列。 这样可以简化表格,便于以后进行数据分析。

数据_ table=data _ table.drop (movie ), 1 )组合hedatestart=pandas.to _ datetime (data_table ) (date ) (data _ table ) (start_time ) ) max ‘ ‘ (end=pandas.to _ datetime (data _ table [ ‘ date ‘ ] ) data_table[‘end )=startdata _ table [ ‘ max _ datetete ]=end data _ table=data _ table.data _ table1) data _ table=data _ table.drop (max _ time ‘,1 ) data _ table 1 ) ) ) ) ) )1) set-ASN andata _ table=data _ table.replace (‘-‘,’ Nan ‘ ) data _ table=data _ table )

第3步获取上述另一页的数据,并将他保存在新的表中

response2=requests.get (https://cdaw.gsfc.NASA.gov/CME _ list/radio/waves _ type2. htm

l’)soup2 = bs4.BeautifulSoup(response2.text, features=”html.parser”)soup2.prettify()# Creating data tabletable2 = soup2.find(‘pre’).get_text().splitlines()del table2[0:12]del table2[-1:]data_table2 = pandas.DataFrame(columns = [‘starting_date’, ‘starting_time’, ‘ending_date’, ‘ending_time’, ‘starting_frequency’, ‘ending_frequency’, ‘solar_source’, ‘active_region’, ‘x-ray’, ‘date_of_CME’, ‘time_of_CME’, ‘position_angle’, ‘CME_width’, ‘CME_speed’, ‘plots’], index = range(1,len(table2)+1))# Set data into the tablei = 0for row in table2: table2[i] = (row.split(‘PHTX’)[0] + ‘PHTX’).split() k = 0 for col in table2[i]: data_table2.iat[i, k] = col k += 1 i +=1data_table2

运行效果如下

接下来我将整理这个新的table,我称他为NASA table, 里面缺失的position degree列里的信息会被我填上NaN, 然后日期会和上面一样和时间分别合并。我还创建了一个新的列来判断width是否是lower bound

data_table2.replace([‘—-‘, ‘—–‘, ‘——‘, ‘–/–‘, ‘–:–‘, ‘FILA’, ‘????’ ‘LASCO DATA GAP’, ‘DSF’], ‘NaN’, inplace = True)# Copydata_table2[‘is_halo’] = data_table2[‘position_angle’].map(lambda x: x == ‘Halo’)data_table2[‘position_angle’] = data_table2[‘position_angle’].replace(‘Halo’, ‘NA’)data_table2[‘lower_bound’] = data_table2[‘CME_width’].map(lambda x: x[0] == ‘>’)data_table2[‘CME_width’] = data_table2[‘CME_width’].replace(‘>’, ”)# Set data in data_table2for i, row in data_table2.iterrows(): x = row[‘starting_date’][:5] data_table2.loc[i, ‘starting_date’] = pandas.to_datetime(row[‘starting_date’] + ‘ ‘ + row[‘starting_time’]) if row[‘ending_date’] != ‘NaN’ and row[‘ending_time’] !=’NaN’: if row[‘ending_time’] == ’24:00′: row[‘ending_time’] = ’23:55′ data_table2.loc[i, ‘ending_date’] = pandas.to_datetime(x + row[‘ending_date’] + ‘ ‘ + row[‘ending_time’]) if row[‘date_of_CME’] != ‘NaN’ and row[‘time_of_CME’] != ‘NaN’: data_table2.loc[i, ‘date_of_CME’] = pandas.to_datetime(x + row[‘date_of_CME’] + ‘ ‘ + row[‘time_of_CME’])data_table2 = data_table2.drop([‘starting_time’], 1)data_table2 = data_table2.drop([‘ending_time’], 1)data_table2 = data_table2.drop([‘time_of_CME’], 1)data_table2.rename(columns = {‘starting_date’:’starting_date_time’, ‘ending_date’:’ending_date_time’, ‘date_of_CME’:’cme_date_time’}, inplace=True)data_table2

整理完后的table是这样的

接下来辅助前50行从NASA table里面然后建成一个新的table

temp = data_table2.copy()# Classifying only X leadingtop_lines = temp.loc[temp[‘x-ray’].astype(str).str.contains(‘X’)].copy()top_lines[‘x-ray’] = top_lines[‘x-ray’].str.replace(“X”, ”)top_lines[‘x-ray’] = top_lines[‘x-ray’].astype(float)top_lines = top_lines.sort_values(‘x-ray’, ascending = False)top_lines[‘x-ray’] = top_lines[‘x-ray’].astype(str)top_lines[‘x-ray’] = ‘X’ + top_lines[‘x-ray’]top_lines = top_lines[0:50]top_lines

运行结果,没有截图全,但是可以大概看到NASA table的top50已经被复出出来

对于第一个网页的数据中排名前50的太阳耀斑,从这个新表的数据中找到最匹配的一行。

top_lines[‘ranking’] = ‘NA’for i, i1 in data_table.iterrows(): for j, j2 in top_lines.iterrows(): if i1[‘region’] == j2[‘active_region’] and i1[‘start_datetime’].date() == j2[‘starting_date_time’].date(): top_lines.loc[j, ‘ranking’] = itop_lines

最后我将进行数据分析,NASA表数据集中的大量属性(开始或结束频率,耀斑高度或宽度)随时间的变化,我将画出一张柱状图来显示分析结果。

halo_CME_top_lines = top_lines.is_halo.value_counts(‘True’)[1] * len(top_lines.index)non_halo_top_lines = len(top_lines.index) – halo_CME_top_lineshalo_nasa = data_table2.is_halo.value_counts(‘True’)[1] * len(data_table2.index)non_halo_nasa = len(data_table2.index) – halo_nasa# Draw the graphplot_graph = pandas.DataFrame({‘Halo’: [halo_nasa, halo_CME_top_lines], ‘Non_Halo’:[non_halo_nasa, non_halo_top_lines]}, index=[‘All’, ‘Top_lines’])plot_graph.plot(kind = ‘bar’, alpha = 0.75, rot = 0)plot_graph

运行结果