Python Adventskalender 2019 Tag 25: christus_tree :.
Am selben 25. Tag des letztjährigen Python-Adventskalenders 2018 schrieb ich einen Artikel mit dem Titel Statistiken, die in einer zu Hause erstellten Python- und Datenanalyseumgebung gelernt wurden. In dem Artikel haben wir die Daten des höchsten Jahreseinkommens erhalten, die aus dem 15. Entwurf der Teilnahmebenutzerrangliste von Job Change Draft stammen, und eine einfache Datenanalyse durchgeführt.
Dieser Artikel fasst die Ergebnisse einer Datenanalyse des Ingenieurmarkts unter Verwendung von Daten aus dem 22. Entwurf der teilnehmenden Benutzerrankings zusammen.
Es ist ungefähr um diese Zeit, als ich das Ende des Jahres fühle, aber werfen wir einen Blick auf den aktuellen Stand des Ingenieurmarktes bis 2020.
Der Code, den ich letztes Jahr geschrieben habe, hat nur die höchste Menge erhalten, daher habe ich ihn so geändert, dass alle Daten aus den Benutzerrankingdaten entfernt werden.
Führen Sie zunächst das folgende Programm aus, um die für die Datenanalyse erforderlichen Daten zu erfassen (*). Darüber hinaus wird die Umgebung dieses Artikels von Razupai betrieben.
** (*) Überprüfen Sie beim Scraping die Nutzungsbedingungen des Zieldienstes und berücksichtigen Sie die Belastung auf der Dienstseite. ** ** **
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
#Importieren Sie die zum Scraping erforderlichen Module
import csv
import sys
sys.path.append('/home/pi/.local/lib/python3.5/site-packages/')
import time
import traceback
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
#Optionen für die Verwendung von Headless Chrome
options = webdriver.chrome.options.Options()
options.add_argument('--headless')
#Treibereinstellungen
browser = webdriver.Chrome(executable_path="/usr/lib/chromium-browser/chromedriver", chrome_options=options)
#Anmeldeinformationen
USER = “user”
PASS = “pass”
#Anmeldebildschirm anzeigen
url_login = "https://job-draft.jp/sign_in"
browser.get(url_login)
time.sleep(1)
print("Ich habe die Anmeldeseite besucht")
#Geben Sie Ihre E-Mail-Adresse und Ihr Passwort in das Formular ein
e = browser.find_element_by_id("user_email")
e.clear()
e.find_element_by_id("user_email").send_keys(USER)
e = browser.find_element_by_id("user_password")
e.clear()
e.find_element_by_id("user_password").send_keys(PASS)
time.sleep(1)
#Formular abschicken
e.find_element_by_xpath("//*[@id=\"new_user\"]/div[4]").click()
print("Sie sind jetzt angemeldet")
#Funktion
list = []
dict = {}
page = ""
last = 50
def get_user_data():
url = "https://job-draft.jp/festivals/22/users?page="
url = url+str(page)
browser.get(url)
count = 12
if page == 49:
count = 8
num = 2
while num < count:
try:
user = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-3 > div:nth-child(2) > a > span")
age = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-3 > div:nth-child(3) > span")
name = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-9 > div.row > div.col-xs-4.col-sm-3.col-md-3.col-lg-3 > span.f-w-bold.u-font-ml")
max_amount = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-9 > div.row > div:nth-child(2) > span.f-w-bold.u-font-ml")
cum_avg = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-9 > div.row > div:nth-child(3) > span.f-w-bold.u-font-ml")
ambition = browser.find_elements_by_css_selector("#page-wrapper > div.wrapper-content > div > div > div.col-xs-12.col-sm-12.col-md-8.col-lg-8 > div.ibox > div > div > div:nth-child("+(str(num))+") > div > div.col-xs-9 > div.u-m-t-5 > div:nth-child(1) > span.f-w-bold.u-font-mm")
except NoSuchElementException:
print("Es gab kein Element")
sys.exit(1)
for user, age, name, max_amount, cum_avg, ambition in zip(user, age, name, max_amount, cum_avg, ambition):
user = user.text
age = age.text
name = name.text
max_amount = max_amount.text
max_amount = max_amount.replace('Zehntausend Yen', '')
cum_avg = cum_avg.text
cum_avg = cum_avg.replace('Zehntausend Yen', '')
ambition = ambition.text
print(user)
print(age)
print(name)
print(max_amount)
print(cum_avg)
print(ambition)
dict = {"user": user, "age": age, "name": name, "max_amount": max_amount, "cum_avg": cum_avg, "ambition": ambition }
list.append(dict)
with open('./user_ranking.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow(dict.values())
num += 1
def main():
print("Starten Sie das Daten-Scraping")
global page
global last
try:
if not page:
get_user_data()
page = 2
time.sleep(3)
#Schleife zur letzten Seite
while page < last:
get_user_data()
page += 1
time.sleep(3)
except Exception as e:
traceback.print_exc()
sys.exit(99)
#Beenden Sie den Treiber und schließen Sie alle zugehörigen Fenster
browser.quit()
print("Daten-Scraping erfolgreich abgeschlossen")
#wird bearbeitet
if __name__ == '__main__':
main()
Lesen Sie die CSV-Datei, die Sie durch Ausführen des obigen Programms von Jupyter Notebook erhalten haben. Wenn Sie in Pandas kein Argument festlegen, wird die erste Zeile als Kopfzeile erkannt. Die erfassten Daten haben keinen Header. Wenn Sie "header = None" angeben, wird der Header automatisch nach Nummer hinzugefügt. Geben Sie den Header jedoch zum besseren Verständnis an.
import numpy as np
import pandas as pd
#CSV-Datei lesen
df = pd.read_csv("/tmp/user_ranking.csv", names=("Alter", "Höchstbetrag", "Nutzername", "Anzahl der Nominierungen", "Ambition", "Kumulativen Durchschnitt"))
Überprüfen Sie den Anfang des Datenrahmens und stellen Sie sicher, dass er geladen ist.
df.head()
Da die gescrapten Daten als Diktat gespeichert werden, sind die Schlüssel nicht in Ordnung. Es ist etwas schwer zu erkennen, daher werde ich die Schlüssel neu anordnen, damit sie mit der Website übereinstimmen.
#Sortieren
df = df.loc[:, ["Nutzername","Alter", "Anzahl der Nominierungen", "Höchstbetrag", "Kumulativen Durchschnitt", "Ambition"]]
Es wurde neu angeordnet, um die Sicht zu erleichtern. Jetzt bist du bereit.
Die Grundidee der Statistik lautet wie folgt.
Der 22. Entwurf wurde von 486 Personen besucht. Davon wurden 320 nominiert und 166 nicht. Wie ich im letztjährigen Artikel geschrieben habe, ändert sich der Durchschnittswert abhängig davon, ob "kein Termin" enthalten ist oder nicht.
Da es den Anschein hat, dass das in den Angebotsergebnissen angegebene durchschnittliche Jahresgehalt von denjenigen berechnet wird, die "keine Ernennung" ausschließen, werden wir die Analyse anhand der Daten ohne "keine Ernennung" fortsetzen.
Entfernen Sie nicht numerische Spalten aus dem Datenrahmen für Statistiken.
#Anzahl anderer Nominierungen als 0
df_nominated = df[df['Anzahl der Nominierungen'] != 0]
#Nicht numerischen Wert löschen
df_nominated = df_nominated.drop(['Alter', 'Nutzername', 'Ambition'], axis=1)
Stellen Sie sicher, dass es sich nur um eine Nummer handelt.
df_nominated.head()
Überprüfen Sie als Nächstes den Datentyp. Sie können sehen, dass der maximale Betrag und der kumulative Durchschnitt ** Objekt ** sind.
#Überprüfen Sie den Datentyp
df_nominated.dtypes
Da die Statistik nicht bestätigt werden kann, ändern Sie sie in den Typ int. Wechseln Sie entsprechend dem Datentyp der Anzahl der Nominierungen zum Typ int64.
#Datentypkonvertierung
df_nominated.loc[:, "Höchstbetrag"] = df_nominated.loc[:, "Höchstbetrag"].astype(np.int64)
df_nominated.loc[:, "Kumulativen Durchschnitt"] = df_nominated.loc[:, "Kumulativen Durchschnitt"].astype(np.int64)
Nachdem der Datentyp int64 ist, überprüfen Sie die Statistiken. Der durchschnittliche Höchstbetrag beträgt ** 6,7 Millionen Yen ** und die Standardabweichung beträgt ** 1,2 Millionen Yen **. Der Markt bewegt sich von 5,5 Millionen Yen auf 7,9 Millionen Yen.
#Statistiken anzeigen
df_nominated.describe()
Als nächstes überprüfen wir den Korrelationskoeffizienten. Wie Sie sehen können, besteht eine starke positive Korrelation zwischen dem Höchstbetrag und dem kumulierten Durchschnitt.
#Korrelationskoeffizienten anzeigen
df_nominated.corr()
Überprüfen Sie die Beziehung der Daten für jede Spalte zur Streudiagrammmatrix. Die Größe des Diagramms kann mit "figsize" geändert werden. Die Einheit ist Zoll.
#Streudiagrammmatrix anzeigen
%matplotlib inline
from pandas.plotting import scatter_matrix
_ = scatter_matrix(df_nominated, figsize=(8,6))
Vergleichen wir die maximale Menge im Histogramm. Extrahieren Sie die maximale Menge aus dem Datenrahmen.
#In aufsteigender Reihenfolge sortieren
df_aomount = df_nominated.sort_values(by="Höchstbetrag")
#Extrahieren Sie die höchste Menge aus dem Datenrahmen und fügen Sie sie der Liste hinzu
amount_list = []
for a in df_aomount["Höchstbetrag"]:
amount_list.append(a)
Sie können sehen, dass es viele im Bereich von 6 Millionen Yen gibt.
#Anzeige als Histogramm
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.hist(amount_list, rwidth=10, bins=40)
plt.xlabel('Maximum amount')
plt.ylabel('Number of people')
plt.show()
Überprüfen Sie das Histogramm für jede Altersgruppe separat.
Bereiten Sie auch die Daten aus dem Datenrahmen vor.
import re
#In aufsteigender Reihenfolge sortieren
df_age = df.sort_values(by="Höchstbetrag")
df_age = df_age[df_age['Anzahl der Nominierungen'] != 0]
s10_list = []
s20_list = []
s30_list = []
s40_list = []
s50_list = []
s60_list = []
#Nach Alter aus dem Datenrahmen extrahieren und zur Liste hinzufügen
for age, amount in zip(df_age["Alter"], df_age["Höchstbetrag"]):
if type(amount) is str:
amount = np.int64(amount)
if re.match('10er', age):
s10_list.append(amount)
elif re.match('20er Jahre', age):
s20_list.append(amount)
elif re.match('30er Jahre', age):
s30_list.append(amount)
elif re.match('Vierziger Jahre', age):
s40_list.append(amount)
elif re.match('50er Jahre', age):
s50_list.append(amount)
elif re.match('60er Jahre', age):
s60_list.append(amount)
Anzeige als Histogramm.
#Anzeige als Histogramm (mehrfach)
fig, ax = plt.subplots(figsize=(10,8))
labels = ['10', '20', '30', '40', '50', '60']
ax.hist((s10_list, s20_list, s30_list, s40_list, s50_list, s60_list), label=labels)
plt.xlabel('Maximum amount')
plt.ylabel('Number of people')
ax.legend()
plt.show()
Ursprünglich ist die Anzahl der Stichproben gering, aber es gibt keine Termine für Personen in den Fünfzigern und Sechzigern, und es ist ersichtlich, dass der Markt in den Zwanzigern und Dreißigern wächst, obwohl er innerhalb des erwarteten Bereichs liegt.
Aktivieren Sie das Kontrollkästchen Whisker-Diagramm. Die Box Whisker sind perfekt, wenn Sie Ausreißer finden möchten.
#Wird als Box Whisker angezeigt
fig, ax = plt.subplots(figsize=(10,8))
labels = ['10', '20', '30', '40', '50', '60']
ax.boxplot((s10_list, s20_list, s30_list, s40_list, s50_list, s60_list), labels=labels)
plt.xlabel('age')
plt.ylabel('Maximum amount')
plt.show()
Sie können sehen, dass die 10-Millionen-Yen-Klasse als Ausreißer erkannt wird. Ist es interessant, das Jahreseinkommen in den Dreißigern zu sehen? Der Unterschied in der Reichweite ist in jeder Altersgruppe am größten.
Die Daten sagen uns, dass sich die Differenz des Jahreseinkommens in den 30er Jahren vergrößern wird. Sie können auch sehen, dass die Mindestgrenze für Menschen in den Vierzigern 6 Millionen Yen beträgt.
wordcloud Extrahieren Sie die Ambitionen in den Scraped-Daten und zeigen Sie sie zur Visualisierung in der Wortwolke an.
Führen Sie den folgenden Befehl aus, um WordCloud zu verwenden, um die Umgebung zu erstellen (*). In diesem Artikel wird ** fonts-takao-mincho ** für die japanische Schriftart verwendet.
(*) Die Umgebung dieses Artikels ist Razupai
$ pip3 install wordcloud
$ sudo apt-get install fonts-takao-mincho
Extrahieren Sie Ambitionen aus dem Datenrahmen und fügen Sie sie der Liste hinzu.
#Extrahieren Sie Ambitionen aus Datenrahmen und fügen Sie sie der Liste hinzu
word_list = []
for w in df["Ambition"]:
if type(w) is float:
w = str(w)
word_list.append(w)
Kombinieren Sie die Elemente der Liste zu einem Wortobjekt.
#In Word-Objekt speichern
word = ''
for w in word_list:
word += w
word.replace(',', '')
Erstellen Sie eine Wortwolke. Wenn Sie zu diesem Zeitpunkt auf Japanisch anzeigen möchten, geben Sie den Schriftpfad an.
from wordcloud import STOPWORDS, WordCloud
#Wortwolkenerstellung
wordcloud = WordCloud(width=1200, height=900, background_color='white', colormap='winter', font_path='/usr/share/fonts/truetype/fonts-japanese-mincho.ttf')
wordcloud.generate(word)
wordcloud.to_file('wordcloud.png')
Zeigen Sie die erstellte Wortwolke an.
#Bildschirm
from IPython.display import Image
Image("./wordcloud.png ")
Was ich bei der Analyse der Daten des Ingenieurmarktes gesehen habe
Es war eine wesentliche und universelle Sache, die sich nie geändert hat, ** Wissen zu lernen und Ingenieur zu werden **.
Wir werden das obige Programm ein wenig verbessern und andere erfasste Daten analysieren.
Wir werden die Daten der kumulativen Liste der teilnehmenden Unternehmen als Ranking verwenden, um zu untersuchen, welche Arten von Unternehmen beliebt sind. Bereiten Sie den Datenrahmen auf die gleiche Weise vor.
Die folgenden sortieren ** Nominierungen ** in absteigender Reihenfolge und zeigen die Top Ten an. Da die Anzahl der Nominierungen groß ist, können Sie sehen, dass sich das Unternehmen auf Rekrutierungsaktivitäten konzentriert.
#CSV-Datei lesen
df_com = pd.read_csv("/tmp/companies_list.csv", names=("Name der Firma", "Synthität", "Name", "Anzahl der Liebesrufe", "Zustimmung (Akzeptanzrate)"))
#Sortieren Sie die Nominierungen in absteigender Reihenfolge und zeigen Sie die Top 10 an
df_com.sort_values(by="Name", ascending=False).head(10)
(*) Der Synthesegrad wird auf NaN gesetzt, da das Datenattribut ** hidden-xs.hidden-sm ** ist. Daher wurde dieses Programm als eine Art Gerät erkannt und angezeigt und konnte nicht erfasst werden.
Die folgenden Sortierungen ** Liebesanrufe ** in absteigender Reihenfolge und Anzeige der Top 10. Sie können sehen, dass es ein beliebtes Unternehmen ist, weil es in absteigender Reihenfolge der Liebesrufe ist.
#Sortieren Sie die Anzahl der Liebesrufe in absteigender Reihenfolge und zeigen Sie die Top 10 an
df_com.sort_values(by="Anzahl der Liebesrufe", ascending=False).head(10)
Untersuchen Sie frühere Gebotsergebnisse. Die gescrapten Daten werden in absteigender Reihenfolge des Index sortiert, da sich die 22. Daten oben befinden.
#CSV-Datei lesen
df_results = pd.read_csv("/tmp/past_bid_results.csv", names=("Zentrale Darstellung Jahreseinkommen", "Mal", "Anzahl der teilnehmenden Unternehmen", "Die Anzahl der Teilnehmer", "Gesamtzahl der Nominierungen", "Jährliches Gesamteinkommen dargestellt", "Durchschnittliches Jahresgehalt"))
#Sortieren
df_results = df_results.loc[:, ["Mal", "Die Anzahl der Teilnehmer", "Anzahl der teilnehmenden Unternehmen", "Gesamtzahl der Nominierungen", "Durchschnittliches Jahresgehalt", "Zentrale Darstellung Jahreseinkommen", "Jährliches Gesamteinkommen dargestellt"]]
#Nach absteigendem Index sortieren
df_results = df_results.sort_index(ascending=False)
Überprüfen Sie die Anzahl der Teilnehmer, die Anzahl der teilnehmenden Unternehmen und die Gesamtzahl der Nominierungen im letzten Gebot in chronologischer Reihenfolge.
x = ['1', '2', '3', '4', '5', '6' , '7' , '8' , '9' , '10' , '11' , '12' , '13' , '14' , '15' , '16' , '17' , '18' , '19' , '20' , '21' , '22']
y = []
y2 = []
y3 = []
for i in df_results["Die Anzahl der Teilnehmer"]:
y.append(i)
for i in df_results["Anzahl der teilnehmenden Unternehmen"]:
y2.append(i)
for i in df_results["Gesamtzahl der Nominierungen"]:
y3.append(i)
fig, ax = plt.subplots()
ax.plot(x, y, label='Number of participants')
ax.plot(x, y2, label='Number of participating companies')
ax.plot(x, y3, label='Total nominations')
ax.legend(loc='best')
plt.xlabel('time')
plt.ylabel('number')
plt.show()
Die Zahl der Teilnehmer ist nahezu unverändert geblieben, und die Zahl der teilnehmenden Unternehmen hat nach und nach zugenommen. Die Gesamtzahl der Nominierungen hat sich um -36% verringert, berechnet auf der Grundlage der Änderungsrate (*) der 15. Sitzung, die zur gleichen Zeit wie im letzten Jahr stattfand.
Änderungsrate= \frac{(Referenzzeitpunkt-Referenzzeit jedes Mal)}{Referenzzeit} × 100
Überprüfen Sie das durchschnittliche Jahresgehalt und das zentrale Jahresgehalt der Ergebnisse früherer Gebote in chronologischer Reihenfolge.
x = ['1', '2', '3', '4', '5', '6' , '7' , '8' , '9' , '10' , '11' , '12' , '13' , '14' , '15' , '16' , '17' , '18' , '19' , '20' , '21' , '22']
y = []
y2 = []
for i in df_results["Durchschnittliches Jahresgehalt"]:
y.append(i)
for i in df_results["Zentrale Darstellung Jahreseinkommen"]:
y2.append(i)
fig, ax = plt.subplots()
ax.plot(x, y, label='Average presented annual income')
ax.plot(x, y2, label='Centrally presented annual income')
ax.legend(loc='best')
plt.xlabel('time')
plt.ylabel('Amount of money')
plt.show()
Das durchschnittliche Jahresgehalt und das zentral präsentierte Jahresgehalt vom 3. bis zum 19. waren im Aufwärtstrend, aber es ist zu sehen, dass sie vom 20. bis zum 22., der Ende dieses Jahres stattfand, zurückgegangen sind.
Soweit die teilnehmenden Unternehmen als Prämisse gesehen werden, gibt es kein SIer-System. Die meisten von ihnen sind operative Unternehmen, die grob in große Unternehmen, webbasierte Mega-Ventures und Startups unterteilt werden können. Darüber hinaus haben die meisten Unternehmen ihren Sitz in Tokio.
Aus den Beispieldaten kann daher ** der Ingenieurmarktwert der Betreibergesellschaft ** abgeleitet werden.
Das Obige ist eine Zusammenfassung der Umfrageergebnisse basierend auf den Annahmen.
Basierend auf den Umfrageergebnissen von 2018, die im IT Human Resources White Paper 2019 aufgeführt sind, beträgt die Gesamtzahl der inländischen IT-Humanressourcen ** 1.226.000 **. Unter ihnen sind 938.000 IT-Mitarbeiter des IT-Unternehmens (IT-Anbieterseite) und 288.000 ** IT-Mitarbeiter des IT-Unternehmens (IT-Benutzerseite).
Quelle: Weißbuch zur IT-Personalabteilung 2019 Abbildung 1-2-8 Schätzung der Gesamtzahl der IT-Personalabteilung
Siehe "Jahresbericht 2018 der Arbeitskräfteerhebung" des Jahresberichts der Arbeitskräfteerhebung, der ein Umfragematerial des Ministeriums für innere Angelegenheiten und Kommunikation ist. Die durchschnittliche Anzahl regulärer männlicher Angestellter / Angestellter lag 2018 bei 5 bis 6,99 Millionen Yen, was mit 22,8% der höchste Wert war (plus 0,1 Punkte gegenüber dem Vorjahr), gefolgt von 3 bis 3,99 Millionen Yen mit 19,8% (gleiche Rate wie im Vorjahr). Es ist geworden. Bei Männern und Frauen liegt der höchste Preis bei 3 bis 3,99 Millionen Yen.
Quelle: Statistische Tabelle II Detaillierte Tabelle "II-A-Tabelle 3" - "Arbeitseinkommen (jährlich), Anzahl der Beschäftigten nach Beschäftigungsart"
Informationen zu statistischen Informationen zu Löhnen von Systemingenieuren und Programmierern finden Sie unter e-Stat, einer Website des Regierungsstatistikportals, auf der Sie japanische Statistiken anzeigen können. Es ist unten gezeigt.
Es ist ersichtlich, dass die im Entwurf für einen Karrierewechsel beobachteten Daten nur einen kleinen Teil der insgesamt rund 1,2 Millionen inländischen IT-Mitarbeiter ausmachen.
Da der Begriff IT-Personal im weitesten Sinne verwendet wird, umfasst er Systemingenieure, Programmierer und Berater. Die meisten von ihnen lassen sich grob in die Informationsdienstleistungsbranche der Informations- und Kommunikationsbranche und die das Internet begleitende Dienstleistungsbranche einteilen. Da jedoch die Ingenieure, die in Kraftfahrzeugen wie dem Automobilbau einbauen, in die Automobilindustrie eingeteilt sind, ist die tatsächliche Situation in der gesamten Branche Es stellte sich heraus, dass es schwierig zu schätzen war.
Ein Blick auf den jährlichen Arbeitskräfteerhebungsbericht des Ministeriums für innere Angelegenheiten und Kommunikation geht aus dem Entwurf des Arbeitsplatzwechsels hervor, der auf der Tatsache beruht, dass es viele reguläre männliche Angestellte und Angestellte in der Klasse 500 bis 699 gibt, und auf statistischen Daten zu E-Stat-Löhnen. Der Marktwert von 6 Millionen Yen kann für die gesamte Branche gleich sein.
Ich denke, dass Geld später kommen wird, wenn meine Fähigkeiten (was ich gut kann) mit denen der Gesellschaft und des Unternehmens übereinstimmen. Lassen Sie uns die Kante arbeiten.