Bản đồ mã bưu chính Python

Làm cách nào để bạn tạo trực quan hóa các tính năng liên quan đến vị trí hoặc mã zip?

Để phát triển trực quan hóa dữ liệu ở trên, chúng tôi sẽ sử dụng Folium trong Python. Trong phạm vi của hướng dẫn này, chúng tôi sẽ sử dụng tập dữ liệu với giá bán cho Khu vực Quận King. Tập dữ liệu mà chúng tôi sẽ sử dụng cho mục đích mã hóa có thể được tìm thấy trong liên kết này. Tập dữ liệu này đã được sử dụng cho dự án Giá nhà ở của chúng tôi tại Trại khởi động khoa học dữ liệu tại trường Flatiron. Đối với dự án, chúng tôi phải tạo một mô hình để dự đoán giá nhà ở. Tuy nhiên, nếu bạn muốn khám phá bộ dữ liệu gốc, bạn có thể tìm thấy nó qua Kaggle

Bắt đầu

Trước tiên, chúng ta cần nhập tập dữ liệu kc_house_data. csv. Giả sử dữ liệu của chúng tôi đã được làm sạch, đây là giao diện của dữ liệu

import pandas as pd
df = pd.read_csv('kc_house_data.csv')
dfmap = df[['price', 'zipcode']]
dfmap.head()

Khung dữ liệu trên chứa nhiều giá nhà ở mỗi mã zip duy nhất. Do đó, chúng ta cần tạo một khung dữ liệu phù hợp chứa thông tin chúng ta muốn. Trong khung dữ liệu mới này, chúng tôi muốn có tổng cộng bốn cột. Bốn cột này là giá trung bình, mã zip, kinh độ và vĩ độ

#Create the dataframe containing the data we want.
dfmap.zipcode = dfmap.zipcode.astype(int)
zipcode_means = []
for i in dfmap.zipcode.unique().tolist():
val = dfmap[dfmap['zipcode'] == i]['price'].mean()
lat = dfmap[dfmap['zipcode'] == i]['lat'].mean()
long = dfmap[dfmap['zipcode'] == i]['long'].mean()
zipcode_means.append([str(i), val, lat, long])
xall = []
yall = []
latall = []
longall = []
for val in zipcode_means:
xall.append(val[0])
yall.append(val[1])
latall.append(val[2])
longall.append(val[3])
tdf = pd.DataFrame(list(zip(xall, yall, latall, longall)), columns = ['Zipcode', 'Price', 'Latitude', 'Longitude'])

Trước tiên, đoạn mã trên chạy qua khung dữ liệu dfmap để tính giá nhà trung bình, vĩ độ và kinh độ của từng mã zip duy nhất

lập bản đồ

Bây giờ chúng tôi có khung dữ liệu của mình, chúng tôi có thể bắt đầu phát triển cơ sở của bản đồ. Để xây dựng cơ sở của bản đồ, chúng tôi sẽ chạy mã bên dưới

import folium
map = folium.Map(location=[47.5112, -122.257], default_zoom_start=15)
map

Bây giờ chúng ta có cơ sở của bản đồ bắt đầu từ vị trí có vĩ độ 47. 5112 và kinh độ -122. 257. Tùy thuộc vào nơi bạn muốn bản đồ bắt đầu, bạn có thể thay đổi tọa độ vị trí. Lưu ý cách không có bất kỳ đường viền nào đại diện cho từng mã zip trong hình trên

Để tạo đường viền, chúng ta cần tìm tệp geoJSON tương ứng cho Khu vực Quận King. May mắn thay, tôi có thể tìm thấy một tệp KML chứa mã zip, chiều dài hình dạng và diện tích. Tuy nhiên, vì tệp tôi đã tải xuống là tệp KML nên tôi phải sử dụng trình chuyển đổi trực tuyến để chuyển đổi KML sang GeoJSON. Trước khi bắt đầu mã hóa, chúng tôi cần truy cập vào tệp GeoJSON của mình để lấy vị trí của các mã zip trong tệp GeoJSON

Vị trí của các mã zip trong tệp GeoJSON là 'feature. của cải. MÃ BƯU CHÍNH'. Bây giờ là lúc nhập thông tin chúng tôi thu thập vào các tham số của hàm choropleth

map.choropleth(geo_data="zip_codes.geojson",
data=tdf,
columns=['Zipcode', 'Price'],
key_on='feature.properties.ZIPCODE',
fill_color='BuPu',fill_opacity=0.7,line_opacity=0.2,
legend_name='SALE PRICE')
  • geo_data là đường dẫn đến tệp geoJSON có tọa độ của các vùng mã zip. Trong trường hợp này, đó sẽ là tệp GeoJSON mà chúng tôi đã lấy trước đó
  • dữ liệu là tập dữ liệu mà chúng tôi đã làm sạch ở trên
  • cột đại diện cho các cột của tập dữ liệu mà chúng tôi muốn vẽ biểu đồ. Điều quan trọng cần lưu ý là cột Zipcode ở định dạng số hay chuỗi. Tùy thuộc vào việc mã zip trong geo_data của bạn ở định dạng số hay chuỗi, cột Zipcode trong dữ liệu của bạn cần khớp với mã đó
  • key_on là đường dẫn chứa các giá trị mã zip trong tệp GeoJSON mà chúng tôi đã đề cập ở trên 'tính năng. của cải. MÃ BƯU CHÍNH'
  • fill_color là lược đồ màu để hiển thị các khu vực
  • fill_opacity là độ trong suốt của vùng biên khi tô màu
  • line_opacity là mức độ trong suốt của các đường ranh giới
  • legend_name là tiêu đề của chú giải dữ liệu

Chạy đoạn mã trên sẽ dẫn đến bản đồ hiển thị bên dưới. Chúng ta có thể thấy chú thích được hiển thị ở góc trên cùng bên phải với tiêu đề GIÁ BÁN. Lựa chọn màu ‘BuPu’ của chúng tôi đã cho chúng tôi màu xanh tím trên bản đồ. Các phần màu đen của bản đồ đại diện cho các mã zip có trong tệp GeoJSON của chúng tôi, nhưng không có trong tập dữ liệu tdf của chúng tôi

Tiếp theo, chúng tôi sẽ lấy các điểm đánh dấu trên bản đồ của chúng tôi để hiển thị

  1. Mã Bưu Chính
  2. Giá nhà trung bình

Đối với điều này, chúng tôi cần một tọa độ trên bản đồ để hiển thị các điểm đánh dấu. Trong trường hợp bạn không có tọa độ của nó, bạn có thể sử dụng liên kết này để lấy tọa độ của mã zip tương ứng. Tuy nhiên, để sử dụng, chúng tôi đã chuẩn bị sẵn khung dữ liệu để sử dụng. Để hiển thị các điểm đánh dấu trên bản đồ, chúng ta sẽ sử dụng chức năng Marker

from folium.plugins import MarkerCluster
marker_cluster = MarkerCluster().add_to(map) # create marker clusters
for i in range((tdf.shape[0])):
location = [tdf['Latitude'][i], tdf['Longitude'][i]]
tooltip = "Zipcode: {}".format(tdf["Zipcode"][i])
folium.Marker(location,
popup="""
Mean sales price:
${}
""".format(round(tdf['Price'][i],2)),
tooltip=tooltip).add_to(marker_cluster)
map
  • vị trí là tọa độ kinh độ và vĩ độ cho điểm đánh dấu
  • cửa sổ bật lên là văn bản sẽ được hiển thị khi bạn nhấp vào điểm đánh dấu
  • chú giải công cụ là văn bản sẽ được hiển thị khi bạn di chuột qua điểm đánh dấu

Sau khi chạy mã bên dưới, chúng ta có thể thấy rằng khi di chuột qua điểm đánh dấu, chúng ta sẽ hiển thị mã Zip. Bằng cách nhấp vào điểm đánh dấu, nó sẽ hiển thị văn bản Giá bán trung bình và giá trị trung bình được tính

Chúng ta vừa học cách tạo trực quan hóa dữ liệu tương tác với dữ liệu mã zip. Còn rất nhiều tính năng trong Folium mà chúng ta chưa khám phá, chúng ta có thể khám phá trong tương lai. Đối với tài liệu về Folium, vui lòng tham khảo liên kết này. Tôi hy vọng hướng dẫn này sẽ giúp bạn phân tích dữ liệu trong tương lai với dữ liệu liên quan đến mã zip, vĩ độ và kinh độ