【Pandas】18 小练习
创始人
2024-05-13 10:36:12
0

#【Pandas】18 小练习
2023.1.16 两个pandas小练习

18.1 疫情数据分析

18.1.1 观察数据

import pandas as pd
import osdf = pd.read_csv("data/covid19_day_wise.csv")
df
DateConfirmedDeathsRecoveredActiveNew casesNew deathsNew recoveredDeaths / 100 CasesRecovered / 100 CasesDeaths / 100 RecoveredNo. of countries
02020-01-2255517285100003.065.0560.716
12020-01-23654183060699122.754.5960.008
22020-01-249412636879287862.763.8372.229
32020-01-251434423913534931632.932.72107.6911
42020-01-2621185652201068414132.642.46107.6913
.......................................
1832020-07-23155104816335068710969616600628275699661697144.0856.167.27187
1842020-07-24157916456396508939705621229028116461442287364.0556.617.16187
1852020-07-25160471906445179158743624393025554548672190384.0257.077.04187
1862020-07-26162517966486219293464630971120460641041347213.9957.186.98187
1872020-07-27164804856540369468087635836222869354151746233.9757.456.91187

188 rows × 12 columns

*我的输入错误:readcsv

  • 观察一下head
df.head()
DateConfirmedDeathsRecoveredActiveNew casesNew deathsNew recoveredDeaths / 100 CasesRecovered / 100 CasesDeaths / 100 RecoveredNo. of countries
02020-01-2255517285100003.065.0560.716
12020-01-23654183060699122.754.5960.008
22020-01-249412636879287862.763.8372.229
32020-01-251434423913534931632.932.72107.6911
42020-01-2621185652201068414132.642.46107.6913

18.1.2 完成以下数据处理

  • 获取 2020 年 2 月 3 日的所有数据
  • 2020 年 1 月 24 日之前的累积确诊病例有多少个?
  • 2020 年 7 月 23 日的新增死亡数是多少?
  • 从 1 月 25 日到 7 月 22 日,一共增长了多少确诊病例?
  • 每天新增确诊数和新恢复数的比例?平均比例,标准差各是多少?
  • 画图展示新增确诊的变化曲线
  • 画图展示死亡率的变化曲线

练习读取数据

  1. 获取 2020 年 2 月 3 日的所有数据
df[df["Date"]=="2020-02-03"]
DateConfirmedDeathsRecoveredActiveNew casesNew deathsNew recoveredDeaths / 100 CasesRecovered / 100 CasesDeaths / 100 RecoveredNo. of countries
122020-02-0319887426604188573100641452.143.0470.5325

*注意就是日期格式 0203

  1. 2020 年 1 月 24 日之前的累积确诊病例有多少个?

我们发现有个Confirmed 通过数字发现应该是之前确诊的

# 方法1
df[df["Date"]=="2020-01-24"]["Confirmed"]
2    941
Name: Confirmed, dtype: int64
# 方法2
df.loc[df["Date"]=="2020-01-24","Confirmed"]
2    941
Name: Confirmed, dtype: int64

*注意和python区别 ,如果用索引查找 要用loc

  1. 2020 年 7 月 23 日的新增死亡数是多少?
    也是读取 NewCaes
df.loc[df["Date"]=="2020-07-23","New deaths"]
183    9966
Name: New deaths, dtype: int64

时间序列练习
4. 从 1 月 25 日到 7 月 22 日,一共增长了多少确诊病例?

我们观察这个New cases是每天的,不是累计,所以要求和

创建成时间序列 就可以计算了 data_range

#创建时间序列
date = pd.to_datetime(df["Date"])date_range = (date >= "2020-01-25") & (date <= "2020-07-22")
date_range
0      False
1      False
2      False
3       True
4       True...  
183    False
184    False
185    False
186    False
187    False
Name: Date, Length: 188, dtype: bool
new_cases = df.loc[date_range,"New cases" ]
overall = new_cases.sum()
print("共新增:", overall)
共新增: 15247802

我们发现用确诊的相减 和新增加总和是不一致的 分析可能有人重阳了

我们每次提取都是有索引的,所以有时候需要加value

confirmed = df.loc[:, "Confirmed"]
conf_0722 = confirmed.loc[df["Date"] == "2020-07-22"].values
conf_0125 = confirmed.loc[df["Date"] == "2020-01-25"].values
print("格式时代索引的:",confirmed.loc[df["Date"] == "2020-07-22"])overall2 = conf_0722 - conf_0125
print("共新增:", overall2)
格式时代索引的: 182    15227725
Name: Confirmed, dtype: int64
共新增: [15226291]

一些计算
5. 每天新增确诊数和新恢复数的比例?平均比例,标准差各是多少?

per= df["New cases"]/df["New recovered"]
per
0             NaN
1       49.500000
2       47.833333
3      164.333333
4       52.615385...    
183      1.666074
184      1.229207
185      1.166670
186      1.518739
187      1.309638
Length: 188, dtype: float64

一些值有问题NaN

# 有些值是有问题的
per.isna()
0       True
1      False
2      False
3      False
4      False...  
183    False
184    False
185    False
186    False
187    False
Length: 188, dtype: bool
not_zero_per=per[~per.isna()]ratio_mean = not_zero_per.mean()
ratio_std = not_zero_per.std()
print("平均比例:", ratio_mean, ";标准差:", ratio_std)
平均比例: 7.049556348053247 ;标准差: 19.145284932105497

联系画图

  1. 画图展示新增确诊的变化曲线
df["New cases"].plot()

在这里插入图片描述

  1. 画图展示死亡率的变化曲线
df["Deaths / 100 Cases"].plot()

在这里插入图片描述

18.2 机器学习数据预处理

  • 数据导入
  • 异常值处理
  • 训练集和测试集数据准备

18.2.1 数据导入

import pandas as pddata=data1 = pd.read_csv("data/iris.csv",names= ["sepal length", "sepal width", "petal length", "petal width", "class"])
data
sepal lengthsepal widthpetal lengthpetal widthclass
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica

150 rows × 5 columns

18.2.2 异常值处理

【NaN】

data.isna()
sepal lengthsepal widthpetal lengthpetal widthclass
0FalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalse
..................
145FalseFalseFalseFalseFalse
146FalseFalseFalseFalseFalse
147FalseFalseFalseFalseFalse
148FalseFalseFalseFalseFalse
149FalseFalseFalseFalseFalse

150 rows × 5 columns

这种看不出来,用df.isna().any()查看这一批数据中是否存在空值

  • df.isna().any() 只要有一个就是’True’
data.isna().any()
sepal length    False
sepal width     False
petal length    False
petal width      True
class           False
dtype: bool
data.loc[pd.isna(data["petal width"])]
sepal lengthsepal widthpetal lengthpetal widthclass
255.03.01.6NaNIris-setosa

上面找到了Nan值

  1. 对它进行处理:删掉或者平均

【删掉】

  • .dropna(axis=0, how="any"):
  • any有一个就删除和all全是删除
  • axis=0:行方向上变化
data = data.dropna(axis=0, how="any")
data.isna().any()
sepal length    False
sepal width     False
petal length    False
petal width     False
class           False
dtype: bool

【填充】平均值 填充

  • 算平均值
  • 把平均值插入到新列中
  • 新列赋值到原数据表
data1.isna().any()
sepal length    False
sepal width     False
petal length    False
petal width      True
class           False
dtype: bool
pepal_width_mean=data1["petal width"].mean()
print(pepal_width_mean)
new_col = data1["petal width"].fillna(pepal_width_mean)
print(new_col)
data1["petal width"]=new_col
data1.isna().any()
1.3946308724832226
0      0.2
1      0.2
2      0.2
3      0.2
4      0.2... 
145    2.3
146    1.9
147    2.0
148    2.3
149    1.8
Name: petal width, Length: 150, dtype: float64sepal length    False
sepal width     False
petal length    False
petal width     False
class           False
dtype: bool
  1. 看值的合理性
    不合理的一般去掉 或者 做一些处理
data.plot()

在这里插入图片描述

data["sepal length"].plot()

在这里插入图片描述

  • 我们发现 这个值小于0是违反常理的 我们可以去掉.drop()
index=data[data["sepal length"]<0].index
index
data_drop=data.drop(index)
data_drop["sepal length"].plot()

在这里插入图片描述

或者上一章知识 设定个阈值范围data["sepal length"].clip(lower=0, upper=8)

18.2.3 训练集和测试集

我们假设0.8作为训练集

  • 取长度
n = len(data)
150
  • 切片:如果我们如果直接切片tain = data.iloc[:n*0.8]会报错,因为格式不是整数m
tain_n= int(n*0.8)
tain = data.iloc[:tain_n]
test = data.iloc[tain_n:]
test
sepal lengthsepal widthpetal lengthpetal widthclass
1206.93.25.72.3Iris-virginica
1215.62.84.92.0Iris-virginica
1227.72.86.72.0Iris-virginica
1236.32.74.91.8Iris-virginica
1246.73.35.72.1Iris-virginica
1257.23.26.01.8Iris-virginica
1266.22.84.81.8Iris-virginica
1276.13.04.91.8Iris-virginica
1286.42.85.62.1Iris-virginica
1297.23.05.81.6Iris-virginica
1307.42.86.11.9Iris-virginica
1317.93.86.42.0Iris-virginica
1326.42.85.62.2Iris-virginica
1336.32.85.11.5Iris-virginica
1346.12.65.61.4Iris-virginica
1357.73.06.12.3Iris-virginica
1366.33.45.62.4Iris-virginica
1376.43.15.51.8Iris-virginica
1386.03.04.81.8Iris-virginica
1396.93.15.42.1Iris-virginica
1406.73.15.62.4Iris-virginica
1416.93.15.12.3Iris-virginica
1425.82.75.11.9Iris-virginica
1436.83.25.92.3Iris-virginica
1446.73.35.72.5Iris-virginica
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
  • 这里面**class都相同,我们想打乱顺序。:.sample() **
data3 = data.sample(frac=1)
tain = data3.iloc[:tain_n]
test = data3.iloc[tain_n:]
test
sepal lengthsepal widthpetal lengthpetal widthclass
815.52.43.71.0Iris-versicolor
185.73.81.70.3Iris-setosa
75.03.41.50.2Iris-setosa
1246.73.35.72.1Iris-virginica
1097.23.66.12.5Iris-virginica
1057.63.06.62.1Iris-virginica
1326.42.85.62.2Iris-virginica
1206.93.25.72.3Iris-virginica
626.02.24.01.0Iris-versicolor
155.74.41.50.4Iris-setosa
935.02.33.31.0Iris-versicolor
195.13.81.50.3Iris-setosa
805.52.43.81.1Iris-versicolor
474.63.21.40.2Iris-setosa
526.93.14.91.5Iris-versicolor
705.93.24.81.8Iris-versicolor
344.93.11.50.1Iris-setosa
905.52.64.41.2Iris-versicolor
675.82.74.11.0Iris-versicolor
454.83.01.40.3Iris-setosa
405.03.51.30.3Iris-setosa
546.52.84.61.5Iris-versicolor
995.72.84.11.3Iris-versicolor
435.03.51.60.6Iris-setosa
795.72.63.51.0Iris-versicolor
836.02.75.11.6Iris-versicolor
1486.23.45.42.3Iris-virginica
856.03.44.51.6Iris-versicolor
845.43.04.51.5Iris-versicolor
965.72.94.21.3Iris-versicolor
  • 切分标签
def get_xy(df):return df[["sepal length", "sepal width", "petal length", "petal width"]], df[["class"]]train_x, train_y = get_xy(tain)
test_x, test_y = get_xy(test)
test_y
class
81Iris-versicolor
18Iris-setosa
7Iris-setosa
124Iris-virginica
109Iris-virginica
105Iris-virginica
132Iris-virginica
120Iris-virginica
62Iris-versicolor
15Iris-setosa
93Iris-versicolor
19Iris-setosa
80Iris-versicolor
47Iris-setosa
52Iris-versicolor
70Iris-versicolor
34Iris-setosa
90Iris-versicolor
67Iris-versicolor
45Iris-setosa
40Iris-setosa
54Iris-versicolor
99Iris-versicolor
43Iris-setosa
79Iris-versicolor
83Iris-versicolor
148Iris-virginica
85Iris-versicolor
84Iris-versicolor
96Iris-versicolor
  • DataFrame to Numpy
    有的机器学习框架、模型可以直接使用 Pandas 数据类型,有的不一定可以,但是基本上都可以支持 Numpy array。 所以我们还可以进一步将 Pandas 的 DataFrame 转成 Numpy array。
train_x_array, train_y_array = train_x.values, train_y.values# 前三个实例
print(train_x_array[:3])
print(train_y_array[:3])
[[5.8 2.7 5.1 1.9][6.3 2.7 4.9 1.8][4.8 3.1 1.6 0.2]]
[['Iris-virginica']['Iris-virginica']['Iris-setosa']]

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
ChatGPT 怎么用最新详细... ChatGPT 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...