Kartenmietinformationen auf einer Karte mit Python

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.

Ausführungsergebnis

Das Ergebnis der vorherigen Ausführung wird angezeigt. Sie können die folgende Ausgabe erhalten. スクリーンショット 2020-07-10 18.41.00.png 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.

Ausführungsumgebung

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.

Transformation koordinieren

Kartierung

Um ehrlich zu sein, denke ich nicht, dass es ein Problem ist, alle zusammen in derselben Umgebung zu arbeiten.

Transformation koordinieren

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.

Implementierungscode

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.

Hinweis

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

Kartierung

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.

Verzeichnisaufbau

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

Implementierungscode

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) スクリーンショット 2020-07-10 19.19.13.png

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.

Zusammenfassung

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

Kartenmietinformationen auf einer Karte mit Python
Folium: Visualisieren Sie Daten auf einer Karte mit Python
Visualisiere grib2 auf einer Karte mit Python (matplotlib)
Ein Memo mit Python2.7 und Python3 in CentOS
Ich habe mit Python eine Hex-Map erstellt
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
Erstellen Sie eine Python-Umgebung mit ansible auf centos6
Entschlüsseln Sie eine unter iOS mit Python verschlüsselte Zeichenfolge
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Informationen zur Steuerung von Motoren mit Python auf RaspberryPi
Machen Sie eine Lotterie mit Python
Hinweise zur Beschleunigung des Python-Codes mit Numba
Erstellen Sie ein Verzeichnis mit Python
Holen Sie sich Alembic-Informationen mit Python
Erstellen einer Python-Umgebung auf einem Mac
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Lassen Sie uns eine GUI mit Python erstellen.
Erstellen einer Python-Umgebung unter Ubuntu
Löse ABC166 A ~ D mit Python
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Ich habe mit Python eine Lotterie gemacht.
Erstellen einer virtuellen Umgebung mit Python 3
Löse ABC168 A ~ C mit Python
Studie über die Miete in Tokio mit Python (3-2)
Erstellen Sie ein Empfehlungssystem mit Python
Erstellen Sie eine Python-Umgebung in Centos
[Python] Generiere ein Passwort mit Slackbot
Löse ABC162 A ~ C mit Python
Hinweise zur Verwendung von rstrip mit Python.
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Studie über die Miete in Tokio mit Python (3-3)
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Erste Schritte mit Python 3.8 unter Windows
Erstellen Sie eine Python3-Umgebung unter CentOS7
[Python] Erbt eine Klasse mit Klassenvariablen
Ich habe mit Python einen Daemon erstellt
Holen Sie sich Wetterinformationen mit Python & Scraping
Zeichnen Sie einfach eine Karte mit matplotlib.basemap
Schreiben Sie ein Batch-Skript mit Python3.5 ~
[Memo] Tweet auf Twitter mit Python
Steuern Sie den Motor mit einem Motortreiber mit Python auf Raspberry Pi 3!
Beachten Sie, was Sie getan haben, um Flycheck mit Python zu verwenden
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
Erstellen Sie mit Anaconda und PyCharm eine Python-Umgebung auf Ihrem Mac
Visualisieren Sie Präfekturen mit vielen Routen nach Präfekturen auf einer Karte von Japan
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Versuchen Sie, Google Map und Geography Map mit Python anzuzeigen
[Pyenv] Erstellen einer Python-Umgebung mit Ubuntu 16.04
Sammeln von Informationen von Twitter mit Python (Twitter API)
Abrufen von Eigenschaftsinformationen durch Scraping mit Python