Table I am looking to create in memory...Doing a web request to TDA API and getting a JSON formatted return on a number of strike prices for a stock/ticker. I am unable to get to the individual strike prices details which are in a json array. Below is the output I am getting:
What I am trying to accomplish is taking the data from each strike (eg: 13.5, 14.0...) and create an in-memory columnar table/array so that I can use the data to evaluate/assess potential trades/executions.
Any help would be greatly appreciated!!!
{
"symbol": "F",
"status": "SUCCESS",
"underlying": null,
"strategy": "SINGLE",
"interval": 0,
"isDelayed": true,
"isIndex": false,
"interestRate": 0.1,
"underlyingPrice": 13.08,
"volatility": 29,
"daysToExpiration": 0,
"numberOfContracts": 19,
"putExpDateMap": {},
"callExpDateMap": {
"2021-09-03:2": {
"13.5": [
{
"putCall": "CALL",
"symbol": "F_090321C13.5",
"description": "F Sep 3 2021 13.5 Call (Weekly)",
"exchangeName": "OPR",
"bid": 0.03,
"ask": 0.04,
"last": 0.04,
"mark": 0.04,
"bidSize": 207,
"askSize": 655,
"bidAskSize": "207X655",
"lastSize": 0,
"highPrice": 0.05,
"lowPrice": 0.02,
"openPrice": 0,
"closePrice": 0.03,
"totalVolume": 47477,
"tradeDate": null,
"tradeTimeInLong": 1630526399010,
"quoteTimeInLong": 1630526399727,
"netChange": 0.01,
"volatility": 35.069,
"delta": 0.169,
"gamma": 0.64,
"theta": -0.019,
"vega": 0.003,
"rho": 0,
"openInterest": 73416,
"timeValue": 0.04,
"theoreticalOptionValue": 0.035,
"theoreticalVolatility": 29,
"optionDeliverablesList": null,
"strikePrice": 13.5,
"expirationDate": 1630699200000,
"daysToExpiration": 2,
"expirationType": "S",
"lastTradingDay": 1630713600000,
"multiplier": 100,
"settlementType": " ",
"deliverableNote": "",
"isIndexOption": null,
"percentChange": 20.12,
"markChange": 0,
"markPercentChange": 5.11,
"inTheMoney": false,
"mini": false,
"nonStandard": false
}
],
"14.0": [
{
"putCall": "CALL",
"symbol": "F_090321C14",
"description": "F Sep 3 2021 14 Call (Weekly)",
"exchangeName": "OPR",
"bid": 0.01,
"ask": 0.02,
"last": 0.01,
"mark": 0.02,
"bidSize": 66,
"askSize": 1468,
"bidAskSize": "66X1468",
"lastSize": 0,
"highPrice": 0.02,
"lowPrice": 0.01,
"openPrice": 0,
"closePrice": 0.01,
"totalVolume": 3453,
"tradeDate": null,
"tradeTimeInLong": 1630526389748,
"quoteTimeInLong": 1630526395218,
"netChange": 0,
"volatility": 49.446,
"delta": 0.063,
"gamma": 0.224,
"theta": -0.013,
"vega": 0.001,
"rho": 0,
"openInterest": 31282,
"timeValue": 0.01,
"theoreticalOptionValue": 0.015,
"theoreticalVolatility": 29,
"optionDeliverablesList": null,
"strikePrice": 14,
"expirationDate": 1630699200000,
"daysToExpiration": 2,
"expirationType": "S",
"lastTradingDay": 1630713600000,
"multiplier": 100,
"settlementType": " ",
"deliverableNote": "",
"isIndexOption": null,
"percentChange": -33.33,
"markChange": 0,
"markPercentChange": 0,
"inTheMoney": false,
"mini": false,
"nonStandard": false
}
],
"14.5": [
{
"putCall": "CALL",
"symbol": "F_090321C14.5",
"description": "F Sep 3 2021 14.5 Call (Weekly)",
"exchangeName": "OPR",
"bid": 0,
"ask": 0.01,
"last": 0.01,
"mark": 0.01,
"bidSize": 0,
"askSize": 386,
"bidAskSize": "0X386",
"lastSize": 0,
"highPrice": 0.01,
"lowPrice": 0.01,
"openPrice": 0,
"closePrice": 0.01,
"totalVolume": 70,
"tradeDate": null,
"tradeTimeInLong": 1630520505930,
"quoteTimeInLong": 1630526227626,
"netChange": 0,
"volatility": 60.163,
"delta": 0.027,
"gamma": 0.092,
"theta": -0.008,
"vega": 0.001,
"rho": 0,
"openInterest": 5529,
"timeValue": 0.01,
"theoreticalOptionValue": 0.007,
"theoreticalVolatility": 29,
"optionDeliverablesList": null,
"strikePrice": 14.5,
"expirationDate": 1630699200000,
"daysToExpiration": 2,
"expirationType": "S",
"lastTradingDay": 1630713600000,
"multiplier": 100,
"settlementType": " ",
"deliverableNote": "",
"isIndexOption": null,
"percentChange": 40.85,
"markChange": 0,
"markPercentChange": -4.23,
"inTheMoney": false,
"mini": false,
"nonStandard": false
}
],
"15.0": [
{
"putCall": "CALL",
"symbol": "F_090321C15",
"description": "F Sep 3 2021 15 Call (Weekly)",
"exchangeName": "OPR",
"bid": 0,
"ask": 0.01,
"last": 0.01,
"mark": 0,
"bidSize": 0,
"askSize": 594,
"bidAskSize": "0X594",
"lastSize": 0,
"highPrice": 0.01,
"lowPrice": 0.01,
"openPrice": 0,
"closePrice": 0,
"totalVolume": 184,
"tradeDate": null,
"tradeTimeInLong": 1630524777537,
"quoteTimeInLong": 1630526370053,
"netChange": 0.01,
"volatility": 68.916,
"delta": 0.012,
"gamma": 0.041,
"theta": -0.005,
"vega": 0,
"rho": 0,
"openInterest": 4867,
"timeValue": 0.01,
"theoreticalOptionValue": 0.003,
"theoreticalVolatility": 29,
"optionDeliverablesList": null,
"strikePrice": 15,
"expirationDate": 1630699200000,
"daysToExpiration": 2,
"expirationType": "S",
"lastTradingDay": 1630713600000,
"multiplier": 100,
"settlementType": " ",
"deliverableNote": "",
"isIndexOption": null,
"percentChange": 185.71,
"markChange": 0,
"markPercentChange": -8.57,
"inTheMoney": false,
"mini": false,
"nonStandard": false
}
]
}
}
}
Related
Im trying to make a terraria/papercraft like game, and i've been using tiled for the map, and i've wanted to edit the world(break, destroy blocks) and i've looked at this tutorial
https://medium.com/#michaelwesthadley/modular-game-worlds-in-phaser-3-tilemaps-2-dynamic-platformer-3d68e73d494a
at it has the place tile, but has nothing for destroy tile, so how would i destroy tiled tile maps in phaser?
seeing some prev q's, the tile.destroy method with map name sends out bugs every time of the layer name, etc, and nothing seems to work
if anyone has a solution, or could point to a working phaser three tutorial in breaking and destroying tiled maps, please give em, im new to phaser and tiled in general.
what im working on (for context) -> https://glitch.com/edit/#!/paperambi2?path=src%2Fscenes%2FGame.js%3A77%3A21
Depending on your use case you can remove or replace single tiles or groups. check out the documentation (documenation Link replace and documenation Link remove)
Here a demo:
(this demo does not use Tiled, but it should work in the same way, just with less layers)
Demo is based on offical demo
document.body.style = 'margin:0;';
var config = {
type: Phaser.AUTO,
width: 22 * 16,
height: 11 * 16,
scene: { preload, create },
banner: false
};
function preload () {
this.load.image('mario-tiles', 'https://labs.phaser.io/assets/tilemaps/tiles/super-mario.png');
}
function create () {
this.add.text(10, 10, 'Click to remove Tile\n( Use shift to replace Tile)')
.setScale(1.25)
.setColor('black')
.setOrigin(0)
.setStyle({fontStyle: 'bold', fontFamily: 'Arial'})
.setDepth(100);
// Load a map from a 2D array of tile indices
var level = [
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ 0, 1, 2, 3, 0, 0, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0, 0, 0, 1, 2, 3, 0, ], [ 0, 5, 6, 7, 0, 0, 0, 5, 6, 7, 0, 0, 5, 6, 7, 0, 0, 0, 5, 6, 7, 0, ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ 0, 0, 0, 14, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 13, 14, 0, 0, 0, 0, 0, ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 15, 0, 0, 14, 14, 14, 14, 14, 0, 0, 0, 15, ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, ], [ 35, 36, 37, 0, 0, 0, 0, 0, 15, 15, 15, 35, 36, 37, 0, 0, 0, 0, 0, 15, 15, 15, ], [ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, ] ]
// When loading from an array, make sure to specify the tileWidth and tileHeight
var map = this.make.tilemap({ data: level, tileWidth: 16, tileHeight: 16 });
var tiles = map.addTilesetImage('mario-tiles');
var layer = map.createLayer(0, tiles, 0, 0);
var shiftKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SHIFT);
// replace tile is blue tile
const NEW_TILE_INDEX_AFTER_REMOVE = 0
this.input.on('pointerdown', function({x,y}){
// replace Tile, when shift key is pressed
if(shiftKey && shiftKey.isDown){
let selectedTile = layer.getTileAtWorldXY(x,y);
// prevent error if tile doesn't exist
if(selectedTile){
layer.replaceByIndex(selectedTile.index, NEW_TILE_INDEX_AFTER_REMOVE, selectedTile.x, selectedTile.y, 1, 1);
}
} else {
// default action remove tile
layer.removeTileAtWorldXY(x,y);
}
});
}
new Phaser.Game(config);
<script src="https://cdn.jsdelivr.net/npm/phaser#3.55.2/dist/phaser.js"></script>
You just have to check, that you don't try to replace or remove non-existent tiles, this could cause a crashes / errors, and is more frequently an issue with multilayered maps.
This is the list{'id': 142840, 'posters': [{'aspect_ratio': 0.703125, 'file_path': '/4EFI8IdI7LOm9Q0BTT2FAdPwdeq.jpg', 'height': 2048, 'iso_639_1': 'en', 'vote_average': 5.312, 'vote_count': 1, 'width': 1440}, {'aspect_ratio': 0.70703125, 'file_path': '/2Lgb7oPgqVpJmruRoH7Rs2yJH0n.jpg', 'height': 2048, 'iso_639_1': 'en', 'vote_average': 5.172, 'vote_count': 1, 'width': 1448}, {'aspect_ratio': 0.7068881289692233, 'file_path': '/6mLaG60xEQm6mw0Ga8TDFZsk0R1.jpg', 'height': 2047, 'iso_639_1': None, 'vote_average': 0.0, 'vote_count': 0, 'width': 1447}]}
I am trying to pick the value of file_path if height>width
It often helps to format a complex data structure to better see how the pieces relate. In this case it shows that the information you care about (height, width, and file_path) can all be found in the dictionaries inside the posters list which is inside a dict we can call poster_dict. With that information we can construct a list of file_paths that meet the specified height and width relationship.
Example:
poster_dict = {
"id": 142840,
"posters": [
{
"aspect_ratio": 0.703125,
"file_path": "/4EFI8IdI7LOm9Q0BTT2FAdPwdeq.jpg",
"height": 2048,
"iso_639_1": "en",
"vote_average": 5.312,
"vote_count": 1,
"width": 1440,
},
{
"aspect_ratio": 0.70703125,
"file_path": "/2Lgb7oPgqVpJmruRoH7Rs2yJH0n.jpg",
"height": 2048,
"iso_639_1": "en",
"vote_average": 5.172,
"vote_count": 1,
"width": 1448,
},
{
"aspect_ratio": 0.7068881289692233,
"file_path": "/6mLaG60xEQm6mw0Ga8TDFZsk0R1.jpg",
"height": 2047,
"iso_639_1": None,
"vote_average": 0.0,
"vote_count": 0,
"width": 1447,
},
],
}
file_path_list = [
one_poster["file_path"]
for one_poster in poster_dict["posters"]
if one_poster["height"] > one_poster["width"]
]
print(file_path_list)
Output:
['/4EFI8IdI7LOm9Q0BTT2FAdPwdeq.jpg', '/2Lgb7oPgqVpJmruRoH7Rs2yJH0n.jpg', '/6mLaG60xEQm6mw0Ga8TDFZsk0R1.jpg']
As the height and width are only in the last dictionary, you can write the code as shown below :
if d['posters'][2]['height'] > d['posters'][2]['width'] :
return d['posters'][2]['file_path']
In case 'height' and 'width' are not in last dictionary, change the value of '[2]'
Hope it's helpful for you. ;-)
When generating a pdf(and also in the website), columns are getting cut-off. This is possible to fix with css in the website but not in PDF.
Is there any solution to this problem?
book.json file update paperSize is a3
"pdf": {
"pageNumbers": true,
"fontSize": 12,
"paperSize": "a3",
"margin": {
"right": 62,
"left": 62,
"top": 36,
"bottom": 36
},
"headerTemplate": null,
"footerTemplate": null
}
i am trying to calculate heating/cooling degree day using (Tbase - Ta) formula Tbase is usually 65F and Ta = (high_temp + low_temp)/2
(e.x)
high_temp = 96.5F low_temp=65.21F then
mean=(high_temp + low_temp)/2
result = mean - 65
65 is average room temperature
if result is > 65 then cooling degree day(cdd) else heating degree day(hdd)
i get weather data from two api
weatherbit
darksky
in weatherbit the provide both cdd and hdd data, but in darksky we need to calculate using above formula (Tbase - Ta)
my problem is both api show different result (e.x)
darksky json response for day
{
"latitude": 47.552758,
"longitude": -122.150589,
"timezone": "America/Los_Angeles",
"daily": {
"data": [
{
"time": 1560927600,
"summary": "Light rain in the morning and overnight.",
"icon": "rain",
"sunriseTime": 1560946325,
"sunsetTime": 1561003835,
"moonPhase": 0.59,
"precipIntensity": 0.0057,
"precipIntensityMax": 0.0506,
"precipIntensityMaxTime": 1561010400,
"precipProbability": 0.62,
"precipType": "rain",
"temperatureHigh": 62.44,
"temperatureHighTime": 1560981600,
"temperatureLow": 48,
"temperatureLowTime": 1561028400,
"apparentTemperatureHigh": 62.44,
"apparentTemperatureHighTime": 1560981600,
"apparentTemperatureLow": 46.48,
"apparentTemperatureLowTime": 1561028400,
"dewPoint": 46.61,
"humidity": 0.75,
"pressure": 1021.81,
"windSpeed": 5.05,
"windGust": 8.36,
"windGustTime": 1560988800,
"windBearing": 149,
"cloudCover": 0.95,
"uvIndex": 4,
"uvIndexTime": 1560978000,
"visibility": 4.147,
"ozone": 380.8,
"temperatureMin": 49.42,
"temperatureMinTime": 1561010400,
"temperatureMax": 62.44,
"temperatureMaxTime": 1560981600,
"apparentTemperatureMin": 47.5,
"apparentTemperatureMinTime": 1561014000,
"apparentTemperatureMax": 62.44,
"apparentTemperatureMaxTime": 1560981600
}
]
},
"offset": -7
}
python calculation
response = result.get("daily").get("data")[0]
low_temp = response.get("temperatureMin")
hi_temp = response.get("temperatureMax")
mean = (hi_temp + low_temp)/2
#65 is normal room temp
print(65-mean)
here mean is 6.509999999999998
65 - mean = 58.49
hdd is 58.49 so cdd is 0
same date in weatherbit json response is :
{
"threshold_units": "F",
"timezone": "America/Los_Angeles",
"threshold_value": 65,
"state_code": "WA",
"country_code": "US",
"city_name": "Newcastle",
"data": [
{
"rh": 68,
"wind_spd": 5.6,
"timestamp_utc": null,
"t_ghi": 8568.9,
"max_wind_spd": 11.4,
"cdd": 0.4,
"dewpt": 46.9,
"snow": 0,
"hdd": 6.7,
"timestamp_local": null,
"precip": 0.154,
"t_dni": 11290.6,
"temp_wetbulb": 53.1,
"t_dhi": 1413.9,
"date": "2019-06-20",
"temp": 58.6,
"sun_hours": 7.6,
"clouds": 58,
"wind_dir": 186
}
],
"end_date": "2019-06-21",
"station_id": "727934-94248",
"count": 1,
"start_date": "2019-06-20",
"city_id": 5804676
}
here hdd is 6.7 and cdd is 0.4
can you explain how they get this result ?
You need to use hourly data to calculate the HDD and CDD, and then average them to get the daily value.
More details here: https://www.weatherbit.io/blog/post/heating-and-cooling-degree-days-weather-api-release
Given a massive shape file of world countries.
Given I'am using Topojson#1.0 installed locally via npm install topojson#1.0.
talled locally via npm install topojson#1.0.
Given I have csv data for many countries such as
FR,144145
EN,5643
DE,25667
ES,3567
US,83466
CN,34576
JA,69353
Given I want to bind that data to the Topojson+D3js generated SVG.
Thus I want a light yet precise world-id.topojson file with the rights properties... so to ease up the CSV-SVG data biding via matchings ids.
So, I go for :
# download GADM
curl \
-L -C - 'http://biogeo.ucdavis.edu/data/gadm2.8/gadm28_levels.shp.zip' \
-o ./gadm28_levels.shp.zip
unzip -n ./gadm28_levels.shp.zip -d ./
# Process data
node ./node_modules/topojson/bin/topojson -q 1e4 \
-p name=NAME_ENGL,iso=ISO,iso2=ISO2
-o world-all.json \
-- ./gadm28_adm0.shp
But it fails with Aborted (core dumped). How to proceed ?
EDIT: clean elegant world-id.json, 579.9kb, with iso-639-2, countrynames, and iso-639-3.
Currently via Topojoson#1.0. (version using Topojson#3.0 welcome!)
Output (Natural Earth) : clean elegant world-id.json, 579.9kb, with iso-639-2, countrynames, and iso-639-3.
Properties filtering
Add -p to keep all properties and their values, use nothing to drop them all, and use -p ISO to transmit to your topojson the duo "ISO": "FRA". See Topojson v.1 API
What we want
Data sample / visual :
{
"type": "MultiPolygon",
"arcs": [
[ [4347,4348,4349] ],
[ [4350,4350,4351,4352,4353,4354] ],
[ [4355,4356,4357,4358,4358,4358,4359,4360,4361,-4350,4362,4363,-3047,-1961,-1960,-598], [4364], [4365] ]
],
"properties": {
"name": "Italy",
"iso2": "IT",
"iso3": "ITA"
}
},
GADM data
# Install topojson v.1 locally
npm install topojson#1.0
# Run topojson
node --max_old_space_size=8000 ./node_modules/topojson/bin/topojson \
-q 1e4 \
-p name=NAME_ENGL,iso=ISO,iso2=ISO2 \
-o world-id.json \
-- countries=./gadm28_adm0.shp
Shapefile's data is such :
{
"properties": {
"OBJECTID": 79,
"ID_0": 79,
"ISO": "FRA",
"NAME_ENGLI": "France",
"NAME_ISO": "FRANCE",
"NAME_FAO": "France",
"NAME_LOCAL": "France",
"NAME_OBSOL": null,
"NAME_VARIA": null,
"NAME_NONLA": null,
"NAME_FRENC": "France",
"NAME_SPANI": "Francia",
"NAME_RUSSI": "ФÑанÑиÑ",
"NAME_ARABI": "ÙرÙسا",
"NAME_CHINE": "æ³å½",
"WASPARTOF": null,
"CONTAINS": null,
"SOVEREIGN": "France",
"ISO2": "FR",
"WWW": null,
"FIPS": "FR",
"ISON": 250,
"VALIDFR": "1944",
"VALIDTO": "Present",
"POP2000": 59237668,
"SQKM": 546728.875,
"POPSQKM": 108.349258122,
"UNREGION1": "Western Europe",
"UNREGION2": "Europe",
"DEVELOPING": 2,
"CIS": 0,
"Transition": 0,
"OECD": 1,
"WBREGION": null,
"WBINCOME": "High income: OECD",
"WBDEBT": "Debt not classified",
"WBOTHER": "EMU",
"CEEAC": 0,
"CEMAC": 0,
"CEPLG": 0,
"COMESA": 0,
"EAC": 0,
"ECOWAS": 0,
"IGAD": 0,
"IOC": 0,
"MRU": 0,
"SACU": 0,
"UEMOA": 0,
"UMA": 0,
"PALOP": 0,
"PARTA": 0,
"CACM": 0,
"EurAsEC": 0,
"Agadir": 0,
"SAARC": 0,
"ASEAN": 0,
"NAFTA": 0,
"GCC": 0,
"CSN": 0,
"CARICOM": 0,
"EU": 1,
"CAN": 0,
"ACP": 0,
"Landlocked": 0,
"AOSIS": 0,
"SIDS": 0,
"Islands": 0,
"LDC": 0,
"Shape_Leng": 130.51585694,
"Shape_Area": 64.5133204963
}
}
Natural Earth Data
Download : 1.3G
Input : actual source is just 5M and doesn't crash due to size.
Output : elegant world-id.json, 579.9kb.
Command
# download NaturalEarthData
curl \
-L -C - 'https://github.com/nvkelso/natural-earth-vector/archive/v4.0.0.zip' \
-o ./ne.shp.zip
unzip -n ./ne.shp.zip -d ./
# Install topojson v.1 locally
npm install topojson#1.0
# Run topojson
node ./node_modules/topojson/bin/topojson -q 1e3 --bbox \
-p name=ADMIN,iso2=WB_A2,iso3=WB_A3 \
-o world-id.json \
-- countries=./natural-earth-vector-4.0.0/10m_cultural/ne_10m_admin_0_countries.shp
Note: NE v4.0 data is :
{
"properties": {
"scalerank": 0,
"featurecla": "Admin-0 country",
"LABELRANK": 2,
"SOVEREIGNT": "France",
"SOV_A3": "FR1",
"ADM0_DIF": 1,
"LEVEL": 2,
"TYPE": "Country",
"ADMIN": "France",
"ADM0_A3": "FRA",
"GEOU_DIF": 0,
"GEOUNIT": "France",
"GU_A3": "FRA",
"SU_DIF": 0,
"SUBUNIT": "France",
"SU_A3": "FRA",
"BRK_DIFF": 0,
"NAME": "France",
"NAME_LONG": "France",
"BRK_A3": "FRA",
"BRK_NAME": "France",
"BRK_GROUP": null,
"ABBREV": "Fr.",
"POSTAL": "F",
"FORMAL_EN": "French Republic",
"FORMAL_FR": null,
"NAME_CIAWF": "France",
"NOTE_ADM0": null,
"NOTE_BRK": null,
"NAME_SORT": "France",
"NAME_ALT": null,
"MAPCOLOR7": 7,
"MAPCOLOR8": 5,
"MAPCOLOR9": 9,
"MAPCOLOR13": 11,
"POP_EST": 67106161,
"POP_RANK": 16,
"GDP_MD_EST": 2699000,
"POP_YEAR": 2017,
"LASTCENSUS": -99,
"GDP_YEAR": 2016,
"ECONOMY": "1. Developed region: G7",
"INCOME_GRP": "1. High income: OECD",
"WIKIPEDIA": -99,
"FIPS_10_": "FR",
"ISO_A2": "-99",
"ISO_A3": "-99",
"ISO_A3_EH": "-99",
"ISO_N3": "250",
"UN_A3": "250",
"WB_A2": "FR",
"WB_A3": "FRA",
"WOE_ID": -90,
"WOE_ID_EH": 23424819,
"WOE_NOTE": "Includes only Metropolitan France (including Corsica)",
"ADM0_A3_IS": "FRA",
"ADM0_A3_US": "FRA",
"ADM0_A3_UN": -99,
"ADM0_A3_WB": -99,
"CONTINENT": "Europe",
"REGION_UN": "Europe",
"SUBREGION": "Western Europe",
"REGION_WB": "Europe & Central Asia",
"NAME_LEN": 6,
"LONG_LEN": 6,
"ABBREV_LEN": 3,
"TINY": -99,
"HOMEPART": 1,
"MIN_ZOOM": 0,
"MIN_LABEL": 1.7,
"MAX_LABEL": 6.7
}
}