artesian-sdk 4.0.3.dev4__tar.gz → 4.0.3.dev14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/PKG-INFO +25 -3
  2. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/README.md +23 -1
  3. artesian_sdk-4.0.3.dev14/samples/TestDerivedCfg.py +176 -0
  4. artesian_sdk-4.0.3.dev14/samples/TestSearchFacet.py +26 -0
  5. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndDeleteActual.py +6 -2
  6. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndDeleteAuction.py +20 -13
  7. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndDeleteBidAsk.py +16 -11
  8. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndDeleteMas.py +8 -4
  9. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndDeleteVersioned.py +14 -8
  10. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/MarketDataService.py +68 -0
  11. artesian_sdk-4.0.3.dev14/src/Artesian/MarketData/_Dto/DerivedCfg.py +21 -0
  12. artesian_sdk-4.0.3.dev14/src/Artesian/MarketData/_Dto/MarketDataEntityInput.py +88 -0
  13. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/MarketDataEntityOutput.py +15 -0
  14. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/__init__.py +2 -0
  15. artesian_sdk-4.0.3.dev14/src/Artesian/MarketData/_Enum/DerivedAlgorithm.py +7 -0
  16. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Enum/__init__.py +2 -0
  17. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/__init__.py +4 -0
  18. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/_ClientsExecutor/ArtesianJsonSerializer.py +2 -0
  19. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/__init__.py +1 -1
  20. artesian_sdk-4.0.3.dev14/src/Artesian/_version.py +21 -0
  21. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/artesian_sdk.egg-info/PKG-INFO +25 -3
  22. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/artesian_sdk.egg-info/SOURCES.txt +3 -0
  23. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestMarketDataDeleteData.py +3 -7
  24. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestMarketDataService.py +24 -9
  25. artesian_sdk-4.0.3.dev4/samples/TestSearchFacet.py +0 -28
  26. artesian_sdk-4.0.3.dev4/src/Artesian/MarketData/_Dto/MarketDataEntityInput.py +0 -38
  27. artesian_sdk-4.0.3.dev4/src/Artesian/_version.py +0 -16
  28. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.flake8 +0 -0
  29. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.github/dependabot.yml +0 -0
  30. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.github/workflows/dependency-review.yaml +0 -0
  31. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.github/workflows/python-tests.yml +0 -0
  32. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.gitignore +0 -0
  33. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.vscode/extensions.json +0 -0
  34. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.vscode/launch.json +0 -0
  35. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/.vscode/settings.json +0 -0
  36. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/CODEOWNERS +0 -0
  37. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/CONTRIBUTING.md +0 -0
  38. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/LICENSE +0 -0
  39. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/pyproject.toml +0 -0
  40. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/renovate.json +0 -0
  41. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestActual.py +0 -0
  42. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestAuction.py +0 -0
  43. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestBidAsk.py +0 -0
  44. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestGMEOffers.py +0 -0
  45. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestMarketDataService.py +0 -0
  46. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestMas.py +0 -0
  47. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestVersioned.py +0 -0
  48. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndQueryActual.py +0 -0
  49. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndQueryAuction.py +0 -0
  50. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndQueryBidAsk.py +0 -0
  51. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/samples/TestWriteDataAndQueryMas.py +0 -0
  52. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/setup.cfg +0 -0
  53. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/.gitignore +0 -0
  54. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/ArtesianConfig.py +0 -0
  55. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/ArtesianPolicyConfig.py +0 -0
  56. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Exceptions.py +0 -0
  57. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/ExtractionRangeConfig.py +0 -0
  58. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/GMEPublicOfferQuery.py +0 -0
  59. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/GMEPublicOfferQueryParameters.py +0 -0
  60. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/GMEPublicOfferService.py +0 -0
  61. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/BaType.py +0 -0
  62. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/GenerationType.py +0 -0
  63. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/Market.py +0 -0
  64. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/Purpose.py +0 -0
  65. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/Scope.py +0 -0
  66. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/Status.py +0 -0
  67. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/UnitType.py +0 -0
  68. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/Zone.py +0 -0
  69. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/_Enum/__init__.py +0 -0
  70. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/GMEPublicOffers/__init__.py +0 -0
  71. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Granularity.py +0 -0
  72. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/ArtesianMetadataFacet.py +0 -0
  73. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/ArtesianSearchResults.py +0 -0
  74. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/CurveRangeEntity.py +0 -0
  75. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/DeleteData.py +0 -0
  76. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/MarketDataIdentifier.py +0 -0
  77. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/PagedResult.py +0 -0
  78. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Dto/UpsertData.py +0 -0
  79. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Enum/AggregationRule.py +0 -0
  80. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Enum/ArtesianMetadataFacetType.py +0 -0
  81. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/MarketData/_Enum/MarketDataType.py +0 -0
  82. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/ActualQuery.py +0 -0
  83. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/AuctionQuery.py +0 -0
  84. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/BidAskQuery.py +0 -0
  85. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/DefaultPartitionStrategy.py +0 -0
  86. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/MasQuery.py +0 -0
  87. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/QueryService.py +0 -0
  88. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/RelativeInterval.py +0 -0
  89. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/VersionedQuery.py +0 -0
  90. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_Query.py +0 -0
  91. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/ActualQueryParameters.py +0 -0
  92. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/AuctionQueryParameters.py +0 -0
  93. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/BidAskQueryParameters.py +0 -0
  94. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/ExtractionRangeConfig.py +0 -0
  95. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/ExtractionRangeType.py +0 -0
  96. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/MasQueryParameters.py +0 -0
  97. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/MostRecentSelectionConfig.py +0 -0
  98. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/QueryParameters.py +0 -0
  99. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/VersionSelectionConfig.py +0 -0
  100. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/VersionSelectionType.py +0 -0
  101. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/VersionedQueryParameters.py +0 -0
  102. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/VersionsRangeSelectionConfig.py +0 -0
  103. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/_QueryParameters/__init__.py +0 -0
  104. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/Query/__init__.py +0 -0
  105. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/_ClientsExecutor/Client.py +0 -0
  106. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/_ClientsExecutor/RequestExecutor.py +0 -0
  107. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/Artesian/_ClientsExecutor/__init__.py +0 -0
  108. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/artesian_sdk.egg-info/dependency_links.txt +0 -0
  109. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/artesian_sdk.egg-info/requires.txt +0 -0
  110. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/src/artesian_sdk.egg-info/top_level.txt +0 -0
  111. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestActual.py +0 -0
  112. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestBidAsk.py +0 -0
  113. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestClientErrorHandling.py +0 -0
  114. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestGMEPO.py +0 -0
  115. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestMarketDataUpsertData.py +0 -0
  116. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestMas.py +0 -0
  117. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/TestVersioned.py +0 -0
  118. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/__init__.py +0 -0
  119. {artesian_sdk-4.0.3.dev4 → artesian_sdk-4.0.3.dev14}/tests/helpers.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: artesian-sdk
3
- Version: 4.0.3.dev4
3
+ Version: 4.0.3.dev14
4
4
  Summary: Library provides read access to the Artesian API
5
5
  Author-email: ARK Lab <arklab@ark-energy.eu>
6
6
  Maintainer-email: ARK Lab <arklab@ark-energy.eu>
@@ -600,7 +600,12 @@ mkd = MarketData.MarketDataEntityInput(
600
600
  aggregationRule=AggregationRule.AverageAndReplicate,
601
601
  tags={
602
602
  'TestSDKPython': ['PythonValue2']
603
- }
603
+ },
604
+ derivedCfg=DerivedCfg(
605
+ version=1,
606
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
607
+ orderedReferencedMarketDataIds=[10000, 10001, 10002],
608
+ ),
604
609
  )
605
610
 
606
611
  registered = mkservice.readMarketDataRegistryByName(mkdid.provider, mkdid.name)
@@ -620,6 +625,23 @@ mkservice.upsertData(data)
620
625
 
621
626
  ```
622
627
 
628
+ DerivedCfg can be of algorithm type: Coalesce, Sum, Muv.
629
+
630
+ Updating the DerivedCfg can be performed with `updateDerivedConfiguration` on MarketDataService. A validation will be done on the existing DerivedCfg of the MarketData, that should be not null and with same type as the one used for the update.
631
+
632
+ ```csharp
633
+ derivedCfgUpdate = DerivedCfg(
634
+ version=1,
635
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
636
+ orderedReferencedMarketDataIds=[10002, 10001, 10000],
637
+ )
638
+
639
+ marketDataUpdated = mkdservice.updateDerivedConfiguration(
640
+ registeredDerived.marketDataId,
641
+ derivedCfgUpdate,
642
+ False)
643
+ ```
644
+
623
645
  In case we want to write an hourly (or lower) time series the timezone for the upsert data must be UTC:
624
646
 
625
647
  ```Python
@@ -546,7 +546,12 @@ mkd = MarketData.MarketDataEntityInput(
546
546
  aggregationRule=AggregationRule.AverageAndReplicate,
547
547
  tags={
548
548
  'TestSDKPython': ['PythonValue2']
549
- }
549
+ },
550
+ derivedCfg=DerivedCfg(
551
+ version=1,
552
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
553
+ orderedReferencedMarketDataIds=[10000, 10001, 10002],
554
+ ),
550
555
  )
551
556
 
552
557
  registered = mkservice.readMarketDataRegistryByName(mkdid.provider, mkdid.name)
@@ -566,6 +571,23 @@ mkservice.upsertData(data)
566
571
 
567
572
  ```
568
573
 
574
+ DerivedCfg can be of algorithm type: Coalesce, Sum, Muv.
575
+
576
+ Updating the DerivedCfg can be performed with `updateDerivedConfiguration` on MarketDataService. A validation will be done on the existing DerivedCfg of the MarketData, that should be not null and with same type as the one used for the update.
577
+
578
+ ```csharp
579
+ derivedCfgUpdate = DerivedCfg(
580
+ version=1,
581
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
582
+ orderedReferencedMarketDataIds=[10002, 10001, 10000],
583
+ )
584
+
585
+ marketDataUpdated = mkdservice.updateDerivedConfiguration(
586
+ registeredDerived.marketDataId,
587
+ derivedCfgUpdate,
588
+ False)
589
+ ```
590
+
569
591
  In case we want to write an hourly (or lower) time series the timezone for the upsert data must be UTC:
570
592
 
571
593
  ```Python
@@ -0,0 +1,176 @@
1
+ from datetime import datetime
2
+ import Artesian
3
+ from Artesian import Query
4
+ from Artesian.Granularity import Granularity
5
+ from Artesian.MarketData._Dto.DerivedCfg import DerivedCfg
6
+ from Artesian.MarketData._Enum.DerivedAlgorithm import DerivedAlgorithm
7
+ from Artesian.MarketData._Enum.MarketDataType import MarketDataType
8
+ import time
9
+
10
+ cfg = Artesian.ArtesianConfig("https://arkive.artesian.cloud/tenantName/", "APIKey")
11
+ mkdservice = Artesian.MarketData.MarketDataService(cfg)
12
+
13
+ # curveOne
14
+ versionedCurveOne = Artesian.MarketData.MarketDataEntityInput(
15
+ "TestProviderNameDerived",
16
+ "CurveOne",
17
+ Granularity.Hour,
18
+ MarketDataType.VersionedTimeSerie,
19
+ "UTC"
20
+ )
21
+
22
+ registeredCurveOne = mkdservice.readMarketDataRegistryByName(
23
+ versionedCurveOne.providerName, versionedCurveOne.marketDataName
24
+ )
25
+ if registeredCurveOne is None:
26
+ registeredCurveOne = mkdservice.registerMarketData(versionedCurveOne)
27
+
28
+ marketIdentifierCurveOne = Artesian.MarketData.MarketDataIdentifier(
29
+ versionedCurveOne.providerName, versionedCurveOne.marketDataName
30
+ )
31
+
32
+ # mkdservice.deleteMarketData(registeredCurveOne.marketDataId)
33
+
34
+ testVersion = datetime(2020, 1, 1, 12)
35
+
36
+ data = Artesian.MarketData.UpsertData(
37
+ marketIdentifierCurveOne,
38
+ "UTC",
39
+ version=testVersion,
40
+ rows={datetime(2020, 1, 1, h): h for h in range(0, 8)},
41
+ )
42
+
43
+ mkdservice.upsertData(data)
44
+
45
+ # curveTwo
46
+ versionedCurveTwo = Artesian.MarketData.MarketDataEntityInput(
47
+ "TestProviderNameDerived",
48
+ "CurveTwo",
49
+ Granularity.Hour,
50
+ MarketDataType.VersionedTimeSerie,
51
+ "UTC"
52
+ )
53
+
54
+ registeredCurveTwo = mkdservice.readMarketDataRegistryByName(
55
+ versionedCurveTwo.providerName, versionedCurveTwo.marketDataName
56
+ )
57
+ if registeredCurveTwo is None:
58
+ registeredCurveTwo = mkdservice.registerMarketData(versionedCurveTwo)
59
+
60
+ marketIdentifierCurveTwo = Artesian.MarketData.MarketDataIdentifier(
61
+ versionedCurveTwo.providerName, versionedCurveTwo.marketDataName
62
+ )
63
+
64
+ # mkdservice.deleteMarketData(registeredCurveTwo.marketDataId)
65
+
66
+ testVersion = datetime(2020, 1, 1, 12)
67
+
68
+ data = Artesian.MarketData.UpsertData(
69
+ marketIdentifierCurveTwo,
70
+ "UTC",
71
+ version=testVersion,
72
+ rows={datetime(2020, 1, 1, h): h*2 for h in range(4, 12)},
73
+ )
74
+
75
+ mkdservice.upsertData(data)
76
+
77
+ curveIds = [registeredCurveOne.marketDataId, registeredCurveTwo.marketDataId]
78
+
79
+ # Create DerivedCfgCoalesce with order curveId one and two
80
+ derivedCfg = DerivedCfg(
81
+ version=1,
82
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
83
+ orderedReferencedMarketDataIds=curveIds,
84
+ )
85
+
86
+ actualCurveDerived = Artesian.MarketData.MarketDataEntityInput(
87
+ "TestProviderNameDerived",
88
+ "CurveDerived",
89
+ Granularity.Hour,
90
+ MarketDataType.ActualTimeSerie,
91
+ "UTC",
92
+ derivedCfg=derivedCfg,
93
+ )
94
+
95
+ registeredDerived = mkdservice.readMarketDataRegistryByName(
96
+ actualCurveDerived.providerName, actualCurveDerived.marketDataName
97
+ )
98
+
99
+ # mkdservice.deleteMarketData(registeredDerived.marketDataId)
100
+
101
+ if registeredDerived is None:
102
+ registeredDerived = mkdservice.registerMarketData(actualCurveDerived)
103
+
104
+ # check that derivedCfg is as expected
105
+ assert (
106
+ registeredDerived.derivedCfg is not None
107
+ and registeredDerived.derivedCfg.derivedAlgorithm == DerivedAlgorithm.Coalesce
108
+ ), "Derived Algorithm is not the expected (Coalesce)"
109
+
110
+ marketIdentifierDerived = Artesian.MarketData.MarketDataIdentifier(
111
+ actualCurveDerived.providerName, actualCurveDerived.marketDataName
112
+ )
113
+
114
+ time.sleep(2)
115
+
116
+ # get the derived curve and check values are in according to the configuration
117
+ query = Query.QueryService(cfg)
118
+
119
+ res = (
120
+ query.createActual()
121
+ .forMarketData([registeredDerived.marketDataId])
122
+ .inAbsoluteDateRange("2020-01-01", "2020-01-02")
123
+ .inTimeZone("UTC")
124
+ .inGranularity(Granularity.Hour)
125
+ .execute()
126
+ )
127
+
128
+ print(res)
129
+
130
+ for i in range(0, 12):
131
+ if i < 8:
132
+ assert res[i]['D'] == i, "Value derived curve is wrong"
133
+ elif i < 12:
134
+ assert res[i]['D'] == (i*2), "Value derived curve is wrong"
135
+ else:
136
+ assert res[i]['D'] == 0
137
+
138
+ curveIdsUpdate = [registeredCurveTwo.marketDataId, registeredCurveOne.marketDataId]
139
+
140
+ # Create DerivedCfgCoalesce with order curveId two and one
141
+ derivedCfgUpdate = DerivedCfg(
142
+ version=1,
143
+ derivedAlgorithm=DerivedAlgorithm.Coalesce,
144
+ orderedReferencedMarketDataIds=curveIdsUpdate,
145
+ )
146
+
147
+ marketDataUpdated = mkdservice.updateDerivedConfiguration(
148
+ registeredDerived.marketDataId,
149
+ derivedCfgUpdate,
150
+ False)
151
+
152
+ time.sleep(2)
153
+
154
+ res = (
155
+ query.createActual()
156
+ .forMarketData([registeredDerived.marketDataId])
157
+ .inAbsoluteDateRange("2020-01-01", "2020-01-02")
158
+ .inTimeZone("UTC")
159
+ .inGranularity(Granularity.Hour)
160
+ .execute()
161
+ )
162
+
163
+ print(res)
164
+
165
+ for i in range(0, 12):
166
+ if i < 4:
167
+ assert res[i]['D'] == i, "Value derived curve is wrong"
168
+ elif i < 12:
169
+ assert res[i]['D'] == (i*2), "Value derived curve is wrong"
170
+ else:
171
+ assert res[i]['D'] == 0
172
+
173
+ # Delete the curves completely
174
+ mkdservice.deleteMarketData(registeredCurveOne.marketDataId)
175
+ mkdservice.deleteMarketData(registeredCurveTwo.marketDataId)
176
+ mkdservice.deleteMarketData(registeredDerived.marketDataId)
@@ -0,0 +1,26 @@
1
+ from Artesian import ArtesianConfig
2
+ from Artesian.MarketData import *
3
+
4
+ cfg = ArtesianConfig("https://arkive.artesian.cloud/tenantName/", "APIKey")
5
+ mkdservice = MarketDataService(cfg)
6
+
7
+ res = mkdservice.searchFacet(
8
+ 1,
9
+ 1,
10
+ "Riconsegnato_",
11
+ filters={"ProviderName": ["SNAM", "France"]},
12
+ sorts=["MarketDataId asc"],
13
+ doNotLoadAdditionalInfo=False,
14
+ )
15
+
16
+ print(res.results)
17
+
18
+ res1 = mkdservice.searchFacet(1, 1, "Riconsegnato_")
19
+
20
+ print(res1.results)
21
+
22
+ res2 = mkdservice.searchFacet(1, 1, "Riconsegnato_", doNotLoadAdditionalInfo=True)
23
+
24
+ print(res2.results)
25
+
26
+ print("Test completed")
@@ -47,7 +47,9 @@ print(res)
47
47
 
48
48
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00
49
49
  deleteData = Artesian.MarketData.DeleteData(
50
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
50
+ ID=Artesian.MarketData.MarketDataIdentifier(
51
+ registered.providerName, registered.marketDataName
52
+ ),
51
53
  timezone="CET",
52
54
  rangeStart=datetime(2020, 1, 1, 6),
53
55
  rangeEnd=datetime(2020, 1, 1, 18),
@@ -69,7 +71,9 @@ print(res)
69
71
 
70
72
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00 without Timezone
71
73
  deleteData = Artesian.MarketData.DeleteData(
72
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
74
+ ID=Artesian.MarketData.MarketDataIdentifier(
75
+ registered.providerName, registered.marketDataName
76
+ ),
73
77
  rangeStart=datetime(2020, 1, 1, 6),
74
78
  rangeEnd=datetime(2020, 1, 1, 18),
75
79
  )
@@ -23,17 +23,20 @@ registered = mkdservice.readMarketDataRegistryByName(
23
23
  if registered is None:
24
24
  registered = mkdservice.registerMarketData(auction)
25
25
 
26
- auctionRowData={datetime(2020, 1, 1, h): MarketData.AuctionBids(
27
- datetime(2020, 1, 1),
28
- bid=[
29
- MarketData.AuctionBidValue(11.0, 12.0),
30
- MarketData.AuctionBidValue(13.0, 14.0),
31
- ],
32
- offer=[
33
- MarketData.AuctionBidValue(21.0, 22.0),
34
- MarketData.AuctionBidValue(23.0, 24.0),
35
- ],
36
- ) for h in range(0, 23)}
26
+ auctionRowData = {
27
+ datetime(2020, 1, 1, h): MarketData.AuctionBids(
28
+ datetime(2020, 1, 1),
29
+ bid=[
30
+ MarketData.AuctionBidValue(11.0, 12.0),
31
+ MarketData.AuctionBidValue(13.0, 14.0),
32
+ ],
33
+ offer=[
34
+ MarketData.AuctionBidValue(21.0, 22.0),
35
+ MarketData.AuctionBidValue(23.0, 24.0),
36
+ ],
37
+ )
38
+ for h in range(0, 23)
39
+ }
37
40
 
38
41
  auctionRows = MarketData.UpsertData(
39
42
  Artesian.MarketData.MarketDataIdentifier(
@@ -60,7 +63,9 @@ print(res)
60
63
 
61
64
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00
62
65
  deleteData = Artesian.MarketData.DeleteData(
63
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
66
+ ID=Artesian.MarketData.MarketDataIdentifier(
67
+ registered.providerName, registered.marketDataName
68
+ ),
64
69
  timezone="CET",
65
70
  rangeStart=datetime(2020, 1, 1, 6),
66
71
  rangeEnd=datetime(2020, 1, 1, 18),
@@ -80,7 +85,9 @@ print(res)
80
85
 
81
86
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00 without Timezone
82
87
  deleteData = Artesian.MarketData.DeleteData(
83
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
88
+ ID=Artesian.MarketData.MarketDataIdentifier(
89
+ registered.providerName, registered.marketDataName
90
+ ),
84
91
  rangeStart=datetime(2020, 1, 1, 6),
85
92
  rangeEnd=datetime(2020, 1, 1, 18),
86
93
  )
@@ -25,12 +25,13 @@ registered = mkdservice.readMarketDataRegistryByName(
25
25
  if registered is None:
26
26
  registered = mkdservice.registerMarketData(bidAsk)
27
27
 
28
- bidAskData={datetime(2020, 1, 1, h):
29
- {
30
- "Feb-20": MarketData.BidAskValue(bestBidPrice=15.0, lastQuantity=14.0),
31
- "Mar-20": MarketData.BidAskValue(bestBidPrice=25.0, lastQuantity=24.0),
32
- } for h in range(0, 23)
33
- }
28
+ bidAskData = {
29
+ datetime(2020, 1, 1, h): {
30
+ "Feb-20": MarketData.BidAskValue(bestBidPrice=15.0, lastQuantity=14.0),
31
+ "Mar-20": MarketData.BidAskValue(bestBidPrice=25.0, lastQuantity=24.0),
32
+ }
33
+ for h in range(0, 23)
34
+ }
34
35
 
35
36
  bidAsk = MarketData.UpsertData(
36
37
  Artesian.MarketData.MarketDataIdentifier(
@@ -58,11 +59,13 @@ print(res)
58
59
 
59
60
  # Delete data between 2020-01-01 6am and 2020-01-01 6pm for product Feb-18
60
61
  deleteData = Artesian.MarketData.DeleteData(
61
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
62
+ ID=Artesian.MarketData.MarketDataIdentifier(
63
+ registered.providerName, registered.marketDataName
64
+ ),
62
65
  timezone="CET",
63
66
  rangeStart=datetime(2020, 1, 1, 6),
64
67
  rangeEnd=datetime(2020, 1, 1, 18),
65
- product=["Feb-20"]
68
+ product=["Feb-20"],
66
69
  )
67
70
 
68
71
  mkdservice.deleteData(deleteData)
@@ -80,10 +83,12 @@ print(res)
80
83
 
81
84
  # Delete data between 2020-01-01 6am and 2020-01-01 6pm for product Feb-18 without Timezone
82
85
  deleteData = Artesian.MarketData.DeleteData(
83
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
86
+ ID=Artesian.MarketData.MarketDataIdentifier(
87
+ registered.providerName, registered.marketDataName
88
+ ),
84
89
  rangeStart=datetime(2020, 1, 1, 6),
85
90
  rangeEnd=datetime(2020, 1, 1, 18),
86
- product=["Feb-20"]
91
+ product=["Feb-20"],
87
92
  )
88
93
 
89
94
  mkdservice.deleteData(deleteData)
@@ -100,4 +105,4 @@ res = (
100
105
  print(res)
101
106
 
102
107
  # Delete the curve completely
103
- mkdservice.deleteMarketData(registered.marketDataId)
108
+ mkdservice.deleteMarketData(registered.marketDataId)
@@ -58,11 +58,13 @@ print(res)
58
58
 
59
59
  # Delete data with product Feb-20 between 2020-01-01 and 2020-01-03
60
60
  deleteData = Artesian.MarketData.DeleteData(
61
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
61
+ ID=Artesian.MarketData.MarketDataIdentifier(
62
+ registered.providerName, registered.marketDataName
63
+ ),
62
64
  timezone="CET",
63
65
  rangeStart=datetime(2020, 1, 1, 0),
64
66
  rangeEnd=datetime(2020, 1, 3, 0),
65
- product=["Feb-20"]
67
+ product=["Feb-20"],
66
68
  )
67
69
 
68
70
  mkdservice.deleteData(deleteData)
@@ -80,10 +82,12 @@ print(res)
80
82
 
81
83
  # Delete data with product Feb-20 between 2020-01-01 and 2020-01-03 without Timezone
82
84
  deleteData = Artesian.MarketData.DeleteData(
83
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
85
+ ID=Artesian.MarketData.MarketDataIdentifier(
86
+ registered.providerName, registered.marketDataName
87
+ ),
84
88
  rangeStart=datetime(2020, 1, 1, 0),
85
89
  rangeEnd=datetime(2020, 1, 3, 0),
86
- product=["Feb-20"]
90
+ product=["Feb-20"],
87
91
  )
88
92
 
89
93
  mkdservice.deleteData(deleteData)
@@ -22,8 +22,10 @@ registered = mkdservice.readMarketDataRegistryByName(
22
22
  if registered is None:
23
23
  registered = mkdservice.registerMarketData(versioned)
24
24
 
25
- marketIdentifier = Artesian.MarketData.MarketDataIdentifier(versioned.providerName, versioned.marketDataName)
26
- testVersion=datetime(2020, 1, 1, 12)
25
+ marketIdentifier = Artesian.MarketData.MarketDataIdentifier(
26
+ versioned.providerName, versioned.marketDataName
27
+ )
28
+ testVersion = datetime(2020, 1, 1, 12)
27
29
 
28
30
  data = Artesian.MarketData.UpsertData(
29
31
  marketIdentifier,
@@ -42,8 +44,8 @@ res = (
42
44
  .inAbsoluteDateRange("2020-01-01", "2020-01-02")
43
45
  .inTimeZone("CET")
44
46
  .inGranularity(Granularity.Hour)
45
- #.forMUV()
46
- #.forLastNVersions(2)
47
+ # .forMUV()
48
+ # .forLastNVersions(2)
47
49
  .forVersion("2020-01-01T12:00:00")
48
50
  .execute()
49
51
  )
@@ -52,11 +54,13 @@ print(res)
52
54
 
53
55
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00
54
56
  deleteData = Artesian.MarketData.DeleteData(
55
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
57
+ ID=Artesian.MarketData.MarketDataIdentifier(
58
+ registered.providerName, registered.marketDataName
59
+ ),
56
60
  timezone="CET",
57
61
  rangeStart=datetime(2020, 1, 1, 6),
58
62
  rangeEnd=datetime(2020, 1, 1, 18),
59
- version=testVersion
63
+ version=testVersion,
60
64
  )
61
65
 
62
66
  mkdservice.deleteData(deleteData)
@@ -75,10 +79,12 @@ print(res)
75
79
 
76
80
  # Delete data between 2020-01-01 06:00 and 2020-01-01 18:00 without Timezone
77
81
  deleteData = Artesian.MarketData.DeleteData(
78
- ID=Artesian.MarketData.MarketDataIdentifier(registered.providerName, registered.marketDataName),
82
+ ID=Artesian.MarketData.MarketDataIdentifier(
83
+ registered.providerName, registered.marketDataName
84
+ ),
79
85
  rangeStart=datetime(2020, 1, 1, 6),
80
86
  rangeEnd=datetime(2020, 1, 1, 18),
81
- version=testVersion
87
+ version=testVersion,
82
88
  )
83
89
 
84
90
  mkdservice.deleteData(deleteData)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
  from typing import List, Optional, cast, Dict
3
3
 
4
4
  from Artesian.MarketData._Dto import DeleteData
5
+ from ._Dto.DerivedCfg import DerivedCfg
5
6
  from .._ClientsExecutor.RequestExecutor import _RequestExecutor
6
7
  from .._ClientsExecutor.Client import _Client
7
8
  from ..ArtesianConfig import ArtesianConfig
@@ -388,10 +389,77 @@ class MarketDataService:
388
389
  Returns:
389
390
  MarketData Entity Output.
390
391
  """
392
+
393
+ entity._validateDerivedCfg()
394
+
391
395
  return _get_event_loop().run_until_complete(
392
396
  self.registerMarketDataAsync(entity)
393
397
  )
394
398
 
399
+ async def updateDerivedConfigurationAsync(
400
+ self: MarketDataService,
401
+ marketDataId: int,
402
+ derivedCfg: DerivedCfg,
403
+ force: bool = False
404
+ ) -> MarketDataEntityOutput:
405
+ """
406
+ Update Derived Configuration for marketData with id supplied in MarketDataId.
407
+ The update will trigger a Rebuild
408
+
409
+ Args:
410
+ marketDataId: The Market Data Id to be updated
411
+ derivedCfg: The Derived Configuration to be updated
412
+ force: Force the update of configuration also if another
413
+ rebuild process is running (Default=false)
414
+
415
+ Returns:
416
+ MarketData Entity Output (Async).
417
+ """
418
+
419
+ marketDataOutput = await self.readMarketDataRegistryByIdAsync(marketDataId)
420
+
421
+ marketDataOutput._validateUpdateDerivedCfg(derivedCfgUpdate=derivedCfg)
422
+
423
+ url = "/marketdata/entity/" + str(marketDataId) + "/updateDerivedConfiguration"
424
+ params = {"force": force}
425
+ with self.__client as c:
426
+ res = await asyncio.gather(
427
+ *[
428
+ self.__executor.exec(
429
+ c.exec,
430
+ "POST",
431
+ url,
432
+ derivedCfg,
433
+ retcls=MarketDataEntityOutput,
434
+ params=params,
435
+ )
436
+ ]
437
+ )
438
+ return cast(MarketDataEntityOutput, res[0])
439
+
440
+ def updateDerivedConfiguration(
441
+ self: MarketDataService,
442
+ marketDataId: int,
443
+ derivedCfg: DerivedCfg,
444
+ force: bool = False
445
+ ) -> MarketDataEntityOutput:
446
+ """
447
+ Update Derived Configuration for marketData with id supplied in MarketDataId.
448
+ The update will trigger a Rebuild
449
+
450
+ Args:
451
+ marketDataId: The Market Data Id to be updated
452
+ derivedCfg: The Derived Configuration to be updated
453
+ force: Force the update of configuration also if another
454
+ rebuild process is running (Default=false)
455
+
456
+ Returns:
457
+ MarketData Entity Output.
458
+ """
459
+ return _get_event_loop().run_until_complete(
460
+ self.updateDerivedConfigurationAsync(marketDataId, derivedCfg, force)
461
+ )
462
+
395
463
  async def upsertDataAsync(self: MarketDataService, data: UpsertData) -> None:
396
464
  url = "/marketdata/upsertdata"
397
465
  with self.__client as c:
@@ -0,0 +1,21 @@
1
+ from dataclasses import dataclass
2
+ from typing import List, Optional
3
+ from .._Enum import DerivedAlgorithm
4
+
5
+
6
+ @dataclass
7
+ class DerivedCfg:
8
+ """
9
+ Class for the Derived Configuration.
10
+
11
+ Attributes:
12
+ derivedAlgorithm: the derived configuration algorithm (MUV, Coalesce, Sum)
13
+ version: the derived configuration version
14
+ orderedReferencedMarketDataIds: the ordered reference MarketData Ids
15
+ used in the computation
16
+
17
+ """
18
+
19
+ derivedAlgorithm: DerivedAlgorithm
20
+ version: int
21
+ orderedReferencedMarketDataIds: Optional[List[int]]