Dies ist Qiitas 4. Beitrag. Unerfahrene in der IT-Branche und die Definition von Wörtern können falsch sein. Wenn Sie eine Nachricht haben, würde ich mich freuen, wenn Sie mir einen Rat geben könnten.
Mein Haus ist ein 25 Jahre altes Holzhaus, und der erste Stock ist im Winter sehr kalt und der zweite Stock ist im Sommer mäßig heiß. Wahrscheinlich, weil es sich um ein Holzgebäude handelt, habe ich auch das Gefühl, dass sich die Temperatur im Haus langsam ändert. Zum Beispiel ist es im Juni von 9 bis 11 Uhr kühl, aber das Innere des Hauses wird gegen 19:00 Uhr abends feucht.
Daher wollte ich Temperaturdaten zu verschiedenen Jahreszeiten und an verschiedenen Orten messen, also versuchte ich, Temperaturdaten zu erfassen und die Daten mit Rasberry Pi zu verarbeiten.
Ich wollte unbedingt die Temperaturen an mehreren Standorten gleichzeitig messen und vergleichen, aber aus Budgetgründen konnte ich nur einen Rasberry Pi erhalten. Deshalb habe ich beschlossen, die Messdaten mit den Daten der Meteorologischen Agentur in der Nähe meines Hauses zu vergleichen. Hat.
Scraping ist das Extrahieren spezifischer Informationen von einer Website. Klicken Sie hier für Details (https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3 Bitte überprüfen Sie% 83% AC% E3% 82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0).
Messen Sie Temperatur und Luftfeuchtigkeit mit Raspberry Pi und DHT11 und Erstellen Sie einen Temperatur- und Feuchtigkeitslogger mit Raspberry Zero und DHT11 / items / 2737749d4532150026ee) Ich habe eine Schaltung erstellt und ein Beispielskript mit Bezug auf erstellt.
Ich habe Raspberry Pi 3B + verwendet und die Schaltung sieht so aus.
Für jede Funktion des Beispielskripts [Detaillierte Beschreibung des Temperatur- und Feuchtigkeitssensors (DHT11)](https://www.souichi.club/technology/dht11-datasheet/#parsedatapulluplengths%E3%83%A1%E3%82%BD Ich verstand in% E3% 83% 83% E3% 83% 89).
Da die Daten der Meteorologischen Agentur abgekratzt werden, muss die Zeit der zu verkratzenden Daten mit den vom Sensor erfassten Daten abgeglichen werden.
Da die Fehlerbehandlung durch collect_input und parse_data_pull_up_lengths des Beispielskripts durchgeführt wird, wurde die example.py des Beispielskripts neu geschrieben, damit die gemessenen Daten in der CSV-Datei gespeichert werden können. Es scheint auch, dass die Funktion is_varlid () ausgeführt wird, um zu überprüfen, ob sie ordnungsgemäß abgerufen wurde. Es gibt jedoch einige Fälle, in denen diese Funktion einen Fehler zurückgibt.
Als ich die Anzahl der Fehler mit der Zählvariablen erhielt, ・ Erfolg auf einmal ... 70% ・ Zum 17. Mal erfolgreich ... 15% ・ Zum 33. Mal erfolgreich ... 10% ・ Mehr ... 5% (Es tut mir leid. Ich habe keine Statistiken. Es ist nur subjektiv.) Wenn es fehlschlägt, scheint es in einer Reihe von 2 nach der n-ten Potenz fehlgeschlagen zu sein. Da die Daten diesmal alle 60 Minuten erfasst werden, wird "die Anzahl der Versuche, die anhand der Anzahl der Fehler in der Vergangenheit berücksichtigt werden können" auf 2 plus 10 (= 1029) festgelegt.
import RPi.GPIO as GPIO
import dht11
import time
import datetime
import os
import numpy as np
import pandas as pd
def add_data(filepath):
#Überprüfen Sie, ob die CSV-Datei im angegebenen Pfad vorhanden ist
if os.path.isfile(filepath):
#Lesen Sie, ob es existiert
df = pd.read_csv(filepath, index_col=0)
else:
#Neu erstellen, wenn es nicht vorhanden ist
df = pd.DataFrame([], columns=["year","month","day","hour","sensor_temprature", \
"scraping_temprature","read_try"])
#Erstellen Sie eine Variable, um die Anzahl der Versuche zu zählen
count=0
# is_valid()Lesen Sie die Temperaturdaten bis zu 1029 Mal, bis die Funktion True ist
while count<=1029:
result = instance.read()
count+=1
if result.is_valid():
#Speichern Sie Jahr, Monat und Tag in DataFrame für das Web-Scraping
year = datetime.datetime.now().year
month = datetime.datetime.now().month
day = datetime.datetime.now().day
hour = datetime.datetime.now().hour
temp = result.temperature
hum = result.humidity
data=[year,month,day,hour,temp,hum,"",count]
s = pd.Series(data, index=df.columns)
df = df.append(s, ignore_index=True)
break
return df
# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
instance = dht11.DHT11(pin=14)
filepath = '/home/pi/Desktop/DHT11_Python/data.csv'
df=add_data(filepath)
df.to_csv(filepath)
print(df)
Ich habe es so eingestellt, dass es pünktlich startet, indem ich auf Programme mit systemd auf Raspberry Pi automatisch ausführen verweise. Außerdem werden Arch-Handbuchseiten (SYSTEMD.TIME (7)) unten gemäß "stündlich" festgelegt tun.
Ich habe den Code geschrieben, damit ich die Daten der Meteorological Agency unter Bezugnahme auf Scraping vergangener Wetterdaten mit Python kratzen kann. Der zu beachtende Punkt ist, dass sich die Beschreibungsmethode je nach Version der schönen Suppe und des Raspeltörtchens leicht ändert.
Der Unterschied zwischen der Referenz-URL und der Seite, auf die dieses Mal abgekratzt werden soll, beträgt
--Während die Referenzlink-Seite zwei Tabellen enthält, enthält die Zielseite diesmal nur eine Tabelle.
Daher muss der Code neu geschrieben werden, sofern Tabelle 1 nicht vorhanden ist.
Screenshot dieses Scraping-Ziels
Screenshots der zu kratzenden Links
Andere Änderungen beim Schreiben von Code sind
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import requests
import datetime
import os
import sys
#Durch Ändern der Vor- und Blockcodes wird die Region geändert.
# m_prec=44 repräsentiert Tokio, m_block=1133 repräsentiert Fuchu.
def scraping_weather(m_year,m_month,m_day,m_prec=44,m_block=1133):
url ="https://www.data.jma.go.jp/obd/stats/etrn/view/hourly_a1.php?prec_no={prec}&block_no={block}&year={year}&month={month}&day={day}&view="
url = url.format(prec=m_prec,block=m_block,year=m_year,month=m_month,day=m_day)
html=requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
# id='tablefix2'von<table>Extrakt
table = soup.find('table', id='tablefix1')
#Extrahieren Sie alles in Tabelle 2
th_all = table.find_all('th')
#Spaltenüberschriften manuell speichern
table_column = ["Zeit", "Niederschlag","Temperatur", "Windgeschwindigkeit / Windrichtung(m/s)","日照Zeit間","Schnee(cm)","Windgeschwindigkeit","Windrichtung","降Schnee","積Schnee"]
# <table>Extrahieren Sie alle trs in.
tr_all = table.find_all('tr')
#Das erste tr ist bereits extrahiert, überspringen Sie es also
tr_all = tr_all[1:]
#Berechnen Sie die Anzahl der Zeilen und Spalten und erstellen Sie ein ndarray
number_of_cols = len(table_column)
number_of_rows = len(tr_all)
table_data = np.zeros((number_of_rows, number_of_cols), dtype=np.float32)
#Speichern Sie die Daten jeder Zeile in ndarray
for r, tr in enumerate(tr_all):
td_all = tr.find_all('td')
for c, td in enumerate(td_all):
try:
table_data[r,c] = td.string
except ValueError:
table_data[r,c] = np.nan
#Generieren Sie einen DataFrame der extrahierten Daten
df = pd.DataFrame(data=table_data, columns=table_column)
return df
def combine_scraping_data(df):
date_before=str(0)
#Erkunde alle Daten
for i in range(len(df)):
#Überprüfen Sie, ob in der Vergangenheit Web Scraping durchgeführt wurde
if np.isnan(df.loc[i,"scraping_temprature"]):
year = df.loc[i,"year"]
month = df.loc[i,"month"]
day = df.loc[i,"day"]
#Für heute gibt es keine Scraping-Daten. Überspringen Sie diese, wenn sie mit denen von heute identisch sind
if ((day == datetime.date.today().day)&(month == datetime.date.today().month)):
continue
#Ersatzdatum als Str-Typ
date_now = str(year)+str(month)+str(day)
#Überprüfen Sie, ob sich die vorherige Zeile und das Datum geändert haben
if date_now != date_before:
#Wenn es sich geändert hat, kratzen Sie es und speichern Sie es im DataFrame.
t_df = scraping_weather(year,month,day)
# date_Aktualisieren Sie das Datum der Vorher-Variablen
date_before=date_now
for j in range(len(t_df)):
#Ordnen Sie die Kratzdaten den Sensordaten zu und ersetzen Sie die Kratztemperatur
if df.loc[i,"hour"] == t_df.loc[j,"Zeit"]:
df.loc[i,"scraping_temprature"] = t_df.loc[j,"Temperatur"]
return df
filepath = '/home/pi/Desktop/DHT11_Python/data.csv'
if os.path.isfile(filepath):
df = pd.read_csv(filepath, index_col=0)
else:
print("No data. This python wll be stopped.")
sys.exit()
for i in range(len(df)):
if df.loc[i,'hour']==0:
df.loc[i,'hour'] =24
df.loc[i,'day'] -=1
df = combine_scraping_data(df)
df.to_csv(filepath)
print(df['scraping_temprature'])
Erstellen Sie mit matplotlib ein Diagramm zum Scraping von Daten und speichern Sie es in der angegebenen Datei. Das Diagramm lautet [Zeichnen Sie ein Liniendiagramm mit matplotlib](https://pythondatascience.plavox.info/matplotlib/%E6%8A%98%E3%82%8C%E7%B7%9A%E3%82%B0%E3% Es wurde unter Bezugnahme auf 83% A9% E3% 83% 95) aufgetragen.
Ich habe beschlossen, für jedes Datum einen Ordner im Ergebnisordner zu erstellen und die CSV-Datei und das Diagramm (PNG-Datei) darin zu speichern. In der Abbildung sieht es so aus.
├── creating_graph.py
└── result
├── 6_10
│ ├── 6_10.csv
│ └── 6_10.png
└── 6_11
├── 6_11.csv
└── 6_11.png
Nachdem ich das Diagramm erstellt hatte, entschied ich mich, die Zieldaten aus den Originaldaten zu löschen.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
filepath = '/home/pi/Desktop/DHT11_Python/data.csv'
#Lesen Sie die CSV-Datei mit DataFrame
if os.path.isfile(filepath):
df = pd.read_csv(filepath, index_col=0)
else:
print("No data. This python wll be stopped.")
sys.exit()
#Da ein Tagesdiagramm erstellt wird, listen Sie die Monats- / Tagesdaten auf und führen Sie eine Schleife aus.
for g_month in df["month"].unique():
for g_day in df["day"].unique():
#Zieldaten t_Laden Sie in df
t_df = df[(df['day']==g_day)&(df['month']==g_month)]
#Überspringen, wenn keine Scraping-Daten vorhanden sind
if t_df["scraping_temprature"].isnull().any():
continue
#Einen neuen Ordner erstellen
result_filepath = '/home/pi/Desktop/DHT11_Python/dht11_creating_graph/result/{month}_{day}'
result_filepath = result_filepath.format(month=g_month, day=g_day)
os.makedirs(result_filepath, exist_ok=True)
#Erstellen und speichern Sie den Pfad zum Speichern der CSV-Datei
result_filename = '/{month}_{day}.csv'
result_filename = result_filename.format(month=g_month, day=g_day)
t_df.to_csv(result_filepath+result_filename)
#Erstellen Sie einen Pfad zum Speichern des Diagramms
result_graphname = '/{month}_{day}.png'
result_graphname = result_graphname.format(month=g_month, day=g_day)
#Erstellen Sie ein Diagramm
x=t_df['hour']
y1=t_df['sensor_temprature']
y2=t_df['scraping_temprature']
fig = plt.figure()
p1 = plt.plot(x, y1, linewidth=2)
p2 = plt.plot(x, y2, linewidth=2, linestyle="dashed")
plt.legend((p1[0], p2[0]), ('sensor_temprature', 'scraping_temprature'), loc=2)
plt.xlabel("hour")
plt.ylabel("temprature")
#Speichern Sie das Diagramm
fig.savefig(result_filepath+result_graphname)
#Löschen Sie die grafischen Daten aus den Originaldaten
df = df[(df['day']!=g_day)|(df['month']!=g_month)]
#Indizieren Sie die Originaldaten neu
df.reset_index(inplace=True, drop=True)
#Speichern Sie die Originaldaten
df.to_csv(filepath)
Es gibt viele Dinge zu sehen, aber ich konnte die Daten für den heißen Raum im 2. Stock am 14. Juni und die Daten für den Raum im 1. Stock, der am 16. Juni nicht so heiß ist, abrufen. Wenn Sie sich die Grafik unten in der Grafik im ersten Stock ansehen, ist die Raumtemperatur von 8:00 bis 18:00 Uhr niedriger als die Kratztemperatur, während in der Grafik im zweiten Stock die Raumtemperatur niedriger als die Kratztemperatur ist. Sie können sehen, dass es immer teuer ist.
Grafik des heißen Raumes im 2. Stock
Grafik eines Raumes im ersten Stock, der nicht so heiß ist
Referenzfoto
Es gibt Zweifel an den Messergebnissen, aber da wir das Scraping von Temperaturdaten und die Erstellung von Diagrammen bis zu einem gewissen Grad automatisieren konnten, werden wir diese Zeit beenden. Ich wäre Ihnen dankbar, wenn Sie mich kontaktieren könnten, wenn Sie Bedenken haben!
Recommended Posts