Data-driven innovation through the use of the Data Access Layer based on TM1py ❤️
copy the following files to your python development environment
- DEV.yml
- DAL.py
planning_analytics:
address: <url to your ibm planning analytics instance>
port: <http-port>
user: <username>
password: <password>
ssl: <boolean>
import
from DAL import DataAccessLayer
instantiate the Data Access Layer with the DEV environment
DAL = DataAccessLayer(path='DEV.yml')
build example mdx-statement
mdx = {
'columns':'{TM1FILTERBYLEVEL(TM1SUBSETALL([col.dim].[col.dim]) , 0)}',
'rows':'{TM1FILTERBYLEVEL(TM1SUBSETALL([row.dim].[row.dim]) , 0)}',
'where':[
'[where.dim].[where.dim].[member]'
]
}
query = f"SELECT NON EMPTY {mdx['columns']} ON 0, NON EMPTY {mdx['rows']} ON 1 FROM [cube] WHERE ({','.join(mdx['where'])})"
Call the DAL request by MDX-Statement
data_raw = DAL.load_data_by_mdx(query)
convert pandas multi-index to standard pandas.DataFrame
data = data_raw.dropna()
data = data.unstack()
data = data.reset_index()
data.columns = data.columns.map(''.join)
Call the DAL request by View
data_raw = DAL.load_data_by_view(query)
Write dataframe
DAL.write_dataframe(cube="cube",dataframe=data)
Write cellset
DAL.write_cellset(cube="cube",cellset=data)
Run TI
DAL.run_ti(name="test",parameters={'pnValue':1234})
DAL has more tricks up its sleeve than a magician's hat when it comes to getting cozy with TM1py, such as
- Read data from TM1 via MDX and views as easy as possible
- Write/Push data from outside into TM1
- Easily configurable via YAML files
- Significantly more interfaces of source/target systems can be connected (compared to TurboIntegrator) - e.g. OData
- Core technology extending application
- Secure and encrypted connection via SSL; data is not transferred in plain text
- Data transfer from cloud to cloud using the authorization schema specified by the source and target system in each case
If you find issues, # in Github and open an Issue in this repository
DAL is like a magical show, where everyone in the TM1 community can become a wizard! 🧙♂️
If you happen to spot a pesky bug or have a spellbinding idea to enhance it, simply take your magical wand (fork the repository), weave your code incantations, and then conjure up a pull request. We'll be ready to merge in your enchanting contributions! ✨🪄