上次我们进行数据的爬取,进行数据的初步获取。我们已经按照要求的时间 取得了武汉市从3月1号到1月31号人口迁出率,和上海市3月1号到3月31号的人口迁出率。和各地的经纬度数据,我们现在要对数据进行预处理让其成为我们可以进行数据预测的数据。
一:经纬度数据换算成直线距离数据。
使用haversine公式进行计算。
def haversine(lon1, lat1, lon2, lat2):
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371
return c * r * 1000
二:将距离数据和人口流量数据进行结合
因为我们需要将距离和人口流量数据进行统一化,得到如下数据格式
时间 | 省 | 市 | 人口流量 | 离迁出城市的距离 |
excel 表一的数据格式:
时间 | 省 | 市 | 经纬度 |
excel 表二的数据格式:
时间 | 省 | 市 | 人口流量 |
所以我们需要处理excel表格。
首先我们需要将距离表中的距离加入到人口流量表中。(因为人口迁出的城市是全国前100名的市,而我们的城市经纬度数据数据是全国几乎所有城市的经纬度)。我的思路是使用python中的pandas将数据保存为Dataframe格式,将两个excel表格中的数据 分别以Dataframe格式格式保存。首先在表二中添加一列(distance)然后通过遍历表二中的数据,通过【省】【市】在表一中查找相关省市的经纬度,然后使用haversine公式计算出该市离上海(武汉)市的距离,然后将所得的距离保存在distance那一列 ,最后将最终数据保存在一个excel 文件中。
相关代码:
因为我们要在表一中寻找与表二“省” “市“两列相同的,观察数据我们可以知道。我们爬取的经纬度数据中的市名字里有些没没有末尾的“市”,所以我们首先要添加上 统一数据格式。
df = pd.read_csv("E:\机器学习\疫情分析\城市距离.xls")
s = df["0"].str.split(' ').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1)
a = pd.DataFrame(s)
print(a)
data = a.values
data = data.reshape(2500)
with open("E:\机器学习\疫情分析\\text.csv.xls", "w+", newline="") as csv_file:
writer = csv.writer(csv_file)
writer.writerow(["省", "市", "北纬", "东经"])
for i in range(int(len(data) / 4)):
a = data[i*4+1]
if a[-1] != "市":
a = a+"市"
writer.writerow([data[i*4], a, data[i*4+2][2:], data[i*4+3][2:]])
再通过上述思路,将数据统一到一个excel 文件中。
l1 = 114.17
al = 30.35
for i in range(len(df_SH)):
if pd.isnull(df_SH.loc[i, "value"]):
i = i+1
else:
ci_name = df_SH[i:i + 1]["city_name"].values
ci_name = ci_name[0]
altitude = df_location[df_location["市"] == ci_name]["北纬"].values
longtitude = df_location[df_location["市"] == ci_name]["东经"].values
if len(longtitude) == 1:
distance = int(haversine(longtitude[0], altitude[0], l1, al))
df_SH.loc[i, "distance"] = distance
else:
df_SH.loc[i, "distance"] = 0
df_SH.to_csv("E:\机器学习\疫情分析\\text.csv.xls", index=False)
再运行代码的时候,我们发现会有不匹配,或者匹配不同的情况。
我们会发现某些省市的经纬度数据其实是没有被爬取到的。
为什么会出现这种情况,经过观察我发现其实是这个爬到的经纬度数据里面有很多地区的名字和爬到的百度迁徙数据中城市的名字的叫法不一样。比如湖北的“盐城市”和“盐在市”就是两种不同的叫法。为了解决这种问题我采用了自己定义的最优匹配如下:
1:比较两个汉语句:
选出匹配字符最多的那个
2:若匹配字符最多且数量大于1(情况很少)
就随机选一个
3:如果没有匹配:
就两个内容 一个是 恩施土家族苗族自治州 另一个是黔东南苗族侗族自治州因为没有爬取的其经纬度数据,所以我选择直接手动附上。
最终结果:
目前位置已经爬取并清洗好需要的流动和迁徙数据。
我们的数据工作就可以初步结束了。