给定一个以年份为指数的Pandas序列(按升序排列,没有缺失年份):
growth = pd.Series({1990: 6.99, 1991: 5.53, 1992: -9.02, 1993: 1.05, 1994: 9.24, 1995: 0.16, 1996: 10.36, 1997: 2.68, 1998: 2.89, 1999: -0.82, 2000: -3.06, 2001: 1.44, 2002: -8.89, 2003: -17.0, 2004: -5.81, 2005: -5.71, 2006: -3.46, 2007: -3.65, 2008: -17.67, 2009: 12.02, 2010: 19.68, 2011: 14.19, 2012: 16.67, 2013: 1.99, 2014: 2.38, 2015: 1.78, 2016: 0.76, 2017: 4.7, 2018: 3.5, 2019: -8.1, 2020: -8.0})
我需要确定growth
至少连续min_duration
年为负的期间(开始年和结束年)。
我可以通过迭代这个序列来实现这一点:
def get_negative_periods(s, min_duration):
previous = 1
negative_periods = []
for year, value in s.items():
if value < 0:
if previous < 0:
negative_periods[-1].append(year)
else:
negative_periods.append([year])
previous = value
return [(period[0], period[-1]) for period in negative_periods
if len(period) >= min_duration]
例如,get_negative_periods(growth, 3)
返回[(2002, 2008)]
,因为2002-2008是growth
连续3年或3年以上为负的唯一时段。
有没有一种方法可以向量化它,而不是逐行进行向量化?(返回一个序列或 Dataframe ,而不是元组就可以了。)
2条答案
按热度按时间tcomlyy61#
尝试根据
True
和False
的不同之处创建组,然后仅保留年份范围大于或等于min_duration
的True组:res
:或者作为列表的列表:
lst
:hjzp0vay2#
下面是另一种方法:
或: