首页 > 解决方案 > 尝试根据日期时间的月份在两行数据帧之间实现基本减法功能

问题描述

我试图找到数据框中股票收盘价和开盘价之间的平均每月差距。
基本功能如下所示

for i in range(1,len(df)):
    #difference between today's opening price minus yesterday's closing price
    gap+=(df['Open'][i]-df['Close'][i-1])

但我想avg_gap在我的数据框中每个月都找到这个。并将其存储avg_gaps在列表中。
数据框每天都有相关日期的开盘价、最高价、最低价和收盘价(日期时间格式)
看起来像这样

Date        Open    High    Low      Close
2019-01-01  10881.7 10923.6 10807.1 10910.1
2019-01-02  10868.8 10895.3 10735.0 10792.5
2019-01-03  10796.8 10814.0 10661.2 10672.2
2019-01-04  10699.7 10741.0 10628.6 10727.3
2019-01-07  10804.8 10835.9 10750.1 10771.8
2019-01-08  10786.2 10818.4 10733.2 10802.1

像这样,数据框有 1.5 年的数据

这是我尝试过的

list=[]
gap=0
count=0

for i in range(1,len(df)):   
    if(df['Date'][i].month==df['Date'][i-1].month):
        count+=1
        gap+=(df['Open'][i]-df['Close'][i-1])
    if(df['Date'][i].month<df['Date'][i-1].month):
        avg_gap=gap/count
        list.append(avg_gap)
        count=0
        gap=0

这并没有给我正确的答案。

我希望avg_gap一年中的每个月都有 12 个添加到列表中。

avg_gaps计算公式为(当月总差距)/(当月总天数)

我能做些什么?

标签: pythonpandasdataframe

解决方案


您将希望在您DataFrame的分组依据中创建一个月份列。然后,编写一个计算平均间隙的函数。

间隙计算

您正在添加许多差异,如下所示:

 df['Open'][1]-df['Close'][0]
+df['Open'][2]-df['Close'][1]
+df['Open'][3]-df['Close'][2]
+...

但是,我们可以将其分组如下:

 (df['Open'][1]+df['Open'][2]+df['Open'][3]+...)
-(df['Close'][0]+df['Close'][1]+df['Close'][2]+...)

因此,执行计算的更简单方法是

df['Open'].iloc[1:].sum()-df['Close'].iloc[:-1].sum()

代码

def average_gap(month_df):
    openings = month_df['Open'].iloc[1:].sum()
    closings = month_df['Close'].iloc[:-1].sum()
    number = month_df.shape[0]-1
    
    return (openings-closings)/number

df['month'] = df['Date'].dt.month
gap_by_month = df.groupby('month').apply(average_gap)

推荐阅读