使用箱线图进行气温历史数据清洗

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["HarmonyOS Sans SC"]
%matplotlib inline

读取数据

data = pd.read_excel("气温历史数据.xlsx")
data.head()
城市日期当日最高温当日最低温当日平均温
0北京2023-07-0238.024.031.0
1北京2023-07-0139.024.032.0
2北京2023-06-3039.025.032.0
3北京2023-06-2936.022.029.0
4北京2023-06-2827.020.023.0

简单统计分析

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 27900 entries, 0 to 27899
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   城市      27900 non-null  object        
 1   日期      27900 non-null  datetime64[ns]
 2   当日最高温   10032 non-null  float64       
 3   当日最低温   10032 non-null  float64       
 4   当日平均温   27900 non-null  float64       
dtypes: datetime64[ns](1), float64(3), object(1)
memory usage: 1.1+ MB
data.groupby(by=["城市"]).apply(lambda e: e.sort_values("日期"))
城市日期当日最高温当日最低温当日平均温
城市
上饶24609上饶2019-01-01NaNNaN2.5
24608上饶2019-01-02NaNNaN2.5
24607上饶2019-01-03NaNNaN3.8
24606上饶2019-01-04NaNNaN6.4
24605上饶2019-01-05NaNNaN6.3
.....................
青岛6170青岛2023-06-2828.023.025.0
6169青岛2023-06-2926.022.024.0
6168青岛2023-06-3028.021.024.0
6167青岛2023-07-0127.022.023.0
6166青岛2023-07-0225.023.024.0

27900 rows × 5 columns

# 是否存在缺失日期
date_range = pd.date_range(start=data["日期"].min(),end=data["日期"].max(),freq='D')
data["日期"].isin(date_range).value_counts()
True    27900
Name: 日期, dtype: int64
# 画图
n_city = data["城市"].nunique()
fig, ax = plt.subplots(2,n_city, figsize=(49,4))
for i,city in enumerate(data["城市"].unique()):
    city_data = data[data["城市"]==city].sort_values("日期")
    ax[0][i].boxplot([city_data["当日最低温"],city_data["当日平均温"],city_data["当日最高温"]],
                medianprops={'color': 'red', 'linewidth': '1.5'},
                showmeans=True,
                meanline=True,
                flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
                labels=["dMinT","dMeanT","dMaxT"]
               )
    date_interval = city_data["日期"].max()-city_data["日期"].min()
    date_interval = str(date_interval).split(" ")[0]
    ax[0][i].set_title(str(city)+" "+date_interval+"days")

在这里插入图片描述

plt.figure(figsize=(12,5))
plt.scatter(data["日期"],data["当日最低温"])

在这里插入图片描述

plt.figure(figsize=(12,5))
plt.scatter(data["日期"],data["当日平均温"])

在这里插入图片描述

plt.figure(figsize=(12,5))
plt.scatter(data["日期"],data["当日最高温"])

在这里插入图片描述

data[data["城市"]=="长沙"].sort_values("日期").to_excel("长沙.xlsx")
data[data["城市"]=="南京"].sort_values("日期").to_excel("南京.xlsx")
# 检查是否存在空值
data.isnull().sum()
城市           0
日期           0
当日最高温    17868
当日最低温    17868
当日平均温        0
dtype: int64

异常值处理

q3 = data["当日平均温"].quantile(0.75)
q2 = data["当日平均温"].median()
q1 = data["当日最高温"].quantile(0.25)
iqr = q3 - q1
ub = q3 + 1.5 * iqr
lb = q1 - 1.5 * iqr
data.loc[ data["当日平均温"] > ub, ["当日平均温"] ] = q2
data.loc[ data["当日平均温"] < lb, ["当日平均温"] ] = lb
plt.figure(figsize=(12,5))
plt.scatter(data["日期"],data["当日平均温"])

在这里插入图片描述

for i,city in enumerate(data["城市"].unique()):
    city_data = data[data["城市"]==city].sort_values("日期")
    ax[1][i].boxplot([city_data["当日最低温"],city_data["当日平均温"],city_data["当日最高温"]],
                medianprops={'color': 'red', 'linewidth': '1.5'},
                showmeans=True,
                meanline=True,
                flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
                labels=["dMinT","dMeanT","dMaxT"]
               )
    date_interval = city_data["日期"].max()-city_data["日期"].min()
    date_interval = str(date_interval).split(" ")[0]
    ax[1][i].set_title(str(city)+" "+date_interval+"days")
fig.tight_layout(pad=0.4, w_pad=0, h_pad=0)
fig.savefig("城市.svg", bbox_inches="tight")
fig

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值