Convert two dictionary to influx writing measurement fields in python

Question:

I have a dictionary like

{'BTC': {'030323': 562.7,
  '170323': 9.900000000000002,
  '250223': 64.60000000000004,
  '290923': 17.6,
  '100323': 53.90000000000002,
  '310323': 27.4,
  '260223': 15.499999999999996,
  '300623': 33.7,
  '280423': 30.0,
  '291223': 28.6,
  '260523': 1.0999999999999999},
 'ETH': {'030323': 562.7,
  '170323': 9.900000000000002,
  '250223': 64.60000000000004,
  '290923': 17.6,
  '100323': 53.90000000000002,
  '310323': 27.4,
  '260223': 15.499999999999996,
  '300623': 33.7,
  '280423': 30.0,
  '291223': 28.6,
  '260523': 1.0999999999999999}}

and other dictionary like

{'250223': ['daily'],
 '260223': ['bidaily'],
 '030323': ['weekly'],
 '100323': ['biweekly'],
 '170323': ['triweekly'],
 '310323': ['monthly', 'quarterly'],
 '280423': ['bimonthly'],
 '260523': ['trimonthly'],
 '300623': ['biquarterly'],
 '290923': ['triquarterly'],
 '291223': ['yearly']}

I need data structure to insert it into influx db.

Example:

{'measurement': 'measurement_name',
        'tags': {
                'asset': 'BTC', 
                'maturity_date': 030323, 
                'Expiry' - 'weekly'
            },
        'fields': {
            'Amount' - '562.7' 
            },
        'time': int(time.time()*1000),
        }

Confused with the data format on how to do it for all the values, is there any mapping that would be helpful.

Asked By: Madan

||

Answers:

Yes, you can use the following code to change the two dictionaries into the format that InfluxDB needs:

import time

def convert_to_influx_format(asset_dict, expiry_dict):
    result = []
    for asset, amounts in asset_dict.items():
        for maturity_date, amount in amounts.items():
            if maturity_date in expiry_dict:
                for expiry in expiry_dict[maturity_date]:
                    result.append({
                        'measurement': 'measurement_name',
                        'tags': {
                            'asset': asset,
                            'maturity_date': maturity_date,
                            'Expiry': expiry
                        },
                        'fields': {
                            'Amount': amount
                        },
                        'time': int(time.time()*1000)
                    })
    return result

result = convert_to_influx_format({'BTC': {'030323': 562.7,
  '170323': 9.900000000000002,
  '250223': 64.60000000000004,
  '290923': 17.6,
  '100323': 53.90000000000002,
  '310323': 27.4,
  '260223': 15.499999999999996,
  '300623': 33.7,
  '280423': 30.0,
  '291223': 28.6,
  '260523': 1.0999999999999999},
 'ETH': {'030323': 562.7,
  '170323': 9.900000000000002,
  '250223': 64.60000000000004,
  '290923': 17.6,
  '100323': 53.90000000000002,
  '310323': 27.4,
  '260223': 15.499999999999996,
  '300623': 33.7,
  '280423': 30.0,
  '291223': 28.6,
  '260523': 1.0999999999999999}},
{'250223': ['daily'],
 '260223': ['bidaily'],
 '030323': ['weekly'],
 '100323': ['biweekly'],
 '170323': ['triweekly'],
 '310323': ['monthly', 'quarterly'],
 '280423': ['bimonthly'],
 '260523': ['trimonthly'],
 '300623': ['biquarterly'],
 '290923': ['triquarterly'],
 '291223': ['yearly']})

print(result)

VERSION 2 WITH COMPRESHENSION LIST (ARRAY)

import time

def convert_to_influx_format(asset_dict, expiry_dict):
    result = [{'measurement': 'measurement_name',
               'tags': {'asset': asset, 'maturity_date': maturity_date, 'Expiry': expiry},
               'fields': {'Amount': amount},
               'time': int(time.time() * 1000)}
              for asset, amounts in asset_dict.items()
              for maturity_date, amount in amounts.items()
              if maturity_date in expiry_dict
              for expiry in expiry_dict[maturity_date]]

    return result

result = convert_to_influx_format({'BTC': {'030323': 562.7, '170323': 9.9, '250223': 64.6,
                                           '290923': 17.6, '100323': 53.9, '310323': 27.4, '260223': 15.5,
                                           '300623': 33.7, '280423': 30.0, '291223': 28.6, '260523': 1.1},
                                   'ETH': {'030323': 562.7, '170323': 9.9, '250223': 64.6, '290923': 17.6,
                                           '100323': 53.9, '310323': 27.4, '260223': 15.5, '300623': 33.7,
                                           '280423': 30.0, '291223': 28.6, '260523': 1.1}},
                                  {'250223': ['daily'], '260223': ['bidaily'], '030323': ['weekly'],
                                   '100323': ['biweekly'], '170323': ['triweekly'], '310323': ['monthly', 'quarterly'],
                                   '280423': ['bimonthly'], '260523': ['trimonthly'], '300623': ['biquarterly'],
                                   '290923': ['triquarterly'], '291223': ['yearly']})

print(result)

VERSION 3 TO PREVENT REPETITION

import time

def convert_to_influx_format(asset_dict, expiry_dict):
    result = []
    for asset, amounts in asset_dict.items():
        for maturity_date, amount in amounts.items():
            if maturity_date in expiry_dict:
                expiries = expiry_dict[maturity_date]
                result.append({'measurement': 'measurement_name',
                               'tags': {'asset': asset, 'maturity_date': maturity_date, 'Expiry': ','.join(expiries)},
                               'fields': {'Amount': amount},
                               'time': int(time.time() * 1000)})

    return result

result = convert_to_influx_format({'BTC': {'030323': 562.7, '170323': 9.9, '250223': 64.6,
                                           '290923': 17.6, '100323': 53.9, '310323': 27.4, '260223': 15.5,
                                           '300623': 33.7, '280423': 30.0, '291223': 28.6, '260523': 1.1},
                                   'ETH': {'030323': 562.7, '170323': 9.9, '250223': 64.6, '290923': 17.6,
                                           '100323': 53.9, '310323': 27.4, '260223': 15.5, '300623': 33.7,
                                           '280423': 30.0, '291223': 28.6, '260523': 1.1}},
                                  {'250223': ['daily'], '260223': ['bidaily'], '030323': ['weekly'],
                                   '100323': ['biweekly'], '170323': ['triweekly'], '310323': ['monthly', 'quarterly'],
                                   '280423': ['bimonthly'], '260523': ['trimonthly'], '300623': ['biquarterly'],
                                   '290923': ['triquarterly'], '291223': ['yearly']})

print(result)

In the end, you’ll have a single dictionary for each asset and maturity date. The Expiry field will have a string of all the expiry values separated by commas.

I have made now 3 examples you can use all of these to your project or play with it

Hope this helps you.