Skip to main content
`Ctrl`+`K`

# cd_index

cd_index(G, node, time_delta, *, time='time', weight=None)

  Compute the CD index for `node` within the graph `G`.

  Calculates the CD index for the given node of the graph, considering only its predecessors who have the `time` attribute smaller than or equal to the `time` attribute of the `node` plus `time_delta`.

  Parameters:
    G graph

      A directed networkx graph whose nodes have `time` attributes and optionally `weight` attributes (if a weight is not given, it is considered 1).

    node node

      The node for which the CD index is calculated.

    time_delta numeric or timedelta

      Amount of time after the `time` attribute of the `node`. The value of `time_delta` must support comparison with the `time` node attribute. For example, if the `time` attribute of the nodes are `datetime.datetime` objects, then `time_delta` should be a `datetime.timedelta` object.

    time string (Optional, default is “time”)

      The name of the node attribute that will be used for the calculations.

    weight string (Optional, default is None)

      The name of the node attribute used as weight.

  Returns:
    float

      The CD index calculated for the node `node` within the graph `G`.

  Raises:
    NetworkXError

      If not all nodes have a `time` attribute or `time_delta` and `time` attribute types are not compatible or `n` equals 0.

    NetworkXNotImplemented

      If `G` is a non-directed graph or a multigraph.

  Notes

  This method implements the algorithm for calculating the CD index, as described in the paper by Funk and Owen-Smith [1]. The CD index is used in order to check how consolidating or destabilizing a patent is, hence the nodes of the graph represent patents and the edges show the citations between these patents. The mathematical model is given below:

  \[CD_{t}=\frac{1}{n_{t}}\sum_{i=1}^{n}\frac{-2f_{it}b_{it}+f_{it}}{w_{it}},\]

  where `f_{it}` equals 1 if `i` cites the focal patent else 0, `b_{it}` equals 1 if `i` cites any of the focal patents successors else 0, `n_{t}` is the number of forward citations in `i` and `w_{it}` is a matrix of weight for patent `i` at time `t`.

  The `datetime.timedelta` package can lead to off-by-one issues when converting from years to days. In the example above `timedelta(days=5 * 365)` looks like 5 years, but it isn’t because of leap year days. So it gives the same result as `timedelta(days=4 * 365)`. But using `timedelta(days=5 * 365 + 1)` gives a 5 year delta for this choice of years but may not if the 5 year gap has more than 1 leap year. To avoid these issues, use integers to represent years, or be very careful when you convert units of time.

  References

  [1]

  Funk, Russell J., and Jason Owen-Smith. “A dynamic network measure of technological change.” Management science 63, no. 3 (2017): 791-817. http://russellfunk.org/cdindex/static/papers/funk_ms_2017.pdf

  Examples

      >>> from datetime import datetime, timedelta
      >>> G = nx.DiGraph()
      >>> nodes = {
      ...     1: {"time": datetime(2015, 1, 1)},
      ...     2: {"time": datetime(2012, 1, 1), "weight": 4},
      ...     3: {"time": datetime(2010, 1, 1)},
      ...     4: {"time": datetime(2008, 1, 1)},
      ...     5: {"time": datetime(2014, 1, 1)},
      ... }
      >>> G.add_nodes_from([(n, nodes[n]) for n in nodes])
      >>> edges = [(1, 3), (1, 4), (2, 3), (3, 4), (3, 5)]
      >>> G.add_edges_from(edges)
      >>> delta = timedelta(days=5 * 365)
      >>> nx.cd_index(G, 3, time_delta=delta, time="time")
      0.5
      >>> nx.cd_index(G, 3, time_delta=delta, time="time", weight="weight")
      0.12

  Integers can also be used for the time values: >>> node_times = {1: 2015, 2: 2012, 3: 2010, 4: 2008, 5: 2014} >>> nx.set_node_attributes(G, node_times, “new_time”) >>> nx.cd_index(G, 3, time_delta=4, time=”new_time”) 0.5 >>> nx.cd_index(G, 3, time_delta=4, time=”new_time”, weight=”weight”) 0.12