import urllib.request
import json
import pandas as pd
propertyid = "Property:P856"
url = (
"https://www.wikidata.org/w/api.php?action=query&prop=revisions&titles="
+ propertyid
+ "&rvprop=timestamp|comment|ids&rvlimit=500&format=json"
)
response = urllib.request.urlopen(url)
responsedata = json.loads(response.read().decode("utf-8"))
array = []
for data in responsedata["query"]["pages"]:
for revision in responsedata["query"]["pages"][data]["revisions"]:
print(revision.keys())
break
result = list(responsedata["query"]["pages"].values())[0]
revisions = result["revisions"]
revision = result["revisions"][0].keys()
revision
array = []
for revision in revisions:
array.append([revision["timestamp"], revision["comment"]])
array[:1]
dataframe = pd.DataFrame(array, columns=["timestamp", "modification"])
dataframe['timestamp'] = pd.to_datetime(dataframe['timestamp'], format='%Y-%m-%dT%H:%M:%SZ')
dataframe = dataframe.astype(
dtype={"modification": "<U1000"}
)
dataframe["timestamp"] = pd.to_datetime(
dataframe["timestamp"],
format="%d/%m/%Y",
unit="D",
errors="raise",
).dt.normalize()
dataframe
group = dataframe.groupby("timestamp").agg("count").reset_index()
group
group.describe()
group.dtypes
group.modification.max()
group.modification.min()
import calplot
days = group["timestamp"]
events = pd.Series(list(group["modification"]), index=days)
calplot.calplot(
events,
cmap="YlGn",
yearlabel_kws={"color": "black"},
linewidth=0,
suptitle="Number of modifications per day (last 500)",
)
import plotly.express as px
fig = px.histogram(
group,
x="timestamp",
y="modification",
nbins=20,
labels={"x": "month", "y": "count"},
)
fig.update_layout(bargap=0.2)
fig.show()
import plotly.express as px
fig = px.scatter(
group, x="timestamp", y="modification", labels={"x": "month", "y": "count"}
)
fig.update_layout(bargap=0.2)
fig.show()
import plotly.express as px
fig = px.histogram(group, x="modification", histnorm="probability density", nbins=20)
fig.update_layout(bargap=0.2)
fig.show()
import sys
from SPARQLWrapper import SPARQLWrapper, JSON
endpoint_url = "https://query.wikidata.org/sparql"
query = """SELECT ?heritagesite ?label ?coordinates {
?heritagesite wdt:P1435 wd:Q9259;
wdt:P17 wd:Q142;
rdfs:label ?label;
wdt:P625 ?coordinates.
FILTER (lang(?label)="en")
}
LIMIT 100
"""
def get_results(endpoint_url, query):
user_agent = "WDQS-example Python/%s.%s" % (
sys.version_info[0],
sys.version_info[1],
)
sparql = SPARQLWrapper(endpoint_url, agent=user_agent)
sparql.setQuery(query)
sparql.setReturnFormat(JSON)
return sparql.query().convert()
results = get_results(endpoint_url, query)
array = []
for result in results["results"]["bindings"]:
array.append(
[
result["heritagesite"]["value"],
result["label"]["value"],
result["coordinates"]["value"],
]
)
from shapely import wkt
import geopandas as gp
dataframe = pd.DataFrame(array, columns=["ID", "label", "coordinates"])
dataframe["coordinates"] = dataframe["coordinates"].apply(wkt.loads)
geodataframe = gp.GeoDataFrame(dataframe, geometry="coordinates")
array[:1]
geodataframe.dtypes
import folium
map = folium.Map(location=[45.1093, 2.6753], zoom_start=6)
geo_df_list = [[point.xy[1][0], point.xy[0][0]] for point in geodataframe.geometry]
i = 0
for coordinates in geo_df_list:
map.add_child(
folium.Marker(
location=coordinates,
icon=folium.Icon(color="green"),
popup="Wikidata: <a target='_blank' href='"
+ str(geodataframe.ID[i])
+ "'>"
+ str(geodataframe.label[i]),
)
)
i = i + 1
map