code: def q20(lineitem, part, nation, partsupp, supplier):
      date1 = md.Timestamp("1996-01-01")
      date2 = md.Timestamp("1997-01-01")
      psel = part.P_NAME.str.startswith("azure")
      nsel = nation.N_NAME == "JORDAN"
      lsel = (lineitem.L_SHIPDATE >= date1) & (
          lineitem.L_SHIPDATE < date2
      )
      fpart = part[psel]
      fnation = nation[nsel]
      flineitem = lineitem[lsel]
      jn1 = fpart.merge(
          partsupp, left_on="P_PARTKEY", right_on="PS_PARTKEY"
      )
      jn2 = jn1.merge(
          flineitem,
          left_on=["PS_PARTKEY", "PS_SUPPKEY"],
          right_on=["L_PARTKEY", "L_SUPPKEY"],
      )
      gb = jn2.groupby(
          ["PS_PARTKEY", "PS_SUPPKEY", "PS_AVAILQTY"],
          as_index=False,
          sort=False,
      )["L_QUANTITY"].sum()
      gbsel = gb.PS_AVAILQTY > (0.5 * gb.L_QUANTITY)
      fgb = gb[gbsel]
      jn3 = fgb.merge(
          supplier, left_on="PS_SUPPKEY", right_on="S_SUPPKEY"
      )
      jn4 = fnation.merge(
          jn3, left_on="N_NATIONKEY", right_on="S_NATIONKEY"
      )
      jn4 = jn4.loc[:, ["S_NAME", "S_ADDRESS"]]
      total = jn4.sort_values("S_NAME").drop_duplicates()
      print(total.execute())
  
imports: import argparse
  import functools
  import time
  from typing import Callable, List, Optional, Set, Union
  import mars
  import mars.dataframe
label_desc: Use image node_id 29 for calling a global function with example usage: q20(lineitem, part, nation, partsupp, supplier) without return types