python+numpy、pandas、matplotlib库分析UFO数据
#导入库与数据
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df1=pd.read_csv('nuforc_events.csv')
df=df1.dropna() #把包含缺失值的整行删除
# print(df.head)
year=np.array(df['Year'][0:109991])
month=np.array(df['Month'])
state=np.array(df['State'])
shape=np.array(df['Shape'])
#获取字体
plt.rcParams['font.sans-serif']='Microsoft YaHei'
#查看表格中各数据的数据类型
df.dtypes
下面需解决的四个问题:
1·UFO出现频率最高的年、月
2·UFO出现频率最高的州
3·UFO出现形状次数最多的为哪一类
4·UFO出现的持续时间一般多长
1·分析UFO出现次数最多的年
#因1905年后记录数据较少,所以选取1905年后的时间数据
year=np.array(df['Year'][0:109991])
year_df = pd.value_counts(year).sort_values(ascending=False)
# value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
# 绘制柱状图
plt.figure(figsize=(12,8),dpi=100)
plt.ylabel('出现次数')
plt.title('UFO年份出现次数统计')
year_df.plot.bar()
plt.show()
·value_counts()
是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
·df. sort_values()
作用:既可以根据列数据,也可根据行数据排序。
注意:必须指定by参数,即必须指定哪几行或哪几列;无法根据index名和columns名排序(由.sort_index()执行)
调用方式
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
axis:{0 or ‘index’, 1 or ‘columns’}, default 0,默认按照列排序,即纵向排序;如果为1,则是横向排序。
by:str or list of str;如果axis=0,那么by=“列名”;如果axis=1,那么by=“行名”。
ascending:布尔型,True则升序,如果by=[‘列名1’,‘列名2’],则该参数可以是[True, False],即第一字段升序,第二个降序。
inplace:布尔型,是否用排序后的数据框替换现有的数据框。
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心。
na_position:{‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面。
·df. sort_index()
作用:默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
注意:df. sort_index()可以完成和df. sort_values()完全相同的功能,但python更推荐用只用df. sort_index()对“根据行标签”和“根据列标签”排序,其他排序方式用df.sort_values()。
调用方式
sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
axis:0按照行名排序;1按照列名排序
level:默认None,否则按照给定的level顺序排列—貌似并不是,文档
ascending:默认True升序排列;False降序排列
inplace:默认False,否则排序之后的数据直接替换原来的数据框
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心。
na_position:缺失值默认排在最后{“first”,“last”}
by:按照某一列或几列数据进行排序,但是by参数貌似不建议使用
【原文链接:https://blog.youkuaiyun.com/weixin_43064185/article/details/105093891】
2·出现频率最高的月份
month=np.array(df['Month'])
month_df = pd.value_counts(month).sort_index(axis=0)
#绘制折线图
plt.figure(figsize=(8,5),dpi=100)
plt.xlabel('月份')
plt.ylabel('出现次数')
plt.title('UFO出现月份分析')
month_df.plot(xticks=range(1,13))
plt.show()
折线图绘制
x、y轴:fontsize的值则为文字的大小
labelsize的值为刻度数字的大小
调用方式
plt.plot(x, y, linestyle, linewidth, color, marker,
markersize, markeredgecolor, markerfactcolor,
markeredgewidth, label, alpha)
linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认为实线。
linewidth:指定折线的宽度。
marker:可以为折线图添加点,该参数是设置点的形状。
markersize:设置点的大小。
markeredgecolor:设置点的边框色。
markerfactcolor:设置点的填充色。
markeredgewidth:设置点的边框宽度。
label:为折线图添加标签,类似于图例的作用。
labelsize的值为刻度数字的大小
fontsize的值则为文字的大小
【原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/108466201】
3.出现频率最高的州
state=np.array(df['State'])
state1=pd.value_counts(state).sort_values(ascending=False)
state_df = state1[:25]#取出现次数前25的形状
plt.figure(figsize=(9, 6), dpi=100)
plt.axes(aspect='equal')
plt.pie(x=state_df, pctdistance=0.9,
startangle=45, autopct='%.1f%%', shadow=False,
)
plt.pie(state_df, radius=0.65, colors="w")#画一个白色圆,空心效果
#显示排前10的州的图例
plt.legend(state[:10], bbox_to_anchor=(0.9, 0.92))
plt.title('出现州次数占比图', fontsize=15)
plt.show()
饼状图
参数说明:
x:数组,绘制饼状图的数据。
[explode]:默认值为None的可选参数。若非None,则是和x相同长度的数组,用来指定每部分的离心偏移量。
[labels]:列表,指定每个饼块的名称,默认值None,为可选参数。
[colors]:特定字符或数组,指定饼图的颜色,默认值None,为可选参数。
[autopct]:特定字符,指定饼图中数据标签的显示方式,默认值None,为可选参数。
[pctdistance]:浮点数,指定显示比例距离圆心的距离。默认值0.6,为可选参数。
[labeldistance]:浮点数,指定每个扇形对应标签与圆心的距离,默认值1.1,为可选参数。
[startangle]:浮点数,指定从x轴逆时针旋转饼图的开始角度,默认值None,为可选参数。
[radius]:浮点数,指定饼图的半径,默认值1,为可选参数。
[textprops]:字典,设置文本对象的字典参数,默认值None,为可选参数。
**kwargs:不定长关键字参数,用字典形式设置条形图的其它参数。
【原文链接:https://blog.youkuaiyun.com/qq_32532663/article/details/113631551】
4.出现次数最多的UFO形状
shape=np.array(df['Shape'])
shape1 = pd.value_counts(state).sort_values(axis=0,ascending=True)
shape_df=shape[:25]
#shape_df
def read_data():
# shape=np.array(df['Shape'])
# shape_df = pd.value_counts(state).sort_values(ascending=False)
#采用数据字典统计出现次数
dic={}
for item in shape_df:
if item in dic.keys():
dic[item]+=1
else:
dic[item]=1
a=[]
b=[]
for key in dic:
a.append(key)
b.append(dic[key])
size=[]
t=sum(b)
label=a
#计算每种类型所占的比例
for u in b:
i=u/t
size.append(i)
plt.title('出现形状次数饼状图')
plt.pie(size,labels=label,autopct='%.0f%%',
shadow=False,startangle=150,
labeldistance=1.1,pctdistance=1,radius=0.95
)
plt.show()
if __name__ == '__main__':
plt.figure(figsize=(6,6),dpi=100)
read_data()