<jupyter_start><jupyter_text>Seitenaufrufe In den folgenden Statistiken sind Seitenaufrufe durch Bots und Spiders rausgerechnet.<jupyter_code>def pageviews(node, start, end):
    result = wb.pageviews(node["title"], start, end) if node["title"] else 0
    
    return result + sum((pageviews(x, start, end) for x in node["children"]))<jupyter_output><empty_output><jupyter_text>Seitenaufrufe im Wintersemester 2016/17<jupyter_code>def ws16(what, node):
    print(what, pageviews(node, "20161001", "20170331"))

ws16("Gesamt:", mfnf)
ws16("Grundlagenbuch:", grund)
ws16("Analysis 1:", ana1)
ws16("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 1205677
Grundlagenbuch: 524177
Analysis 1: 571766
Lineare Algebra 1: 60159<jupyter_text>Seitenaufrufe im Sommersemester 2017<jupyter_code>print("Gesamt:", pageviews(mfnf, "20170401", "20170930"))
print("Grundlagenbuch:", pageviews(grund, "20170401", "20170930"))
print("Analysis 1:", pageviews(ana1, "20170401", "20170930"))
print("Lineare Algebra 1:", pageviews(la1, "20170401", "20170930"))<jupyter_output>Gesamt: 666645
Grundlagenbuch: 243700
Analysis 1: 337241
Lineare Algebra 1: 49434<jupyter_text>Seitenaufrufe im WiSe 2017/18 und SoSe 18<jupyter_code>def ws16(what, node):
    print(what, pageviews(node, "20161001", "20170930"))

ws16("Gesamt:", mfnf)
ws16("Grundlagenbuch:", grund)
ws16("Analysis 1:", ana1)
ws16("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 1872322
Grundlagenbuch: 767877
Analysis 1: 909007
Lineare Algebra 1: 109593<jupyter_text>Wachstum der Seitenaufrufe im Zeitraum 01.07.2017 - 30.09.2017 im Vergleich zum Vorjahr<jupyter_code>def w(what, node):
    p = (pageviews(node, "20170701", "20170930") / pageviews(node, "20160701", "20160930") - 1)*100
    print(what, ("%.1f" % p) + "%")

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 39.3%
Grundlagenbuch: 8.1%
Analysis 1: 62.7%
Lineare Algebra 1: 273.3%<jupyter_text>Autorenbeiträge<jupyter_code>def revisions(node, start, end):
    result = [x for x in wb.revisions(node["title"]) if x["date"] >= start and x["date"] <= end]
    
    return result + sum((revisions(x, start, end) for x in node["children"]), [])<jupyter_output><empty_output><jupyter_text>Anzahl der Bearbeitungen im Wintersemester 2017/18<jupyter_code>def ws16(what, node):
    print(what, len(revisions(node, date(2016, 10, 1), date(2017, 3, 31))))

ws16("Gesamt:", mfnf)
ws16("Grundlagenbuch:", grund)
ws16("Analysis 1:", ana1)
ws16("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 2783
Grundlagenbuch: 86
Analysis 1: 1769
Lineare Algebra 1: 690<jupyter_text>Anzahl der Bearbeitungen im Sommersemester 2018<jupyter_code>def w(what, node):
    print(what, len(revisions(node, date(2017, 4, 1), date(2017, 9, 30))))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 2740
Grundlagenbuch: 40
Analysis 1: 1833
Lineare Algebra 1: 479<jupyter_text>Anzahl der Bearbeitungen im WiSe 17/18 und SoSe 18 insgesamt<jupyter_code>def w(what, node):
    print(what, len(revisions(node, date(2016, 10, 1), date(2017, 9, 30))))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 5523
Grundlagenbuch: 126
Analysis 1: 3602
Lineare Algebra 1: 1169<jupyter_text>Wachstum in den Bearbeitungen im Vergleich zum VorjahrWachstum der Bearbeitungen im Zeitraum 01.10.2016-30.09.2017 im Vergleich zum Zeitraum 01.10.2015-30.09.2016<jupyter_code>def w(what, node):
    p = (len(revisions(node, date(2016, 10, 1), date(2017, 9, 30))) / len(revisions(node, date(2015, 10, 1), date(2016, 9, 30))) - 1)*100
    print(what, ("%.1f" % p) + "%")

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 49.1%
Grundlagenbuch: -38.8%
Analysis 1: 104.2%
Lineare Algebra 1: 0.9%<jupyter_text>Anzahl der Autoren<jupyter_code>from functools import reduce

def authors(node):
    result = set(((x["user"], x.get("anon", False) == "") for x in wb.revisions(node["title"])))
    
    result = reduce(lambda x, y: x | y, [authors(x) for x in node["children"]], result)
    
    return result<jupyter_output><empty_output><jupyter_text>Gesamtzahl der Autoren und Autorinnen mit anonymen Autoren / AutorinnenAnonnyme Autoren / Autorinnen sind Personen, die sich nicht angemeldet haben und für die Ihre IP-Adresse hinterlegt wurde. Da eine Personen unter mehreren IP-Adressen am Projekt mitgewirkt haben kann ist die folgende Statistik eine obere Grenze für die Anzahl an Autoren / Autorinnen im Projekt.<jupyter_code>def w(what, node):
    print(what, len(authors(node)))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 721
Grundlagenbuch: 304
Analysis 1: 381
Lineare Algebra 1: 53<jupyter_text>Anzahl der Autoren ohne anonyme AutorenDies ist eine untere Grenze für die Anzahl der tatsächlichen Autoren / Autorinnen im Projekt<jupyter_code>def w(what, node):
    print(what, len([x for x in authors(node) if not x[1]]))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 176
Grundlagenbuch: 92
Analysis 1: 99
Lineare Algebra 1: 20<jupyter_text>Hinzugefügte Bytes im Zeitraum 1.10.2016 – 30.9.2017<jupyter_code>def w(what, node):
    print(what, sum(x["diffsize"] for x in revisions(node, date(2016, 10, 1), date(2017, 9, 30))))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 1713655
Grundlagenbuch: 8848
Analysis 1: 992793
Lineare Algebra 1: 244569<jupyter_text>Geschätzte Zahl hinzugefügter Wörter im Zeitraum 1.10.2016 – 30.9.2017Hier nehmen wir an, dass je 8 Bytes (ungefähr 7Buchstaben) ein Wort ergeben.<jupyter_code>def w(what, node):
    print(what, int(sum(x["diffsize"] for x in revisions(node, date(2016, 10, 1), date(2017, 9, 30))) / 8))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 214206
Grundlagenbuch: 1106
Analysis 1: 124099
Lineare Algebra 1: 30571<jupyter_text>Utils-Code<jupyter_code>def article_titles(node):
    result = [node["title"]] if node["title"] else []
    
    return result + sum((article_titles(child) for child in node["children"]), [])
    
def is_created_between(title, start, end):
    if title.startswith("c:") or title.startswith(":"):
        return False
    
    rev = wb.revisions(title)
    
    if len(rev) == 0:
        return False
    
    try:
        date = wb.revisions(title)[-1]["date"]
    except IndexError:
        print(title)
    
    return date >= start and date <= end

def new_articles(node, start, end):
    return [x for x in article_titles(node) if is_created_between(x, start, end)]<jupyter_output><empty_output><jupyter_text>Anzahl neuer Artikel im Zeitraum 1.10.2016-30.9.2017<jupyter_code>def w(what, node):
    print(what, len(new_articles(node, date(2016, 10, 1), date(2017, 9, 30))))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 95
Grundlagenbuch: 1
Analysis 1: 33
Lineare Algebra 1: 18<jupyter_text>Anzahl der Autoren / Autorinnen im Zeitraum 1.10.2016-30.9.2017 (mit anonymen Autoren / Autorinnen)<jupyter_code>def foo(node):
    return set( (rev["user"] for rev in revisions(node, date(2016, 10, 1), date(2017, 9, 30))) )

def w(what, node):
    print(what, len(foo(node)))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 224
Grundlagenbuch: 38
Analysis 1: 163
Lineare Algebra 1: 31<jupyter_text>Anzahl der Autoren / Autorinnen im Zeitraum 1.10.2016-30.9.2017 (ohne anonyme Autoren / Autorinnen)<jupyter_code>def foo(node):
    return set( (rev["user"] for rev in revisions(node, date(2016, 10, 1), date(2017, 9, 30)) if "anon" not in rev) )

def w(what, node):
    print(what, len(foo(node)))

w("Gesamt:", mfnf)
w("Grundlagenbuch:", grund)
w("Analysis 1:", ana1)
w("Lineare Algebra 1:", la1)<jupyter_output>Gesamt: 62
Grundlagenbuch: 21
Analysis 1: 42
Lineare Algebra 1: 12<jupyter_text>Liste der wichtigsten Autoren / Autorinnen im letzten Jahr<jupyter_code>from collections import defaultdict

def foo(node):
    authors = defaultdict(int)
    
    for rev in wb.revisions(node["title"]):
        if "anon" not in rev:
            authors[rev["user"]] += rev["weight"]
    
    for x in (foo(y) for y in node["children"]):
        for a,w in x.items():
            authors[a] += w
    
    return authors

for x,y in sorted(foo(ana1).items(), key=lambda x: x[1], reverse=True):
    print(x,y)<jupyter_output><NAME> 1214763
Who2010 1083159
Auswahlaxiom 689800
EulerschesPi 95839
Taschee 42328
<NAME> 28537
Ch1nie 27676
Mrvnfrtz 26916
<NAME> 25624
Morrison69 21011
Mattlocke2.0 20877
<NAME> 20404
Morpurgo10 16333
GraffL 16107
Sven87a 16038
0-Brane 14358
Griever~dewikibooks 11054
Fabiangabel 9732
Phoible 7748
S jwiese 7740
Vpt93 7522
Braun~dewikibooks 7042
Einhalbmvquadrat 6618
Mingliaozi 6383
Matheoldie 5175
Meitnerium266 5111
Beezle73 4922
Ceranilo 4777
Apfelmus 4312
Mathpro01 4000
<NAME> 3861
SerloBot 3400
BenniSERLO 2838
PhilippHanemann 2800
Agnessa power 2800
BeateAsenbeck 2779
Daniel5Ko 2763
<NAME> 2758
Evalain 2468
JennKi 2148
Juetho 1900
<NAME> 1500
MJ Studies 1495
MrScoville 1421
KatharinaKircher 1372
Jetstune 1100
W.e.r.n 1027
<NAME> 1000
KaiJay 825
<NAME> 800
Flauschi 704
Florianwicher 700
<NAME> 690
Claudia4 688
Maths CA 525
<NAME> 500
Tratormo 500
Letsluk 500
Farbstift Rot 480
LoSchizzatore 400
Boehm 4[...]<jupyter_text>Liste der wichtigsten Autoren / Autorinnen der Analysis 1<jupyter_code>from collections import defaultdict

def foo(node):
    authors = defaultdict(int)
    
    for rev in revisions(node, date(2017, 1, 1), date(2017, 11, 11)):
        if "anon" not in rev:
            authors[rev["user"]] += rev["weight"]
    
    for x in (foo(y) for y in node["children"]):
        for a,w in x.items():
            authors[a] += w
    
    return authors

for x,y in sorted(foo(mfnf).items(), key=lambda x: x[1], reverse=True):
    print(x,y)<jupyter_output>Richard4321 2244624
Auswahlaxiom 1989668
<NAME> 1606304
Matheoldie 1263712
Who2010 791183
EulerschesPi 340245
Claudia4 220788
Taschee 173288
<NAME> 114148
Ch1nie 110704
SamuelLippl12345 71212
Morpurgo10 60764
Lukasstockner 48556
0-Brane 39600
Phoible 30992
Vpt93 30088
Einhalbmvquadrat 26472
SerloBot 25700
Beezle73 19688
Ceranilo 19108
Mathpro01 14000
Sven87a 11472
BenniSERLO 11352
Agnessa power 11200
BeateAsenbeck 11116
<NAME> 11032
Mattlocke2.0 10968
Meitnerium266 9600
JennKi 8592
<NAME> 7400
MJ Studies 7164
<NAME> 6000
Tien-ng 5932
KatharinaKircher 5488
Jetstune 4400
<NAME> 3600
Oztafankolibril 3436
KaiJay 3300
<NAME> 3200
Schnark 2800
Maths CA 2100
Tratormo 2000
Florianwicher 2000
Talonnn 1824
Kathongi 1200
The Ocean 800
CommonsDelinker 800
Zyphrus 800
K8556 800
Deconimus 800
Kai Burghardt 584
Dpschmid 400
Bakunin 400
Hilli0103 400
Hydro 400
<NAME>. 400
Esclear 400
Mikyra 400
HirnSpuk 400
Botho cc 400
<NAME> 400
Kae[...]
{'fraction_non_alphanumeric': 0.12850509019467762, 'fraction_numerical': 0.1235934988390784, 'mean_word_length': 5.511046511627907, 'pattern_counts': {'":': 1, '<': 90, '<?xml version=': 0, '>': 90, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '21', 'dir': 'jupyter-structured-clean-dedup', 'id': '279328', 'license': 'Apache-2.0', 'n_tokens_mistral': 5532, 'n_tokens_neox': 4488, 'n_words': 1174, 'path': 'MFNF Statistic 2017-10-06.ipynb', 'repo_name': 'kulla/mfnf-statistic-20171007', 'size': '11348'}