Python Einführung: http://www.diveintopython.net/toc/index.html
Reguläre Ausdrücke: http://www.regexe.de/hilfe.jsp https://pymotw.com/2/re
Pandas: http://www.data-analysis-in-python.org/3_pandas.html : https://bitbucket.org/hrojas/learn-pandas
import json
import pandas as pd
import re
import numpy as np
import matplotlib.pyplot as plt
# json.load erzeugt ein dictionary der JSON Daten
with open('chapter1.json') as json_data:
PoleisRawData = json.load(json_data)
# Abfrage des Datentyps
type(PoleisRawData)
# Ausgabe des Dictionaries
#PoleisRawData
# list() erstellt eine Liste der keys
PoleisKeyList = list(PoleisRawData)
PoleisKeyList
# Listenelemente werden mit eckigen Klammern ausgewählt. Eine Index-Zahl gibt die n-Stelle der Liste aus
PoleisKeyList[1]
for i in PoleisKeyList:
if "Megara" in PoleisRawData[i]:
print(i)
# Der key in eckigen Klammern gibt den Wert des Elements mit dem Key aus
PoleisRawData[PoleisKeyList[4]]
# Liest das Dictionary als Dataframe ein. Namen der Poleis werden als Index benutzt.
dfPoleis = pd.DataFrame([PoleisRawData]).transpose()
dfPoleis.head(4)
# Umnennen der Spalte von 0 zu 'full_text'
dfPoleis = dfPoleis.rename(columns={0: 'Beschreibung'})
dfPoleis.head()
http://www.regexe.de/hilfe.jsp https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
http://www.coli.uni-saarland.de/courses/python1-10/folien/PythonI10-07.pdf
# Konstruktion einer Liste mit sogenannten List-Comprehensions
ListCities = [x[4:] for x in dfPoleis.index]
ListCities
# Extrahiere Name der Polis aus Index
dfPoleis['city'] = [x[4:] for x in dfPoleis.index]
# Extrahiere Nummer des Polis Eintrags
dfPoleis['city_index'] = [int(re.findall('\d{1,2}', x)[0]) for x in dfPoleis.index]
# Sortiere die Zeilen nach der Spalte
dfPoleis = dfPoleis.sort_values(by='city_index')
dfPoleis.head(4)
def ListePattern(value,pattern):
x = re.findall(pattern, value)
if x:
return(x[0][-5:])
ListePattern(dfPoleis["Beschreibung"][0],"Lat\.\s?\d+\.\d+")
# gleiches auch für long.
listLong=ListePattern(dfPoleis['Beschreibung'][0],"long\.\s*\d+\.\d+")
listLong
dfPoleis['Latitude'] = dfPoleis['Beschreibung'].apply(ListePattern,pattern="Lat\.\s?\d+\.\d+").astype(float)
dfPoleis['Longitude'] = dfPoleis['Beschreibung'].apply(ListePattern,pattern="long\.\s*\d+\.\d+").astype(float)
dfPoleis
dfPoleis["Beschreibung"].iloc[0]
(Polyb. 1.18.2) (Diod. 13.85.4 (r 406)) (Diod. 13.108.2) (Hdt. 7.165; IGDS no. 182a) (Pind. Pyth. 6) (Thuc. 6.4.4: µµ ) (Xanthos (FGrHist 765) fr. 33; Arist. fr. 865)
(Karlsson ( 1995) 161 (Waele ( 1971) 195; Hinz ( 1998) 79)
# Definiere Funktion die reguläre Ausdrücke auf den DataFrame anwendet.
def ListePatternFull(value,pattern):
x = re.findall(pattern, value)
if x:
return(x)
dfPoleis['Beschreibung'].iloc[0]
Finde alle groß-geschriebenen Wörter mit mindestens 3 nachfolgenden kleinen Buchstaben.
re.findall('[A-Z][a-z]{3,10}',dfPoleis['Beschreibung'].iloc[0])
Finde alle Ausdrücke wie oben, denen ein Punkt folgt, mit anschließenden Zifferfolgen der Form [Ziffern][Punkt][Ziffern][Punkt][Ziffern]
re.findall('[A-Z][a-z]{1,10}\. \d{1,3}\.\d{1,3}\.\d{1,3}',dfPoleis['Beschreibung'].iloc[0])
Finde alle Ausdrücke wie oben, wobei statt des Punktes nach den kleinen Buchstaben auch zwei Leerzeichen und eine runde Klammer folgen können
re.findall('[A-Z][a-z]{1,10}[\.| ] [(|\d{0,4}][\d{1,4}| ][\.|\d{}]\d{1,3}[\.|\d][\d|)]',dfPoleis['Beschreibung'].iloc[0])
#Alternativ kann man auch Gruppen definieren zB. (A(B|C))
#re.findall('([A-Z][a-z]{1,10}(\. \d{1,3}\.\d{1,3}\.\d{1,3}|\s{2}\(\s\d{4}))',dfPoleis['Beschreibung'].iloc[0])
dfPoleis['Namen'] = dfPoleis['Beschreibung'].apply(ListePatternFull,pattern=('[A-Z][a-z]{3,10}'))
dfPoleis['Quellen'] = dfPoleis['Beschreibung'].apply(ListePatternFull,pattern=('[A-Z][a-z]{1,10}[\.| ] [(|\d{0,4}][\d{1,4}| ][\.|\d{}]\d{1,3}[\.|\d][\d|)]'))
dfPoleis.head(4)
#dfBesp = dfPoleis['Beschreibung'].str.replace('(','\n(').str.replace(')',')\n')
#print(dfBesp.iloc[0])
Empedokles ( 496) Theron ( 476) Timoleon c. 338
# MALTE: RE für die Primärquellen; Sekundärquellen; Namen entwickeln und an df anhängen.
Lese Werte der Spalte Quellen als Liste aus.
mainList = dfPoleis['Quellen'].values.tolist()
Reduziere Unterlisten auf eine Gesamtliste.
quellenListe = []
for sublist in mainList:
if sublist:
for k in range(len(sublist)):
quellenListe.append(sublist[k])
quellenListe[:10]
Zähle die Häufigkeit der verschiedenen Quellen und speichere als Dictionary.
quellenVerteilung = {x:quellenListe.count(x) for x in quellenListe}
quellenVerteilung['Diod. 14.90.3']
Erzeuge DataFrame, mit neuem Index und Namen der Spalten. Sortiere diesen Nach der Häufigkeit der Quelle.
dfQuellenVerteilung = pd.DataFrame([quellenVerteilung])
dfQuellenVerteilung = dfQuellenVerteilung.transpose().reset_index()
dfQuellenVerteilung = dfQuellenVerteilung.rename(columns={'index': 'Quelle', 0:'Häufigkeit'})
dfQuellenVerteilung.sort_values(by='Häufigkeit',ascending=False).head(10)
Zeige die Verteilung der Häufigkeiten als Histogram. Um auch Häufigkeiten zu erkennen, die nicht so oft auftreten, kann man in die Darstellung zoomen. Das Haus-Symbol zeigt wieder den ursprünglichen Zustand der Figur.
%matplotlib notebook
fig, ax = plt.subplots(figsize=(8,6))
dfQuellenGrouped = dfQuellenVerteilung.groupby(by='Häufigkeit').plot(kind='hist', ax=ax, legend=False)
import folium
from folium import plugins
from folium.map import *
Remove all entries where no latitude or longitude is given.
dfPoleisMap = dfPoleis.dropna(axis=0)
poleis_map = folium.Map(location=[dfPoleisMap["Latitude"][0],dfPoleisMap["Longitude"][0]], zoom_start=8)
marker = FeatureGroup(name='Poleis')
marker_cluster = folium.MarkerCluster().add_to(marker)
for i in range(len(dfPoleisMap)):
folium.Marker([dfPoleisMap['Latitude'][i], dfPoleisMap['Longitude'][i]],popup='Cityname:' + str(dfPoleisMap["city"][i]) + ' CityIndex:' + str(dfPoleisMap["city_index"][i]),icon=folium.Icon(icon='ok')).add_to(marker_cluster)
poleis_map.add_children(marker)
poleis_map.add_children(folium.map.LayerControl())