Troubles with phenodata

Here, we are debugging problems with »phenodata« ist ein Datenbezug- und Manipulations-Toolkit für Open-Access-Phänologiedaten.

bei mir gehts nicht ganz so reibungslos mit der installation.
aber im venv36 krieg ich wenigstens die versionsnummer korrekt angezeigt…
liegts an mir?

(.venv27)mois@weidenteich ~ $ phenodata --version
Traceback (most recent call last):
  File "/home/mois/.venv27/bin/phenodata", line 5, in <module>
from pkg_resources import load_entry_point
  File "/home/mois/.venv27/local/lib/python2.7/site-packages/pkg_resources.py", line 2716, in <module>
working_set.require(__requires__)
  File "/home/mois/.venv27/local/lib/python2.7/site-packages/pkg_resources.py", line 685, in require
needed = self.resolve(parse_requirements(requirements))
  File "/home/mois/.venv27/local/lib/python2.7/site-packages/pkg_resources.py", line 588, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: backports.functools-lru-cache>=1.2.1
(.venv27)mois@weidenteich ~ $ deactivate
mois@weidenteich ~ $ source .venv36/bin/activate
(.venv36)mois@weidenteich ~ $ phenodata --version
phenodata 0.6.4
(.venv36)mois@weidenteich ~ $ phenodata
Usage:
  phenodata info
  phenodata list-species --source=dwd [--format=csv]
  phenodata list-phases --source=dwd [--format=csv]
  phenodata list-stations --source=dwd --dataset=immediate [--all] [--format=csv]
  phenodata nearest-station --source=dwd --dataset=immediate --latitude=52.520007 --longitude=13.404954 [--format=csv]
  phenodata nearest-stations --source=dwd --dataset=immediate [--all] --latitude=52.520007 --longitude=13.404954 [--limit=10] [--format=csv]
  phenodata list-quality-levels --source=dwd [--format=csv]
  phenodata list-quality-bytes --source=dwd [--format=csv]
  phenodata list-filenames --source=dwd --dataset=immediate --partition=recent [--filename=Hasel,Schneegloeckchen] [--year=2017]
  phenodata list-urls --source=dwd --dataset=immediate --partition=recent [--filename=Hasel,Schneegloeckchen] [--year=2017]
  phenodata (observations|forecast) --source=dwd --dataset=immediate --partition=recent [--filename=Hasel,Schneegloeckchen] [--station-id=164,717] [--species-id=113,127] [--phase-id=5] [--quality-level=10] [--quality-byte=1,2,3] [--station=berlin,brandenburg] [--species=hazel,snowdrop] [--species-preset=mellifera-primary] [--phase=flowering] [--quality=ROUTKLI] [--year=2017] [--humanize] [--show-ids] [--language=german] [--long-station] [--sort=Datum] [--format=csv]
  phenodata drop-cache --source=dwd
  phenodata --version
  phenodata (-h | --help)
(.venv36)mois@weidenteich ~ $ phenodata info
Traceback (most recent call last):
  File "/home/mois/.venv36/bin/phenodata", line 9, in <module>
load_entry_point('phenodata==0.6.4', 'console_scripts', 'phenodata')()
  File "/home/mois/.venv36/lib/python3.4/site-packages/phenodata/command.py", line 82, in run
options = normalize_options(options, encoding='utf-8')
  File "/home/mois/.venv36/lib/python3.4/site-packages/phenodata/util.py", line 32, in normalize_options
value = value.decode(encoding)
AttributeError: 'str' object has no attribute 'decode'
(.venv36)mois@weidenteich ~ $

wenn Dein *ux nativ python 2.7 kann, dann probiere auch ohne venv ;)
sudo könnte nötig sein, je nachdem, wie Du pip benutzt.

Hey @mois,

wir haben zwar in der virtualenv Doku auch Python3 erwähnt, das Programm selbst wurde jedoch auf Python2 entwickelt und ist vermutlich noch nicht fit für Python3. Bitte erstelle einstweilen ein virtualenv für Python2:

virtualenv --no-site-packages --python=python2 .venv27

Herzliche Grüße,
Andreas.

Auch mit so etwas habe ich Probleme, das geht noch

phenodata list-species --source=dwd

folgendes jedoch nicht

phenodata list-species --source=dwd year=2017
phenodata list-species --source=dwd station=Berlin

… noch etwas:

Die historischen Daten haben Probleme mit der Zuckerrübe

phenodata forecast --source=dwd --dataset=annual --partition=historical --station-id=12132 --humanize

File “pandas/_libs/src/util.pxd”, line 91, in util.set_value_at_unsafe
ValueError: invalid literal for long() with base 10: ‘Zucker-R\xfcbe’

Danke! Dieses Problem wurde gerade mit der Version 0.6.5 behoben. Das Programm sollte nun also auch die historischen Daten aller Jahresmelder verarbeiten können, dafür benötigt es allerdings bis zu 3GB RAM und braucht bis zu fünf Minuten für die Berechnung auf zeitgemäßer Hardware, sogar mit vorgewärmtem Cache.

Anmerkung: Die Rübe musste bis auf weiteres leider ausgespart werden, siehe:

1 Like

phenodata 0.7.0 und phenodata 0.8.0 kümmern sich nun um ein paar Dinge mehr.

Das Programm kann nun auch Rübendaten verarbeiten.

Bei “phenodata list-stations” werden ab sofort auch die Parameter “--filter=” sowie “--sort=” akzeptiert und entsprechend ausgewertet.

2 Likes

Habe gerade phenodata mit pip install phenodata --upgrade auf meiner aktuellen Maschine installiert und bekomme nun diese Fehlermeldung:

root@XPS13-CGruber:~# phenodata list-species --source=dwd
Traceback (most recent call last):
  File "/usr/local/bin/phenodata", line 5, in <module>
    from phenodata.command import run
  File "/usr/local/lib/python3.6/dist-packages/phenodata/command.py", line 10, in <module>
    from phenodata.dwd.pheno import DwdPhenoData, DwdPhenoDataHumanizer
  File "/usr/local/lib/python3.6/dist-packages/phenodata/dwd/pheno.py", line 111
    print reference_field, filter
                        ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(reference_field, filter)?

Passt bei meiner Installation was nicht oder hat sich in der Zwischenzeit etwas verändert?

Ja: Python 2.x gibt es nur noch aus historischen Gründen (nun offiziell deprecated). Die von Dir zitierte Stelle benötigt nunmehr Klammern aus Konvention von Python 3:

print (reference_field, filter)

Deine Python-Version schlägt Dir diese Änderung ja auch vor: Ändere doch mal Zeile 111 so, daß diese Klammern da stehen, dann geht es erstmal wieder.

@Andreas: könntest Du bei der Gelegenheit die requirements in der setup.py derart verändern, daß die tqdm-Version nicht ‘exakt’, sondern ‘mindestens’ verlangt wird?

--- /a
+++ /b
@@ -14,7 +14,7 @@
 'tabulate==0.8.2',
 'dogpile.cache==0.6.5',
 'arrow==0.12.1',
-    'tqdm==4.19.7',
+    'tqdm>=4.19.7',
 'appdirs==1.4.3',
]
1 Like

Ok, die python-Version, Danke! Das wird dann eine größere Baustelle:

root@XPS13-CGruber:/usr/local/lib/python3.6/dist-packages/phenodata/dwd# phenodata list-species --source=dwd
Traceback (most recent call last):
  File "/usr/local/bin/phenodata", line 8, in <module>
    sys.exit(run())
  File "/usr/local/lib/python3.6/dist-packages/phenodata/command.py", line 83, in run
    options = normalize_options(options, encoding='utf-8')
  File "/usr/local/lib/python3.6/dist-packages/phenodata/util.py", line 32, in normalize_options
    value = value.decode(encoding)
AttributeError: 'str' object has no attribute 'decode'

Ja, genau so weit kommt meine Version gegenwärtig auch nur! :)

Lieben Dank! Läuft jetzt wieder und du hast gleich ein Pakete upgedatet! Super!!

[edit] was gerade nicht geht sind die Abfragen in diesem posting: »phenodata« - Ein Toolkit zur Beschaffung und Verarbeitung von Open-Access Phänologiedaten - #3 by Andreas also alles mit observations.

Danke Clemens, die Dokumentation war veraltet und wurde jetzt verbessert.

  • --files heißt jetzt --filename.
  • --years heißt jetzt --year.
  • Im obigen Kontext für die Filterung nach Stations-IDs wird nun --station-id statt --stations verwendet.
1 Like

phenodata forecast --source=dwd --dataset=annual --partition=recent --year=2015,2016,2017,2018,2019 --phase=“beginning of flowering” --humanize --language=german --sort=Datum --station=Villigst --species-preset=mellifera-de-primary --format=tabular:pipe

Derselbe wie bei Andreas nur halt statt Berlin Villigst (das ist von mir aus die nächste).

Wenn ich das ganze ohne die spezies laufen lasse, bekomme ich allerdings einen Fehler:

Nelson:Github markus$ phenodata forecast   --source=dwd --dataset=annual --partition=recent   --year=2015,2016,2017,2018,2019 --phase="beginning of flowering"   --humanize --language=german --sort=Datum   --station=Villigst  --format=tabular:pipe
2020-01-08 21:35:46,841 [phenodata.dwd.pheno ] INFO   : Scanning for files
2020-01-08 21:35:46,843 [phenodata.ftp       ] INFO   : The cache directory is /Users/markus/Library/Caches/phenodata/dwd-ftp/py3
2020-01-08 21:35:46,875 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters
2020-01-08 21:35:47,175 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/crops/recent
2020-01-08 21:35:47,406 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/farming/recent
2020-01-08 21:35:47,520 [phenodata.ftp       ] WARNING: FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/farming/recent failed
2020-01-08 21:35:47,524 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/fruit/recent
2020-01-08 21:35:47,809 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/vine/recent
2020-01-08 21:35:48,072 [phenodata.ftp       ] INFO   : Send FTP LIST command for ftp://opendata.dwd.de/climate_environment/CDC/observations_germany/phenology/annual_reporters/wild/recent
2020-01-08 21:35:48,360 [phenodata.dwd.pheno ] INFO   : Starting data acquisition with 61 files
 18%|███████▊                                   | 11/61 [00:09<00:42,  1.18it/s]HASH: Out of overflow pages.  Increase page size
 18%|███████▊                                   | 11/61 [00:09<00:44,  1.12it/s]
Traceback (most recent call last):
  File "/Users/markus/.pyenv/versions/3.7.4/bin/phenodata", line 11, in <module>
    load_entry_point('phenodata==0.9.1', 'console_scripts', 'phenodata')()
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/command.py", line 162, in run
    data = client.get_forecast(options, humanize=options['humanize'])
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/dwd/pheno.py", line 214, in get_forecast
    observations = self.get_observations(options)
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/dwd/pheno.py", line 178, in get_observations
    observations = self.query(partition=options['partition'], files=options['filename'])
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/dwd/pheno.py", line 286, in query
    data = self.cdc.get_dataframe(path, coerce_int=True)
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/dwd/cdc.py", line 39, in get_dataframe
    return self.csv_to_dataframe(self.read_csv(url), index_column=index_column, coerce_int=coerce_int)
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/dwd/cdc.py", line 48, in read_csv
    content = self.ftp.retr_cached(url, strip_base=self.baseurl)
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/phenodata/ftp.py", line 277, in retr_cached
    self.cache.content.set(content_key, payload)
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/dogpile/cache/region.py", line 1112, in set
    self.backend.set(key, self._value(value))
  File "/Users/markus/.pyenv/versions/3.7.4/lib/python3.7/site-packages/dogpile/cache/backends/file.py", line 242, in set
    value, compat.pickle.HIGHEST_PROTOCOL
_dbm.error: cannot add item to database

Das sieht irgendwie nach “out of memory condition” aus. Ich kann es lokal nicht reproduzieren und vermute, es liegt irgendwie am WSL ;]?

Vielleicht sicherheitshalber nochmal den Cache leeren?

1 Like

Cache geleert, dann gings. Danke für den Tip!
An der WSL lag es allerdings nicht - das ‘Library’ im Pfad sollte Dir eigentlich erzählt haben, um welches OS es sich hier handelt. :slight_smile:

2 Likes

Ich wollte das grade wieder benutzen. Bekomme aber folgende Fehlermeldung:

Nelson:Github markus $ phenodata forecast   --source=dwd --dataset=annual --partition=recent   --year=2015,2016,2017,2018,2019 --phase="beginning of flowering"   --humanize --language=german --sort=Datum   --station=Villigst --species-preset=mellifera-de-primary   --format=tabular:pipe
2022-03-09 19:29:16,063 [phenodata.dwd.pheno ] INFO   : Scanning for files
2022-03-09 19:29:16,064 [phenodata.ftp       ] INFO   : The cache directory is /Users/markus/Library/Caches/phenodata/dwd-ftp/py3
Traceback (most recent call last):
  File "/Users/markus/opt/anaconda3/bin/phenodata", line 8, in <module>
    sys.exit(run())
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/command.py", line 168, in run
    data = client.get_forecast(options, forecast_year=options['forecast-year'], humanize=options['humanize'])
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/dwd/pheno.py", line 220, in get_forecast
    observations = self.get_observations(options)
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/dwd/pheno.py", line 179, in get_observations
    observations = self.query(partition=options['partition'], files=options.get('filename'))
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/dwd/pheno.py", line 279, in query
    paths = self.scan_files(partition, include=files, field='url')
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/dwd/pheno.py", line 445, in scan_files
    entries = self.cdc.ftp.scan_files(
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/ftp.py", line 182, in scan_files
    child_items = self.list_plus(url)
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/phenodata/ftp.py", line 108, in list_plus
    return self.cache.meta.get_or_create(key, lambda: self.list_plus_real(url))
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/cache/region.py", line 1042, in get_or_create
    with Lock(
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/lock.py", line 185, in __enter__
    return self._enter()
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/lock.py", line 87, in _enter
    value = value_fn()
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/cache/region.py", line 977, in get_value
    value = self._get_from_backend(key)
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/cache/region.py", line 1264, in _get_from_backend
    return self._parse_serialized_from_backend(
  File "/Users/markus/opt/anaconda3/lib/python3.9/site-packages/dogpile/cache/region.py", line 1221, in _parse_serialized_from_backend
    metadata = json.loads(bytes_metadata)
  File "/Users/markus/opt/anaconda3/lib/python3.9/json/__init__.py", line 341, in loads
    s = s.decode(detect_encoding(s), 'surrogatepass')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

Hi Markus,

Möglicherweise liegt es wieder an korrupten Inhalten im Cache Verzeichnis, siehe auch Troubles with phenodata - #14 by poesel. Lösche es doch wieder einmal komplett.

Bei mir läuft das Programm fehlerfrei mit dem von Dir genannten Aufruf, liefert aber keine Ergebnisse.

| Jahr   | Datum   | Tag   | Spezies   | Phase   | Station   |
|--------|---------|-------|-----------|---------|-----------|

Hier noch meine Programmversionen:

$ python -V
Python 3.8.12

$ phenodata --version
phenodata 0.11.0

Viele Grüße,
Andreas.

Analyse

Diese Aufrufe liefern etwas. Immerhin.

phenodata observations --source=dwd --dataset=annual --partition=recent --humanize \
  --phase="beginning of flowering" --species-preset=mellifera-de-primary --station=Villigst
phenodata forecast --source=dwd --dataset=annual --partition=recent --humanize \
  --phase="beginning of flowering" --species-preset=mellifera-de-primary --station=Villigst

Ursache

Der Parameter --year geht scheinbar nicht (mehr).

Lösung / Workaround

Wenn man ihn weglässt, bekommt man Ergebnisse, auch mit Deinem ursprünglichen Aufruf.

phenodata forecast --source=dwd --dataset=annual --partition=recent \
  --phase="beginning of flowering" --humanize --language=german --sort=Datum \
  --species-preset=mellifera-de-primary --format=tabular:pipe \
  --station=Villigst
Jahr Datum Tag Spezies Phase Station
2022 2022-01-16 16 Schneeglöckchen Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-02-16 47 Sal-Weide Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-03-27 86 Löwenzahn Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-03-27 86 Süßkirsche, frühe Reife Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-04-04 94 Winterraps Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-04-09 99 Apfel, frühe Reife Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-04-10 100 Süßkirsche, späte Reife Blüte Beginn Villigst, Nordrhein-Westfalen
2022 2022-04-15 105 Apfel, späte Reife Blüte Beginn Villigst, Nordrhein-Westfalen
1 Like

War wieder der cache - da hätte ich auch selber drauf kommen können… :roll_eyes:

Danke!

2 Likes