2020-11-23 数据科学库(6) pandas时间序列,911、pm2.5数据处理
程序员文章站
2024-03-07 16:54:39
...
1、对911统计的数据处理
1.1根据事故的不同类型分类统计
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
file_path="./911.csv"
#myfont=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
df=pd.read_csv(file_path)
pd.set_option('display.max_columns', 20)
# print(df.head(1))
# print(df.info())
#获取分类情况
#print(df["title"].str.split(":"))
temp_list=df["title"].str.split(":").tolist()
cate_list=list(set([i[0]for i in temp_list]))
print(cate_list)
#构造0的数组
zero_df=pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
#赋值:方法一遍历每个分类
for cate in cate_list:
zero_df[cate][df["title"].str.contains(cate)]=1
print(zero_df)
#方法二:遍历每一行
# for i in range(df.shape[0]):
# zero_df.loc[i,temp_list[i][0]]=1
data1=zero_df.sum(axis=0)
print(data1)
1.2 第二种方法统计事故类型
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
file_path="./911.csv"
#myfont=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
df=pd.read_csv(file_path)
pd.set_option('display.max_columns', 20)
# print(df.head(1))
# print(df.info())
#获取分类情况
#print(df["title"].str.split(":"))
temp_list=df["title"].str.split(":").tolist()
cate_list=[i[0]for i in temp_list]
print(cate_list)
#在df中添加一列
df["cate"]=pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))
#print(df.head(5))
print(df.groupby(by="cate").count()["title"])
2、pandas时间序列
pd.data_range(start=None,end=None,periods=None,freq="D"
2.1示例
import pandas as pd
df=pd.date_range(start="20171031",periods=10,freq="M")
print(df)
2.2 时间戳的转换-- pandas重采样
df["timeStamp"]=pd.to_datetime(df["timeStamp"],format=)
911 不同月份不同次数
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
file_path="./911.csv"
#myfont=font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
df=pd.read_csv(file_path)
pd.set_option('display.max_columns', 20)
df["timeStamp"]=pd.to_datetime(df["timeStamp"])
df.set_index("timeStamp",inplace=True)
#print(df.head(10))
count_by_month=df.resample("M").count()["title"]
#print(count_by_month.head(10))
_x=count_by_month.index
_y=count_by_month.values
_x=[i.strftime("%Y-%m-%d") for i in _x]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x,rotation=45)
plt.show()
3、911:将不同月份不同类型的电话次数做折线图
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
file_path="./911.csv"
#吧时间字符串转换为时间类型设置为索引
df=pd.read_csv(file_path)
pd.set_option('display.max_columns', 20)
df["timeStamp"]=pd.to_datetime(df["timeStamp"])
#设置添加列,表示分类,
temp_list=df["title"].str.split(":").tolist()
cate_list=[i[0]for i in temp_list]
df["cate"]=pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))
#将索引放到后面 很重要
df.set_index("timeStamp",inplace=True)
plt.figure(figsize=(20, 8), dpi=80)
#分组
#分组 group_name是对应的ems,traffic标签,groupdata是筛选出来的数据
#对groupdata进行时间重采样
for group_name, group_data in df.groupby(by="cate"):
#对不同的分类都进行绘图
count_by_month = group_data.resample("M").count()["title"]
# print(count_by_month.head(10))
_x = count_by_month.index
_y = count_by_month.values
_x = [i.strftime("%Y-%m-%d") for i in _x]
plt.plot(range(len(_x)), _y, label=group_name)
plt.xticks(range(len(_x)), _x, rotation=45)
plt.legend(loc="best")
plt.show()
4、pm2.5案例:对比中美记录pm2.5随时间变化的折线图
import pandas as pd
from matplotlib import pyplot as plt
file_path="./BeijingPM20100101_20151231.csv"
df=pd.read_csv(file_path)
print(df.head())
print(df.info())
#periodindex 把分开的时间字符串通过periodIndex的方法转换为pandas的时间类型
period=pd.PeriodIndex(year=df["year"],month=df["month"],day=df["day"],hour=df["hour"],freq="H")
# print(period)
# print(type(period))
df["datetime"]=period
# print(df.head(10))
#把datetime设置为索引
df.set_index("datetime",inplace=True)
#对df进行降采样
df=df.resample("7D").mean()
#处理缺失数据,删除缺失数据
# print(df["PM_US Post"])
data=df["PM_US Post"]
data_china=df["PM_Dongsi"]
_x=data.index
_x=[i.strftime("%Y-%m-%d")for i in _x]
_x_china=[i.strftime("%Y-%m-%d")for i in data_china.index ]
_y_china=data_china.values
_y=data.values
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y,label="US_Post")
plt.plot(range(len(_x_china)),_y_china,label="CN_Post")
plt.xticks(range(0,len(_x_china),10),list(_x_china)[::10],rotation=45)
plt.legend(loc="best")
plt.show()