- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在处理面板数据,其中我有几家上市公司和每家公司的几个季度观察结果。我认为组织数据的最佳方式是 MultiIndex,其中第一级是唯一的公司标识符(在本例中为“gvkey”),第二级是季度。
我很难弄清楚如何做到这一点,因为财政年度结束可以是一年中的任何一个月,这表明我无法使用 DatetimeIndex.quarter
。有没有办法让我在 Pandas 中定义对 Pandas 有意义的自定义区域?我可以简单地使用一个字符串,例如“2014Q1”,但我希望它能够成为某种对象,以便 Pandas 知道上一季度是什么,或者知道该公司的财政年度结束时间是第 10 个月,所以 2014Q1 将在 2014 年 1 月结束。这可能吗?
这是我在 DataFrame 中拥有的一些数据的示例。索引是gvkey
,一个唯一的公司标识符。 datadate
是季度的最后一天(即季度最后一个月的最后一天),datafqtr
是字符串形式的年份和季度,fyr
是财政年度结束的月份(例如,5 表示该年度在 5 月结束)。
conm datadate datafqtr fyr
gvkey
001004 AAR CORP 2014-02-28 2013Q3 5.0
001004 AAR CORP 2014-05-31 2013Q4 5.0
001004 AAR CORP 2014-08-31 2014Q1 5.0
001004 AAR CORP 2014-11-30 2014Q2 5.0
001045 AMERICAN AIRLINES GROUP INC 2014-03-31 2014Q1 12.0
001045 AMERICAN AIRLINES GROUP INC 2014-06-30 2014Q2 12.0
001045 AMERICAN AIRLINES GROUP INC 2014-09-30 2014Q3 12.0
001045 AMERICAN AIRLINES GROUP INC 2014-12-31 2014Q4 12.0
001050 CECO ENVIRONMENTAL CORP 2014-03-31 2014Q1 12.0
001050 CECO ENVIRONMENTAL CORP 2014-06-30 2014Q2 12.0
001050 CECO ENVIRONMENTAL CORP 2014-09-30 2014Q3 12.0
001050 CECO ENVIRONMENTAL CORP 2014-12-31 2014Q4 12.0
001062 ASA GOLD AND PRECIOUS METALS 2014-02-28 2014Q1 11.0
001062 ASA GOLD AND PRECIOUS METALS 2014-05-31 2014Q2 11.0
001062 ASA GOLD AND PRECIOUS METALS 2014-08-31 2014Q3 11.0
001062 ASA GOLD AND PRECIOUS METALS 2014-11-30 2014Q4 11.0
001072 AVX CORP 2014-03-31 2013Q4 3.0
001072 AVX CORP 2014-06-30 2014Q1 3.0
001072 AVX CORP 2014-09-30 2014Q2 3.0
001072 AVX CORP 2014-12-31 2014Q3 3.0
最佳答案
经过一些挠头,我想我知道你在问什么。
首先,我会制作一些数据:
# Make dataframe
df = pd.DataFrame({'gvkey' : ['001004']*4 +\
['001045']*4 +\
['001050']*4 +\
['001062']*4 +\
['001072']*4,
'conm' : ['AAR CORP']*4 +\
['AMERICAN AIRLINES GROUP INC']*4 +\
['CECO ENVIRONMENTAL CORP']*4 +\
['ASA GOLD AND PRECIOUS METALS']*4 +\
['AVX CORP']*4,
'datadate' : ['2014-02-28', '2014-05-31', '2014-08-31', '2014-11-30'] +\
['2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31']*2 +\
['2014-02-28', '2014-05-31', '2014-08-31', '2014-11-30'] +\
['2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31'],
'datafqtr' : ['2013Q3', '2013Q4', '2014Q1', '2014Q2'] +\
['2014Q1', '2014Q2', '2014Q3', '2014Q4']*3 +\
['2013Q4', '2014Q1', '2014Q2', '2014Q3'],
'fyr' : [5]*4 +\
[12]*8 +\
[11]*4 +\
[3]*4})
# Reorder columns
df = df[[df.columns[-1]] + list(df.columns[:-1])]
# Convert 'datadate' to datetime
df.loc[:, 'datadate'] = pd.to_datetime(df.loc[:, 'datadate'])
# Show the dataframe
df
其次,(根据我对问题的解释)我将创建您的 datafqtr 列的副本。为此,我使用了模 12 映射技术来创建季度和年份:
# Copy the dataframe
df1 = df.copy()
# Insert 'year' column
df1.insert(df1.shape[1],
'year',
df1.loc[:, 'datadate'].dt.year)
# Insert 'month' column
df1.insert(df1.shape[1],
'month',
df1.loc[:, 'datadate'].dt.month)
# Subtract 'fyr' from 'month'
df1.insert(df1.shape[1],
'month-fyr',
df1.loc[:, 'month'] - df1.loc[:, 'fyr'])
# Create 'new_year' column
df1.insert(df1.shape[1],
'new_year',
np.where((df1.loc[:, 'month-fyr'] <= 0) & (df1.loc[:, 'fyr'] < 6),
df1.loc[:, 'year'] - 1,
df1.loc[:, 'year']))
# Make a mapper for mapping the values of 'month-fyr' to 'new_qtr'
mapper = {-9 : 1,
-6 : 2,
-3 : 3,
0 : 4,
3 : 1,
6 : 2,
9 : 3}
# Insert the 'new_qtr' column
df1.insert(df1.shape[1],
'new_qtr',
df1.loc[:, 'month-fyr'].map(mapper))
# Insert 'new_datafqtr' column (this should be equivalent to 'datafqtr')
df1.insert(df1.shape[1],
'new_datafqtr',
df1.loc[:, 'new_year'].astype(str) + 'Q' + df1.loc[:, 'new_qtr'].astype(str))
# Show the dataframe
df1
请注意,当我创建 'new_year'
列时,我必须考虑 'fyr'
是否小于 6。这对于创建列很重要。
如果您想按 'gvkey'、'conm'、'new_year'、'new_qtr'
分组,这将显示正确的财政年度和季度(按顺序)。
希望这对您有所帮助!
# Insert random revenue
df1.insert(df1.shape[1],
'random_revenue',
np.random.randint(low = 0, high = 1000000, size = df1.shape[0]))
# Groupby 'gvkey', 'conm', 'new_year', 'new_qtr' and sum 'random_revenue'
df_group = df1.groupby(['gvkey',
'conm',
'new_year',
'new_qtr']).agg({'random_revenue' : 'sum'})
# Find difference in revenue for "AAR CORP" between 2013Q3 and 2014Q2
df_group.loc[('001004', 'AAR CORP', slice(None), [3, 2])].diff()
pd.diff() 的文档 --> https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.diff.html#pandas-dataframe-diff
关于python - Pandas 的自定义财政季度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46417735/
我有以下数据框: Data <- data.frame( date = c("2001-01-01", "2001-02-01", "2001-03-01", "2001-04-01", "200
我在基于 [Date] 字段的选择查询中使用这些公式。学期为 1 月至 6 月 1 个学期,7 月至 12 月为 2 个学期。季度是 3 个月的版本(1 月至 3 月等为 1)。 case when
我有一些用户上传的数据,需要根据用户选择的时间段进行存储和排序。期间应该只支持月年或季度年,没有其他,类似于下面: +----+---------+-------+ | id | pe
我有一个 pandas DataFrame,其中有一列(标题)需要被解析为日期时间对象,以便我可以将其转换为时间序列。 Title Gross Domestic Product: Quar
oracle按天,周,月,季度,年查询排序 ? 1
我有 32 年的数据要放入分区表中。但是 BigQuery 说我超过了限制(4000 个分区)。 对于像这样的查询: CREATE TABLE `deleting.day_partition` PAR
我们将从以下数据表开始: id date 1: 1 2016-03-31 2: 1 2015-12-31 3: 1 2015-09-30 4: 1 2015-06-
我知道与计划相关的里程碑的年份和季度(例如“2010”和“4”),并且我想从中选择/创建一个日期时间。有许多巧妙的方法可以用特定日期的格式(“qq”)来识别季度,但不能反过来(或者有吗?)。这是使用
我需要获得给定日期的相应三个月(3 个月的时间段,即 1 月、2 月和 3 月的第一个三个月)。使用 c# System.DateTime 结构我没有设法找到我正在寻找的方法。所以我这样解决了: Da
我的数据集包含 48 周内每一天的信息。[我的数据集截图][1] 我希望创建一个名为“quarter”的新变量,将每一个week变量值=1-12的观测值标记为“a”,意思是“第一季度”;另外,将每个周
我正在寻找一个 java 库,当给出起始日期和截止日期时,它将返回最适用的日期列表(以周、月、季度或年为单位)。我已经手动完成了这项工作,我想知道这是否已经作为标准包的一部分实现和测试。 例子 给定
我想做两件事: 我想将 x 轴格式设置为四分之一。我的时间序列数据以季度为单位。例如,对于日期 2012-12-31 我希望它显示为 2012Q4,对于 2013-03-31 作为 2013Q1 ,对
我是一名优秀的程序员,十分优秀!