|
3 | 3 | import pandas as pd |
4 | 4 | import numpy as np |
5 | 5 | import os |
6 | | -import re |
7 | 6 | import requests |
8 | 7 | import argparse |
9 | 8 | from itertools import product |
@@ -36,12 +35,17 @@ def read_empd_meta(fname): |
36 | 35 | parser.add_argument( |
37 | 36 | '-db', '--database-url', default=os.getenv('DATABASE_URL'), |
38 | 37 | help="The url to connect to the database. Default: %(default)s") |
| 38 | +parser.add_argument( |
| 39 | + '-nd', '--no-dump', action='store_true', |
| 40 | + help="Do not update the `meta` file or any associated tables.") |
39 | 41 |
|
40 | 42 | args = parser.parse_args() |
41 | 43 |
|
42 | 44 | meta = args.meta |
43 | 45 | db_url = args.database_url |
44 | 46 |
|
| 47 | +dump_tables = not args.no_dump |
| 48 | + |
45 | 49 | samples_dir = os.path.join(os.path.dirname(meta), 'samples') |
46 | 50 | base_meta = os.path.join(os.path.dirname(meta), 'meta.tsv') |
47 | 51 |
|
@@ -79,9 +83,6 @@ def clean_doi(doi): |
79 | 83 | return DOI |
80 | 84 |
|
81 | 85 |
|
82 | | -nan_patt = re.compile(r'(?i)nan') |
83 | | - |
84 | | - |
85 | 86 | cursor.execute('SELECT MAX(publiid) FROM publications') |
86 | 87 | PUBLI_ID = (cursor.fetchall()[0][0] or 0) + 1 |
87 | 88 |
|
@@ -120,7 +121,7 @@ def clean_doi(doi): |
120 | 121 | orig_METADATA.loc[key, 'okexcept'] = ','.join(row_okexcept) |
121 | 122 | save_orig = True |
122 | 123 |
|
123 | | -if save_orig: |
| 124 | +if save_orig and dump_tables: |
124 | 125 | try: |
125 | 126 | orig_METADATA.to_csv(meta, sep='\t', index=False, float_format='%1.8g') |
126 | 127 | except PermissionError: |
@@ -149,10 +150,11 @@ def clean_doi(doi): |
149 | 150 | '({})'.format(', '.join(map(is_null_str, v))) |
150 | 151 | for v in new_vals))) |
151 | 152 | conn.commit() |
152 | | - try: |
153 | | - df.to_csv(fname, sep='\t', index=False) |
154 | | - except PermissionError: |
155 | | - pass |
| 153 | + if dump_tables: |
| 154 | + try: |
| 155 | + df.to_csv(fname, sep='\t', index=False) |
| 156 | + except PermissionError: |
| 157 | + pass |
156 | 158 |
|
157 | 159 |
|
158 | 160 | METADATA.replace(np.nan, '', inplace=True) |
@@ -362,19 +364,18 @@ def clean_doi(doi): |
362 | 364 | 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', |
363 | 365 | 'oct', 'nov', 'dec', 'djf', 'mam', 'jja', 'son', 'ann'] |
364 | 366 | update_str = ', '.join( |
365 | | - '%s_%s = %s' % (v, s, val) for (v, s), val in zip( |
366 | | - product('tp', seasons), np.r_[ |
367 | | - nan_patt.sub('NULL', temperature).split(','), |
368 | | - nan_patt.sub('NULL', precip).split(',')])) |
| 367 | + '%s_%s = %s' % (v, s, is_null_str(val)) for (v, s), val in zip( |
| 368 | + product('tp', seasons), np.r_[temperature.split(','), |
| 369 | + precip.split(',')])) |
369 | 370 | cursor.execute( |
370 | 371 | "UPDATE climate SET %s WHERE sampleName = %s" % ( |
371 | 372 | update_str, is_null_str(METADATA.iloc[x]['SampleName']))) |
372 | 373 | else: |
373 | 374 | cursor.execute( |
374 | 375 | "INSERT INTO climate VALUES (%s,%s,%s)" % ( |
375 | 376 | is_null_str(METADATA.iloc[x]['SampleName']), |
376 | | - nan_patt.sub('NULL', temperature), |
377 | | - nan_patt.sub('NULL', precip))) |
| 377 | + temperature.replace('nan', 'NULL'), |
| 378 | + precip.replace('nan', 'NULL'))) |
378 | 379 | conn.commit() |
379 | 380 |
|
380 | 381 | for _worker in map('Worker{}_'.format, '1234'): |
@@ -441,58 +442,43 @@ def clean_doi(doi): |
441 | 442 | ORIVARNAME, ACCVARNAME, GROUPID)) |
442 | 443 | res = cursor.fetchall() |
443 | 444 | if len(res) == 0: |
444 | | - try: |
445 | | - cursor.execute( |
446 | | - "INSERT INTO p_vars " |
447 | | - "(var_, acc_var_, acc_varname, original_varname, groupID, " |
448 | | - " notes) VALUES (%d, NULL, '%s', '%s', '%s', '%s')" % ( |
449 | | - TAXON_ID, ACCVARNAME, ORIVARNAME, GROUPID, |
450 | | - is_null_str(NOTES))) |
451 | | - VAR_ = TAXON_ID |
452 | | - TAXON_ID += 1 |
453 | | - conn.commit() |
454 | | - except psql.IntegrityError as e: |
455 | | - conn = psql.connect(db_url) |
456 | | - cursor = conn.cursor() |
457 | | - list_of_errors.append( |
458 | | - '%s - %s: %s\n%s' % (samplename, VAR_, row['count'], e)) |
459 | | - err += 1 |
460 | | - else: |
461 | | - VAR_ = res[0][0] |
462 | | - samplename = row.samplename |
463 | | - val = row['count'] |
464 | | - val = (('%d' % val if not np.isnan(val) else 'NULL')) |
465 | | - percentage = row['percentage'] |
466 | | - percentage = (('%1.8g' % percentage) if not np.isnan(percentage) |
467 | | - else 'NULL') |
468 | | - try: |
469 | 445 | cursor.execute( |
470 | | - "INSERT INTO p_counts " |
471 | | - "(sampleName, var_, count, percentage) " |
472 | | - "VALUES ('%s', %s, %s, %s)" % ( |
473 | | - samplename, VAR_, val, percentage)) |
| 446 | + "INSERT INTO p_vars " |
| 447 | + "(var_, acc_var_, acc_varname, original_varname, groupID, " |
| 448 | + " notes) VALUES (%d, NULL, '%s', '%s', '%s', '%s')" % ( |
| 449 | + TAXON_ID, ACCVARNAME, ORIVARNAME, GROUPID, |
| 450 | + is_null_str(NOTES))) |
| 451 | + VAR_ = TAXON_ID |
| 452 | + TAXON_ID += 1 |
474 | 453 | conn.commit() |
475 | | - except psql.IntegrityError as e: |
476 | | - conn = psql.connect(db_url) |
477 | | - cursor = conn.cursor() |
478 | | - if 'duplicate key value violates unique constraint "p_counts_pkey"' in str(e): |
479 | | - try: |
480 | | - cursor.execute( |
481 | | - "UPDATE p_counts SET count=%s percentage=%s WHERE " |
482 | | - "sampleName = '%s' AND var_ = %d" % ( |
483 | | - val, percentage, samplename, VAR_)) |
484 | | - conn.commit() |
485 | | - except psql.IntegrityError as e: |
486 | | - conn = psql.connect(db_url) |
487 | | - cursor = conn.cursor() |
488 | | - list_of_errors.append( |
489 | | - '%s - %s: %s\n%s' % (samplename, VAR_, |
490 | | - row['count'], e)) |
491 | | - err += 1 |
492 | | - else: |
493 | | - list_of_errors.append( |
494 | | - '%s - %s: %s\n%s' % (samplename, VAR_, row['count'], e) |
495 | | - ) |
496 | | - err += 1 |
497 | | - |
498 | | -assert err == 0, ('\n' + '-' * 80 + '\n').join(list_of_errors) |
| 454 | + else: |
| 455 | + VAR_ = res[0][0] |
| 456 | + samplename = row.samplename |
| 457 | + try: |
| 458 | + if row['count'] > 0: |
| 459 | + val = round(row['count']) |
| 460 | + try: |
| 461 | + cursor.execute( |
| 462 | + "INSERT INTO p_counts (sampleName, var_, count) " |
| 463 | + "VALUES ('%s', %d, %d)" % ( |
| 464 | + samplename, VAR_, val)) |
| 465 | + conn.commit() |
| 466 | + except psql.IntegrityError as e: |
| 467 | + conn = psql.connect(db_url) |
| 468 | + cursor = conn.cursor() |
| 469 | + if 'duplicate key value violates unique constraint "p_counts_pkey"' in str(e): |
| 470 | + cursor.execute( |
| 471 | + "SELECT count FROM p_counts WHERE " |
| 472 | + "sampleName = '%s' AND var_ = %d" % ( |
| 473 | + samplename, VAR_)) |
| 474 | + new_val = cursor.fetchall()[0][0] + val |
| 475 | + cursor.execute( |
| 476 | + "UPDATE p_counts SET count=%d WHERE " |
| 477 | + "sampleName = '%s' AND var_ = %d" % ( |
| 478 | + new_val, samplename, VAR_)) |
| 479 | + conn.commit() |
| 480 | + except Exception: |
| 481 | + print(samplename, VAR_, "!" + str(row['count']) + "!") |
| 482 | + |
| 483 | + |
| 484 | +assert err == 0, '\n'.join(list_of_errors) |
0 commit comments