3

I have two dicts like this,

past = 
{
     '500188':
     {
         2: {'S': 16.97011741552128, 'C': 16.97011741552128},
         3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
         4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
     }, 
     '524715':
     {
         2: {'S': 46.21665549733925, 'C': 38.67504905630727},
         3: {'S': -32.729615295373385, 'C': -34.21172523465267},
         4: {'S': -22.25028773515787, 'C': -36.041635048402}
     },
     '513683':
     {
         2: {'S': 6.319158390481139, 'C': 6.319158390481139},
         3: {'S': 19.81072942574542, 'C': 19.81072942574542},
         4: {'S': 6.367182731764687, 'C': 'ERROR: reported_eps value not found for the year 2008.'}
     }
}

future =
{
    '500188':
    {
        2: {'S': 16.97011741552128, 'C': 16.97011741552128},
        3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
        4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
    }, 
    '524715':
    {
        2: {'S': 46.21665549733925, 'C': 38.67504905630727},
        3: {'S': -32.729615295373385, 'C': -34.21172523465267},
        4: {'S': -22.25028773515787, 'C': -36.041635048402}
    }
}

to add them I have done this,

def _float(value):
    try: 
        return float(value)
    except ValueError:
        return 0


print {key: 
    {
        year: {
                _type: 
                (_float(past.get(key, {}).get(year, {}).get(_type, 0)) + _float(future.get(key, {}).get(year, {}).get(_type, 0)))/2  for _type in ['S', 'C']

        }for year in [4,3,2] #Second Loop

    }for key in set(past.keys()+future.keys()) #First Loop
}

got the desired output,

{
   '500188':
    {
       2: {'S': 16.97011741552128, 'C': 16.97011741552128},
       3: {'S': -41.264072314989576, 'C': 0},
       4: {'S': -40.45410186823402, 'C': 0}
    },
    '513683':
    {
       2: {'S': 3.1595791952405694, 'C': 3.1595791952405694},
       3: {'S': 9.90536471287271, 'C': 9.90536471287271},
       4: {'S': 3.1835913658823434, 'C': 0.0}
    },
   '524715':
    {
       2: {'S': 46.21665549733925, 'C': 38.67504905630727},
       3: {'S': -32.729615295373385, 'C': -34.21172523465267},
       4: {'S': -22.25028773515787, 'C': -36.041635048402}
    }
}

But, there should be some better solution than this, I googled and found this similar questions,

"Adding" Dictionaries in Python?

python dict.add_by_value(dict_2)?

but the values are in top level, but in my case the value is not in top level and I have to do a type check and have to calculate mean. what is the best way to solve this.

(Python version 2.7)

Community
  • 1
  • 1
John Prawyn
  • 1,423
  • 3
  • 19
  • 28

1 Answers1

1

Working with hierarchical data as nested dicts is always going to be painful; you're better off using a library like Pandas:

import pandas as pd, numpy as np
pp = pd.Panel(past).to_frame()
pf = pd.Panel(future).to_frame()
pp.replace('.', 0, regex=True) + pf.replace('.', 0, regex=True) / 2

                500188  513683     524715
major minor                              
C     2      25.455176     NaN  58.012574
      3       0.000000     NaN -51.317588
      4       0.000000     NaN -54.062453
S     2      25.455176     NaN  69.324983
      3     -61.896108     NaN -49.094423
      4     -60.681153     NaN -33.375432
ecatmur
  • 152,476
  • 27
  • 293
  • 366