疫情数据分析
1.导入外部数据
pd.read_csv('文件名')
查看数据属性:
columns 列名
index 行索引
shape m行n列
dtyps 各列的类型
2.查找数据
方法1:用列名直接查找
df[[列名列表]]
方法2:用loc查找
df.loc[行取值,列取值]
注意:行取值可以用逻辑值来进行映射,逻辑真(True)会返回,逻辑假(False)会去掉
df.head(n) #返回前n行,默认为5行
df.tail(n) #返回后n行,默认为5行
3.
1> 设置表索引
方法1:df.reset_index(drop=True)
设置行索引为(0-n)
方法2:df.set_index(列名)
设置某一列为行索引
2> 找数据的最大或最小的n个值
方法1:df.msmallest(n,列名)
df.nlargest(n,列名)
方法2:排序
df.sort_values(列名,ascending=False/True) #False降序
df.sort_index()
3> 简单的统计函数
df.函数名()
sum() max() min() median() std()
df.describe() #描述性统计 (一次可以统计出多个结果)
4> 处理与时间有关的数据
pd.to_datetime(时间列名) #将字符格式的时间数据,转换为日期时间格式
补充知识的:查找数据
df.iloc[行位置,列位置] #iloc中只能是数字,不能是列名等文本
df.loc[行索引,列索引] #loc中必须是索引。
5> 提取时间中的年,月,日,星期
year,month,day,weekday
#功能2--数据分析代码
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide',True)
pd.set_option('display.unicode.east_asian_width',True)
# 函数1--打开文件
def open_def(file_name):
file_name1 = open(file_name,encoding='utf-8') #用open命令按照utf-8格式打开
file_v1 = pd.read_csv(file_name1) #然后用pandas的命令读文件
file_v2 = file_v1.drop('Unnamed: 0',axis=1) #删除列,
#查看属性
# print("查看属性如下:".center(30,"="))
# print("列名有:\n",file_v2.columns)
# print('\n行索引是:\n',file_v2.index)
# print('\n形状是:\n',file_v2.shape)
# print('\n各列的类型是:\n',file_v2.dtypes)
return file_v2
# 函数2--查找数据
def find_def(file_v1,col_name,k):
find_v1 = file_v1.loc[:,col_name].head(k)
return find_v1
# 函数3--统计数据
def stat_def(file_v1,b_v1,num_v1):
result_v1 = file_v1.sort_values('当天确诊',ascending=b_v1).head(int(num_v1))
return result_v1
#函数4 -- 分组聚合
def group_def(file_v4,group_v1):
file_v6 = file_v4.set_index("时间") #把时间作为索引
if group_v1 == "1":
file_v6.index = file_v6.index.month #提取时间中的日作为索引
elif group_v1 == "2":
file_v6.index = file_v6.index.day #提取时间中的日作为索引
elif group_v1 == "3":
file_v6.index = file_v6.index.weekday #提取时间中的日作为索引
else:
print("您输入的有误")
#分组聚合
result_v2 = file_v6.loc[:,['当天疑似','当天确诊']].groupby(file_v6.index).agg(['sum','max','min'])
return result_v2
#主函数
def main():
file_name = "china_hist_data.csv"
file_v1 = open_def(file_name)
# return file_v1
sel_v1 = input('请输入您的操作:1.查找 2.统计数据 3.分组聚合')
if sel_v1 == "1":
while True:
print("您可以选择以下数据\n"+"|".join(list(file_v1.columns)))
col_name = input("请输入您要查找的值(注意:多个值时,中间用空格分隔),输入0时,结束查找")
if col_name == "0":
break
col_num = input("请输入您要显示的行数")
try:
find_v1 = find_def(file_v1,col_name.split(' '),int(col_num))
print(find_v1)
except KeyError:
print("没有您要找的值")
return find_v1
elif sel_v1 == "2":
sel_v2 = input("请输入您的选择1.较大的 2.较小的")
num_v1 = input("请输入要查看的个数")
if sel_v2 == "1":
result_v1 = stat_def(file_v1,False,num_v1)
elif sel_v2 == "2":
result_v1 = stat_def(file_v1,True,num_v1)
else:
print("没有您的需求")
return result_v1
elif sel_v1 == "3":
sel_v2 = input("请输入分组方法:1.月 2.日 3.星期")
#将字符串类型,转换为日期时间类型
file_v1['时间'] = pd.to_datetime(file_v1['时间'])
file_v4 = file_v1.iloc[:,[1,5,6,9,10,11,13]]
result_v2 = group_def(file_v4,sel_v2)
return result_v2
else:
print("您输入的有误")
#函数入口
if __name__ == "__main__":
file_v1 = main()
file_v1