Ich habe die Mietinformationen von suumo in Vorheriger Artikel erhalten. Ich möchte die erfassten Informationen auf einer Karte abbilden, damit ich den Zusammenhang zwischen Standort und Miete sehen kann.
Das Ergebnis der vorherigen Ausführung wird angezeigt. Sie können die folgende Ausgabe erhalten. Diese Abbildung ist eine farbcodierte Kartierung der Standorte von Wohnungen in den 23 Bezirken Tokios nach Preis. Je heller die Farbe, desto billiger und je dunkler sie ist, desto teurer ist sie. Die Farben sind in 4 Ebenen unterteilt, von denen jede im folgenden Bereich aufgeführt ist. 25%: ~ 85.900 Yen 50%: 8,59 ~ 106.200 Yen 75%: 10,62 ~ 136.300 Yen 100%: 13,63 ~ 1,9 Millionen Yen Der erste Quadrant, der zweite Quadrant, der dritte Quadrant und der vierte Quadrant werden jeweils berechnet. Die Farben können bis zu 12 Ebenen sowie 4 Ebenen farbcodiert werden.
Insgesamt sieht man, dass die Miete vom Stadtzentrum nach Südwesten günstiger ist. Auch der Osten und Norden sind relativ billiger als andere Orte. Es mag für Menschen in Tokio natürlich sein, aber es war eine überraschende Entdeckung, weil ich nichts über Tokio wusste. Durch diese Zuordnung können Sie den Standort und die Mietinformationen visuell verstehen. Wenn Sie den Bereich der Informationserfassung erweitern, können Sie die Korrelation in einem größeren Bereich sehen.
Sie müssen die Adresse für die Zuordnung in Längen- / Breitengrad konvertieren. Da ich das Mapping-Ergebnis sofort zeichnen und sehen möchte, habe ich die Koordinatenkonvertierung und das Mapping in verschiedenen Umgebungen durchgeführt.
Um ehrlich zu sein, denke ich nicht, dass es ein Problem ist, alle zusammen in derselben Umgebung zu arbeiten.
Um eine Zuordnung durchzuführen, muss zunächst die erfasste Adresse in Koordinaten (Längs- / Breitengrad) geändert werden. Das Abrufen der Koordinaten des Ortes aus der Adresse oder dem Namen auf diese Weise wird als "Geokodierung" bezeichnet. Es scheint, dass die Geokodierung auch mit APIs wie Google und Yahoo durchgeführt werden kann, aber ich habe aufgehört, weil die Registrierung problematisch zu sein scheint. Ich habe gehört, dass es eine API gibt, die kostenlos geokodiert werden kann, wenn ich nach verschiedenen Dingen suche, also habe ich diese verwendet. Die verwendete API ist geocoding.jp. Als ich es nachgeschlagen habe, gab es verschiedene Implementierungsbeispiele, also habe ich den Code mit Bezug darauf erstellt.
Der Code, den ich erstellt habe, ist unten.
get_zahyo.py
import requests
from bs4 import BeautifulSoup
import time
import csv
def get_lat_lon_from_address(address):
url = 'http://www.geocoding.jp/api/'
latlons = []
payload = {'q': address}
r = requests.get(url, params=payload)
ret = BeautifulSoup(r.content,'lxml')
if ret.find('error'):
raise ValueError("Invalid address submitted. {address}")
else:
x = ret.find('lat').string
y = ret.find('lng').string
time.sleep(10)
return x, y
input_path = 'input.csv'
output_path = 'output.csv'
f1 = open(input_path)
reader = csv.reader(f1)
f2 = open(output_path, 'a')
writer = csv.writer(f2)
zahyo_d = {}
for row in reader:
address = row[1]
if address in zahyo_d:
print('skip')
x = zahyo_d[address][0]
y = zahyo_d[address][1]
else:
print('get zahyo...')
x, y = get_lat_lon_from_address(address)
zahyo_d[address] = [x, y]
row.append(x)
row.append(y)
writer.writerow(row)
Geben Sie den CSV-Dateinamen in Vorheriger Artikel in input_path ein und geben Sie den gewünschten Dateinamen in output_path ein.
Um die Anzahl der Zugriffe zu verringern, werden die einmal erhaltenen Adressen und Koordinaten in einem Wörterbuch gespeichert. Wenn dieselbe Adresse wie die zuvor gesuchte Adresse eingeht, werden sie aus dem gespeicherten Wörterbuch abgerufen. Trotzdem nimmt die Anzahl der Zugriffe zu. Daher muss ein Intervall zwischen den Zugriffszeiten mit time.sleep (10) festgelegt werden, um den anderen Server nicht zu belasten.
Unten finden Sie Beispiele für input.csv und output.csv.
input.csv(Teil)
La Tour Kagurazaka,Nishigokencho, Shinjuku-ku, Tokio,18 Jahre alt,2 Keller 24 Stockwerke über dem Boden,430.000 Yen,2LDK,79.7m2,16. Stock
La Tour Kagurazaka,Nishigokencho, Shinjuku-ku, Tokio,18 Jahre alt,2 Keller 24 Stockwerke über dem Boden,57.80.000 Yen,3LDK,103.4m2,16. Stock
Perle Hakusan,4 Hakusan, Bunkyo-ku, Tokio,36 Jahre alt,8 Geschichten,8.30.000 Yen,3K,42m2,8te Etage
River City 21 Osttürme II,Tsukuda 2, Chuo-ku, Tokio,20 Jahre alt,2 unterirdische 43 Stockwerke über dem Boden,13.90.000 Yen,1LDK,44.2m2,9. Stock
output.csv(Teil)
La Tour Kagurazaka,Nishigokencho, Shinjuku-ku, Tokio,18 Jahre alt,2 Keller 24 Stockwerke über dem Boden,430.000 Yen,2LDK,79.7m2,16. Stock,35.706903,139.737421
La Tour Kagurazaka,Nishigokencho, Shinjuku-ku, Tokio,18 Jahre alt,2 Keller 24 Stockwerke über dem Boden,57.80.000 Yen,3LDK,103.4m2,16. Stock,35.706903,139.737421
Perle Hakusan,4 Hakusan, Bunkyo-ku, Tokio,36 Jahre alt,8 Geschichten,8.30.000 Yen,3K,42m2,8te Etage,35.721231,139.746682
River City 21 Osttürme II,Tsukuda 2, Chuo-ku, Tokio,20 Jahre alt,2 unterirdische 43 Stockwerke über dem Boden,13.90.000 Yen,1LDK,44.2m2,9. Stock,35.668253,139.786297
Es ist in Ordnung, wenn Längen- und Breitengrad hinzugefügt werden.
Selbst wenn Sie von einer Adresse aus nach Koordinaten suchen, gibt es einige Adressen, an denen die Koordinaten nicht abgerufen werden können und ein Fehler auftritt. Da ich die Adresse notiert habe, an der der Fehler aufgetreten ist, wird empfohlen, die Zeile mit diesen Adressen wegzulassen. Es kann eine gute Idee sein, im Fehlerfall ein Wörterbuch mit Adressen und Koordinaten zu speichern, das den anderen Server nicht belastet und die Ausführungszeit verkürzt.
Adresse, an der der Fehler aufgetreten ist
Innenstadt
1 Kandasuda-cho, Chiyoda-ku, Tokio
2 Iwamotocho, Chiyoda-ku, Tokio
1 Kanda Ogawamachi, Chiyoda-ku, Tokio
3 Kanda Surugadai, Chiyoda-ku, Tokio
23. Bezirk Ost
3 Kameari, Katsushika-ku, Tokio
Blumenteehaus 2 in Katsushika-ku, Tokio
West 23 Stationen
3 Numabukuro, Nakano-ku, Tokio
Nokata 3 Nakano-ku, Tokio
Da wir die Adresse in Koordinaten konvertieren konnten, werden wir sie basierend auf den Koordinateninformationen auf der Karte abbilden. Ich habe Folium als Mapping-Bibliothek verwendet.
Bevor ich den Implementierungscode erkläre, werde ich die Verzeichnisstruktur erläutern, wenn die Koordinatenkonvertierung abgeschlossen ist. Um nach Bereich zu teilen, teile ich die Dateien für jeden Teil von Tokios 23 Stationen wie folgt. Der Teil "#Data Acquisition" im Implementierungscode wird unter der Annahme implementiert, dass diese Verzeichnisstruktur verwendet wird. Bitte ändern Sie den Teil "#Data Acquisition" entsprechend Ihrer Dateistruktur.
%ls
mapping.ipynb output_center.csv output_east.csv output_north.csv output_south.csv output_west.csv
Der Code, den ich erstellt habe, ist unten.
mapping.py
import folium
import pandas as pd
#Kartierungsstationen auf der Yamate-Linie
def mapping_stations(_map):
locations_station = [[35.681382, 139.76608399999998],
[35.675069, 139.763328],
[35.665498, 139.75964],
[35.655646, 139.756749],
[35.645736, 139.74757499999998],
[35.630152, 139.74044000000004],
[35.6197, 139.72855300000003],
[35.626446, 139.72344399999997],
[35.633998, 139.715828],
[35.64669, 139.710106],
[35.658517, 139.70133399999997],
[35.670168, 139.70268699999997],
[35.683061, 139.702042],
[35.690921, 139.70025799999996],
[35.701306, 139.70004399999993],
[35.712285, 139.70378200000005],
[35.721204, 139.706587],
[35.728926, 139.71038],
[35.731401, 139.72866199999999],
[35.733492, 139.73934499999996],
[35.736489, 139.74687500000005],
[35.738062, 139.76085999999998],
[35.732135, 139.76678700000002],
[35.727772, 139.770987],
[35.720495, 139.77883700000007],
[35.713768, 139.77725399999997],
[35.707438, 139.774632],
[35.698683, 139.77421900000002],
[35.69169, 139.77088300000003]]
for l in locations_station:
folium.Circle(radius=10, location=l, color='blue').add_to(_map)
return _map
#Daten bekommen
names = ['center', 'east', 'south', 'west', 'north']
df_list = []
for n in names:
path = 'output_{}.csv'.format(n)
df_list.append(pd.read_csv(path, names=['name', 'address', 'age', 'height', 'rent', 'kinds', 'area', 'floor', 'x', 'y']))
df = pd.concat(df_list)
#Miete in Zahlen umrechnen
df['rent'] = df['rent'].str.strip('Zehntausend Yen').astype(float)
#Verarbeitung der gleichen Adresse
address = df['address'].unique()
new_df = []
for adr in address:
df_adr = df.loc[df['address']==adr]
value = df_adr['rent'].mean()
new_df.append([value, df_adr.iloc[0, 8], df_adr.iloc[0, 9]])
df = pd.DataFrame(new_df, columns=['rent', 'x', 'y'])
#Farbentscheidung
#colors = ['#fff4f4', '#ffeaea', '#ffd5d5', '#ffaaaa', '#ff8080', '#ff5555', '#ff2b2b', '#ff0000', '#d50000', '#aa0000', '#800000', '#550000']
#colors = ['#fff4f4', '#ffd5d5', '#ff8080', '#ff2b2b', '#d50000', '#800000']
colors = ['#ffd5d5', '#ff5555', '#d50000', '#550000']
num_color = len(colors)
df.loc[df['rent']<df['rent'].quantile(1/num_color), 'color'] = colors[0]
for i in range(1, num_color-1):
df.loc[(df['rent'].quantile(i/num_color) <= df['rent']) & (df['rent'] < df['rent'].quantile((i+1)/num_color)), 'color'] = colors[i]
df.loc[df['rent']>=df['rent'].quantile((num_color-1)/num_color), 'color'] = colors[-1]
#Kartierung
location = [df['x'].mean(), df['y'].mean()]
_map = folium.Map(location=location, zoom_start=12, tiles="Stamen Toner")
for i in range(len(df)):
folium.Circle(radius=150, location=[df.loc[i, 'x'], df.loc[i, 'y']], color=df.loc[i, 'color'], fill_color=df.loc[i, 'color'], fill=True,).add_to(_map)
#_map = mapping_stations(_map)
#Wertebereich drucken
print('{}% : - {:.2f}'.format(int((1)/num_color*100), df['rent'].quantile((1)/num_color)))
for i in range(1, num_color):
print('{}% : {:.2f} - {:.2f}'.format(int((i+1)/num_color*100), df['rent'].quantile((i)/num_color), df['rent'].quantile((i+1)/num_color)))
#Für Anakonda
_map
#Für gewöhnliche Python
#_map.save('map.html')
Wie im Teil "Verzeichnisstruktur" beschrieben, basiert der Teil "#Datenerfassung" auf der obigen Verzeichnisstruktur. Ändern Sie ihn daher bitte. Wenn es nur eine Ausgabedatei gibt
#Datenerfassung
path = [path to file]
df = pd.read_csv(path, names=['name', 'address', 'age', 'height', 'rent', 'kinds', 'area', 'floor', 'x', 'y'])
Ich denke es ist okay.
Sie können die Anzahl der Farben ändern, indem Sie die gewünschte auswählen.
_map = Mapping_stations (_map) ist eine Funktion, die Stationsinformationen auf der Yamate-Linie in Tokio abbildet. Sie können ausgeben, indem Sie den Kommentar löschen. (Ausgabebeispiel unten)
Im Fall von Anaconda kann es inline angezeigt werden, sodass es mit _map ausgegeben werden kann. Wenn Sie es normalerweise mit Python ausführen, kann es nicht inline angezeigt werden. Sie können es also anzeigen, indem Sie es einmal mit _map.save ('map.html') speichern.
Ich habe versucht, die Wohnungsinformationen auf der Karte abzubilden. Die Zuordnung ist sehr praktisch, da Sie damit Informationen visuell erfassen können. Sie können mehr Gesamtkorrelation sehen, indem Sie mehr kratzen und den Zuordnungsbereich erweitern. Darüber hinaus werden verschiedene Informationen wie Raumgröße und Hierarchie durch Scraping erfasst, sodass ich die Datenanalyse auch mit Pandas ausprobieren möchte.
Recommended Posts