DFDE-Spendengrafik: unkorrekte Darstellung

Smalltalk
Antworten
Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

DFDE-Spendengrafik: unkorrekte Darstellung

Beitrag von heisenberg » 02.10.2023 11:18:50

Nur mal so ein paar Gedanken:

Hier ist ja die Grafik von Meillo zu den Ausgaben vom Debianforum, den erhaltenen Spenden und dem virtuellen Kontostand:
meillo hat geschrieben: http://tmp.marmaro.de/dfde/dfde-spenden.png
ping @meillo
Ich habe den Eindruck, dass das Bild möglicherweise die tatsächliche Spendensituation falsch darstellt.

Das Bild zeigt, dass die Ausgaben (rote Linie) und die Spenden (grüne Linie) annähernd auf einem Niveau sind. Trotzdem sinkt der Kontostand (blaue Linie) kontinuierlich und wird erst bei Spendenaufrufen mit entsprechendem erhöhten Spendenaktivitäten wieder aufgefüllt. Deswegen frage ich mich, ob die Grafik falsch ist, speziell mit der Vermutung deswegen, dass die Regelmäßigkeit / Dichte der Ausgaben höher ist, als die Regelmäßigkeit / Dichte der Spenden. D. h. dass mehr Ausgaben-Transaktions-datensätze da sind als Spenden-Transaktionsdatensätze.

Beispielsweise könnte während eines 4-Monatsintervalles 4 x die monatliche Servergebühr fällig werden, aber z. B. nur am Anfang und am Ende eine Spende / Spendensumme z. B. in gleicher Höhe registriert werden und in der Zwischenzeit aber von Anfang und Ende einfach eine Linie gezogen wird, weil sich ja zwischen Anfang und Ende der Spenden-Betrag nicht geändert hat aber faktisch nur die halbe Spendensumme eingegangen ist.

Die Vermutung wird für mich dadurch gestützt, dass die Spendensumme eigentlich niemals den Wert 0 hat, was aber doch bestimmt in einem Zeitabschnitt mal vorkommen müsste bzw. tatsächlich auch mehrfach tut, wie ich anhand der Wikiseiten nachgeprüft habe.

Kann das sein, oder bin ich auf dem falschen Dampfer?
Zuletzt geändert von heisenberg am 03.10.2023 22:03:02, insgesamt 9-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: DFDE-Spendengrafik: ungenaue Darstellung?

Beitrag von heisenberg » 02.10.2023 11:43:04

Visualisierung

Also wenn ich jetzt eine Datentabelle wie diese habe ...

4308

Der rot hinterlegte Wert fehlt im Zweifelsfall einfach, weil es 2023-03 keine Spenden gab ...

Dann könnte es sein, dass dieses Fehlen einfach als Gerade vom Spendenwert 42 (2023-02) zum nächsten Wert 126 (2023-04) interpoliert wird und zwar so ...

4307

obwohl das eigentlich als 0-Wert dargestellt werden müsste und zwar so ...

4306

Man sieht im ersten Fall ein höheres Spendenvolumen.

P. S. die blaue Linie im ersten Bild bitte ignorieren, da ich zur Visualisierung der (gelben) Geraden einen passenden zusätzlichen Spendenwert eingegeben habe. Auf der anderen Seite stellt der zusätzliche Spendenwert tatsächlich den entsprechenden Fehlerbetrag dar, der da zu viel zu sehen ist, samt der eigentlichen Auswirkung, die aber die Ursprungsgrafik vermutlich aber korrekt zeigt. ;-)
Zuletzt geändert von heisenberg am 02.10.2023 18:18:06, insgesamt 6-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: DFDE-Spendengrafik: ungenaue Darstellung?

Beitrag von JTH » 02.10.2023 11:56:02

heisenberg hat geschrieben: ↑ zum Beitrag ↑
02.10.2023 11:18:50
Das Bild zeigt, dass die Ausgaben (rote Linie) und die Spenden (grüne Linie) annähernd auf einem Niveau sind. Trotzdem sinkt der Kontostand (blaue Linie) kontinuierlich und wird erst bei Spendenaufrufen mit entsprechendem erhöhten Spendenaktivitäten wieder aufgefüllt.
Meillo hat in der Grafik bestimmt die Zutaten für die ganzen Kekse mit abgezogen, ohne das extra aufzuführen ;)
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
feltel
Webmaster
Beiträge: 10368
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Re: DFDE-Spendengrafik: ungenaue Darstellung?

Beitrag von feltel » 02.10.2023 18:00:13

Optisch klarer wäre sicher die Darstellung der Ein- und Ausgaben nicht als Liniendiagramm sondern als Balkendiagramm. So könnten auch Nullwerte deutlich visualisiert werden.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: DFDE-Spendengrafik: unkorrekte Darstellung?

Beitrag von heisenberg » 02.10.2023 20:33:08

Hier ist mal meine Korrektur von Meillos öffentlicher Version (dfde-spenden-diagramm.helper.py):

Man sieht doch deutlich die Änderungen, wenn man genau hinschaut, bzw, wenn man beide Grafiken in unterschiedlichen Browsertabs hat und zwischen beiden wechselt.

Neue Version

Bild

Alte Version

Bild

Code: Alles auswählen

$ diff -Nru dfde-spenden-diagram.helper.py.orig dfde-spenden-diagram.helper.py
--- dfde-spenden-diagramm.helper.py.orig	2017-02-22 10:49:59.000000000 +0100
+++ dfde-spenden-diagramm.helper.py	2023-10-03 13:18:31.041548718 +0200
@@ -1,9 +1,10 @@
+#!/usr/bin/env python3
 # coding: utf-8
 
 # debianforum.de donation plot
 # written by TRex, modified by Meillo
 
-import urllib
+import urllib.request
 from datetime import datetime, date
 from io import StringIO
 from itertools import groupby
@@ -33,10 +34,10 @@
 
 y = dict()
 for year, url in urls.items():
-    f = urllib.urlopen(url)
+    f = urllib.request.urlopen(url)
     y[year] = f.read()
 
-expense_html = urllib.urlopen(expenses_url).read()
+expense_html = urllib.request.urlopen(expenses_url).read()
 
 
 def parse_html_to_list(html):
@@ -90,6 +91,33 @@
 agg_donations = get_date_grouped_list(donations_prefix + donations)
 agg_expenses = get_date_grouped_list(donations_prefix + expenses)
 
+def prev(month):
+   return norm ( month - 1 )
+
+def norm(month):
+   # normalize month - modulate out of range values ( < 1 || > 12 ) to valid month number
+   return ( month + 11 ) % 12 + 1 # long form: ( month + 12 - 1 ) % 12 + 1
+
+def fill_donations(list_):
+    # fill missing months in donations with records containing donation 0-values
+    my_donations = []
+    month_old    = 0
+    for (e) in list_:
+        if month_old:
+            # if the last month is not the current_month - 1, fill in the gap
+            if month_old != prev(e[0].month):
+                addition = 0
+                # fill in the gap while the incremented month number is still
+                # not equal to the last month number
+                while ( norm(month_old+addition) != prev(e[0].month)):
+                    addition += 1
+                    my_donations.append( (date(e[0].year, norm(month_old+addition), 1) ,0) )
+        my_donations.append(e)
+        month_old=e[0].month
+    return my_donations
+
+agg_donations=fill_donations(agg_donations)
+
 agg_donations.sort()
 agg_expenses.sort()
 
P. S.: Kleine Anpassungen gemacht für Umstieg von Python 2 auf Python 3.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: DFDE-Spendengrafik: unkorrekte Darstellung?

Beitrag von Meillo » 03.10.2023 21:52:34

Die Verbesserung des Scripts finde ich gut, das macht es genauer. Geschrieben hat das Script TRex; ich betreibe es nur. (Ich kann naemlich gar kein Python. ;-) ) Es ist schoen, wenn es nach und nach besser wird, durch verschiedene Persoen, die etwas einbringen. (Vielleicht kann auch noch ein gnuplot-Experte die sinnvollen Vorschlaege von feltel umsetzen.)

Deine Verbesserung nehme ich gerne auf. Derzeit habe ich allerdings nur Python2 zur Verfuegung. Kannst du mir sagen, was die Anpassungen fuer Python3 sind? In absehbarer Zeit werde ich auf Python3 umstellen, darum brauche ich letztlich eine Version des Scripts fuer beide Sprachvarianten. Koenntest du mir die bitte noch bereitstellen, dann verwende ich sie gerne.
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: DFDE-Spendengrafik: unkorrekte Darstellung?

Beitrag von heisenberg » 03.10.2023 21:58:51

Ich kann auch kein Python. ;-) Die Änderung für Python 3 ist minimal. Das sind nur 4 geänderte Zeilen, 3 bei denen urllib durch urllib.request ersetzt wird und der Shebang oben.

Code: Alles auswählen

patch-output (von oben):
+#!/usr/bin/env python3
...
-import urllib
+import urllib.request
...
-    f = urllib.urlopen(url)
+    f = urllib.request.urlopen(url)
...
-expense_html = urllib.urlopen(expenses_url).read()
+expense_html = urllib.request.urlopen(expenses_url).read()
...
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: DFDE-Spendengrafik: unkorrekte Darstellung

Beitrag von heisenberg » 04.10.2023 00:40:01

Hier ist mal ein Patch, der das Programm zusätzlich noch kompatibel für beide Python-Version macht (grundsätzlich keine all zu dolle Idee, aber bei so einem Miniprogramm - wie dem hier - imho absolut akzeptabel):

Code: Alles auswählen

--- dfde-spenden-diagramm.helper.py.orig	2017-02-22 10:49:59.000000000 +0100
+++ dfde-spenden-diagramm.helper.py	2023-10-04 00:55:34.179345987 +0200
@@ -3,7 +3,7 @@
 # debianforum.de donation plot
 # written by TRex, modified by Meillo
 
-import urllib
+import sys
 from datetime import datetime, date
 from io import StringIO
 from itertools import groupby
@@ -12,6 +12,14 @@
 import matplotlib
 from lxml import etree
 
+if sys.version_info.major == 3:
+    import urllib.request
+    request = urllib.request
+
+if sys.version_info.major == 2:
+    import urllib
+    request = urllib
+
 # must be executed before pyplot import
 matplotlib.use('agg')
 import matplotlib.pyplot as plt
@@ -33,10 +41,10 @@
 
 y = dict()
 for year, url in urls.items():
-    f = urllib.urlopen(url)
+    f = request.urlopen(url)
     y[year] = f.read()
 
-expense_html = urllib.urlopen(expenses_url).read()
+expense_html = request.urlopen(expenses_url).read()
 
 
 def parse_html_to_list(html):
@@ -90,6 +98,31 @@
 agg_donations = get_date_grouped_list(donations_prefix + donations)
 agg_expenses = get_date_grouped_list(donations_prefix + expenses)
 
+def prev(month):
+   return norm ( month - 1 )
+
+def norm(month):
+   # normalize month - modulate out of range values ( < 1 || > 12 ) to valid month number
+   return ( month + 11 ) % 12 + 1 # long form: ( month + 12 - 1 ) % 12 + 1
+
+def fill_donations(list_):
+    # fill empty months in donations with records containing 0-values
+    my_donations = []
+    month_old    = 0
+    for (record) in list_:
+        if month_old != 0:
+            addition = 0
+            # fill in the gap while the incremented month number is still
+            # not equal to the last month number
+            while ( norm(month_old+addition) != prev(record[0].month)):
+               addition += 1
+               my_donations.append( (date(record[0].year, norm(month_old+addition), 1) ,0) )
+        my_donations.append(record)
+        month_old=record[0].month
+    return my_donations
+
+agg_donations=fill_donations(agg_donations)
+
 agg_donations.sort()
 agg_expenses.sort()
 
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten