簡體   English   中英

LibreOffice Calc Python UDF 的基本包裝器

[英]Basic Wrapper for LibreOffice Calc Python UDF

使用非整數電子表格范圍運行 LibreOffice Calc Python 用戶定義函數的基本包裝器調用是如何形成的?

我不清楚如何為valuesexcel_date數組正確聲明函數,這兩個數組都是實數數組,在我理解的基本術語中鍵入 Variant。

我遵循了從 LibreCalc 中調用 python 函數,並且范圍可以作為整數參數傳遞而無需定義它們,但這些是實際值。 兩個數組都是一維數組,因此多維數組問題不適用,如如何在 OpenOffice.Org Calc 中的單元格公式中調用 Python 宏中所述?

基本代碼是:

Function xnpv_helper(rate as Double, values() as Variant, excel_date() as Variant) as Double
    Dim scriptPro As Object, myScript As Object
    scriptPro = ThisComponent.getScriptProvider()
    myScript = scriptPro.getScript("vnd.sun.star.script:MyPythonLibrary/Develop/math.py$xnpv_helper?language=Python&location=user")
    xnpv_helper = myScript.invoke(Array(rate, values, excel_date), Array(), Array() )
end function

電子表格數據:

Date    Amount  Rate    xnpv
31/12/19    100 -0.1    
31/12/20    -110

xnpv_helper在底部。 實際的python 腳本是基於https://github.com/tarioch/xirr來自具有xirr 和xnpv 功能的金融python 庫?

# Demo will run in python REPL - uncomment last line
import scipy.optimize

DAYS_PER_YEAR = 365.0

def xnpv(valuesPerDate, rate):
    '''Calculate the irregular net present value.

    >>> from datetime import date
    >>> valuesPerDate = {date(2019, 12, 31): -100, date(2020, 12, 31): 110}
    >>> xnpv(valuesPerDate, -0.10)
    22.257507852701295
    '''
    if rate == -1.0:
        return float('inf')
    t0 = min(valuesPerDate.keys())
    if rate <= -1.0:
        return sum([-abs(vi) / (-1.0 - rate)**((ti - t0).days / DAYS_PER_YEAR) for ti, vi in valuesPerDate.items()])
    return sum([vi / (1.0 + rate)**((ti - t0).days / DAYS_PER_YEAR) for ti, vi in valuesPerDate.items()])


from datetime import date
def excel2date(excel_date):
    return date.fromordinal(date(1900, 1, 1).toordinal() + int(excel_date) - 2)

def xnpv_helper(rate, values, excel_date):
    dates = [excel2date(i) for i in excel_date]
    valuesPerDate = dict(zip(dates, values))
    return xnpv(valuesPerDate, rate)

# valuesPerDate = {date(2019, 12, 31): -100, date(2020, 12, 31): 110}
# xnpv_helper(-0.10, [-100, 110], [43830.0, 44196.0])

感謝@arturaz解釋 Basic 數組作為元組出現在 python 中,需要轉換為列表(python 中數組的最佳匹配)。 他在https://stackoverflow.com/a/8978435/4539999 的回答中提供了更多詳細信息,該回答基於問題和其他答案。

APSO python 控制台顯示:

  1. 什么是從 Basic 解析到 python
  2. 需要什么
  3. 需要格式化日期的數據
APSO python console [LibreOffice]
3.8.10 (default, Aug 10 2021, 19:39:20) [MSC v.1928 64 bit (AMD64)]
>>> 
1: ((43830.0,), (44196.0,)) ((100.0,), (-110.0,)) -0.1
2: [43830.0, 44196.0] [-100, 110] -0.1
3: {datetime.date(2019, 12, 31): -100, datetime.date(2020, 12, 31): 110} -0.1

這兩個數組在用於 python 輔助函數之前被重新格式化:

def xnpv_helper(rate, values, excel_date):
    excel_date0 = [a for b in excel_date for a in b]
    values0 = [a for b in values for a in b]
    dates = [excel2date(i) for i in excel_date0]
    valuesPerDate = dict(zip(dates, values0))
    return xnpv(valuesPerDate, rate)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM