Python 按一月的第一天筛选熊猫股票行情数据帧

Python 按一月的第一天筛选熊猫股票行情数据帧,python,pandas,group-by,ticker,quandl,split-apply-combine,Python,Pandas,Group By,Ticker,Quandl,Split Apply Combine,抱歉,我对Python很陌生 我有当前代码: # Put data into a dataframe df = pd.DataFrame(ZACKSP_raw_data) """ Reformat dataframe data """ # Change exchange from NSDQ to NASDAQ df['exchange'] = df['exchange'].str.replace('NSDQ','NASDAQ') # Change date format to DD/

抱歉,我对Python很陌生

我有当前代码:

# Put data into a dataframe
df = pd.DataFrame(ZACKSP_raw_data)

""" Reformat dataframe data """    
# Change exchange from NSDQ to NASDAQ
df['exchange'] = df['exchange'].str.replace('NSDQ','NASDAQ')

# Change date format to DD/MM/YYYY
df['date'] = df['date'].dt.strftime('%d/%m/%Y')

# Round closing share price to 2 digits
df['close'] = df['close'].round(2)

# Filter data for Jan 
ZACKSP_data_StartOfJanYearMinus1 = df[df['date'] == '05/01/%s' % CurrentYearMinus1]

# Test
print(ZACKSP_data_StartOfJanYearMinus1.head())
以以下格式返回数据:


现在,我希望数组只保留1月份第一次记录的收盘价和12月份最后一次记录的收盘价(对于每个股票)。我曾想过尝试在一天中使用通配符,然后使用head()或tail()之类的符号来实现这一点,但我正在努力。有什么想法吗?

解决方案如果所有日期时间都已排序:

我想您需要为每一个
行情器的第一行和最后一行添加

此外,还需要为年添加新的列,为带有标记的年的第一个和最后一个值添加新的列

df['year'] = pd.to_datetime(df['date']).dt.year

df1 = pd.concat([df.drop_duplicates(['ticker', 'year']), 
                 df.drop_duplicates(['ticker', 'year'], keep='last')])  
使用未排序的
datetime
s的更通用的解决方案:

c = ['ticker','exchange','date','close']
df = pd.DataFrame({'date':pd.to_datetime(['2017-01-04','2017-01-12',
                                          '2017-01-05',
                           '2018-01-02','2018-12-27','2017-12-27',
                           '2018-01-05','2018-01-12','2017-01-05',
                           '2017-01-12','2018-12-22','2017-12-22']),
                   'close':[4.56,5.45,4.32,5.67,5.23,4.78,7.43,8.67,
                            9.32,4.73,2.42,3.45],
                   'ticker':['BA','BA','BA','BA','BA','BA',
                             'AAPL','AAPL','AAPL','AAPL','AAPL','AAPL'],
                    'exchange':['NYSE'] * 6 + ['NSDQ'] * 6}, columns=c)

print (df)
   ticker exchange       date  close
0      BA     NYSE 2017-01-04   4.56
1      BA     NYSE 2017-01-12   5.45
2      BA     NYSE 2017-01-05   4.32
3      BA     NYSE 2018-01-02   5.67
4      BA     NYSE 2018-12-27   5.23
5      BA     NYSE 2017-12-27   4.78
6    AAPL     NSDQ 2018-01-05   7.43
7    AAPL     NSDQ 2018-01-12   8.67
8    AAPL     NSDQ 2017-01-05   9.32
9    AAPL     NSDQ 2017-01-12   4.73
10   AAPL     NSDQ 2018-12-22   2.42
11   AAPL     NSDQ 2017-12-22   3.45


另一个具有不同数据输出的解决方案是聚合
第一个
最后一个

""" Reformat dataframe data """    
# Change exchange from NSDQ to NASDAQ
df['exchange'] = df['exchange'].str.replace('NSDQ','NASDAQ')

# Round closing share price to 2 digits
df['close'] = df['close'].round(2)

#sorting dates for first date per ticker is first day in Jan and last day in Dec
df = df.sort_values('date')

#extract years from dates
df['year'] = pd.to_datetime(df['date']).dt.year

df = (df.groupby(['ticker','year'])['close']
       .agg(['first','last'])
       .reset_index())
print (df)
  ticker  year  first  last
0   AAPL  2017   9.32  3.45
1   AAPL  2018   7.43  2.42
2     BA  2017   4.56  4.78
3     BA  2018   5.67  5.23

您需要
df.groupby('ticker')
,然后按月分组,过滤月份=='Dec',并取
tail()
,过滤月份=='Jan'并取head(),然后解组()

(如果您发布可复制的数据,我将发布执行此操作的代码。)

阅读熊猫博士关于
范式,数据科学的关键范式之一。有关SO的示例,请参见标记。

OK,这与我预期的不同,但我喜欢生成的输出。我有两个后续问题:1。我如何过滤这些年?我想包括大于已定义变量的所有年份,或者包括数组中匹配的所有年份,其中包含5年。1。您可以通过
df['year']=pd.to_datetime(df['date']).dt.year
进行过滤,然后
df[df['year']>2016]
-称为.2。我想为每年的第一个和最后一个列命名,如2017年第一个、2017年最后一个、2018年第一个、2018年最后一个,我将使用什么方法来实现这一点?年份定义如下:#立即查找当前年份=datetime.datetime.now()当前_year=str(now.year)2。对于解决方案1的输出
df1=df.drop_duplicates(['ticker','year'])
add
df1['year']=df1['year'])。astype(str)+'first'
和类似的
df2
#join DataFrames together and sorting if necessary
df = pd.concat([df1, df2]).sort_values(['ticker','date'])
print (df)
   ticker exchange       date  close  year
8    AAPL   NASDAQ 2017-01-05   9.32  2017
11   AAPL   NASDAQ 2017-12-22   3.45  2017
6    AAPL   NASDAQ 2018-01-05   7.43  2018
10   AAPL   NASDAQ 2018-12-22   2.42  2018
0      BA     NYSE 2017-01-04   4.56  2017
5      BA     NYSE 2017-12-27   4.78  2017
3      BA     NYSE 2018-01-02   5.67  2018
4      BA     NYSE 2018-12-27   5.23  2018
""" Reformat dataframe data """    
# Change exchange from NSDQ to NASDAQ
df['exchange'] = df['exchange'].str.replace('NSDQ','NASDAQ')

# Round closing share price to 2 digits
df['close'] = df['close'].round(2)

#sorting dates for first date per ticker is first day in Jan and last day in Dec
df = df.sort_values('date')

#extract years from dates
df['year'] = pd.to_datetime(df['date']).dt.year

df = (df.groupby(['ticker','year'])['close']
       .agg(['first','last'])
       .reset_index())
print (df)
  ticker  year  first  last
0   AAPL  2017   9.32  3.45
1   AAPL  2018   7.43  2.42
2     BA  2017   4.56  4.78
3     BA  2018   5.67  5.23