下面的代碼計算了與日期month_changes相關的vals值的mean', 'median', 'max', 'min'。該代碼通過以年為單位的間隔來計算 mean', 'median', 'max', 'min'。我想在代碼中實作一個位,在 mean', 'median', 'max', 'min'值中加入從 starting_year變數開始的年份的零,同時在這個例子中的2020年等相互之間的年份也將加入零。我怎樣才能做到這一點呢?
import numpy as np
import pandas as pd。
month_changes = np. array(["2018-04-01 00:00:00"/span>, "2018-05-01 00:00:00"/span>, "2019-03-01 00:00:00"/span>, "2019-04-01 00:00: 00","2019-08-01 00:00:00", "2019-11-01 00:00:00", "2019-12-01 00:00:00","2021-01 01:00:00"] )
vals = np. array([10, 23, 45, 4, 5,12,4,-6] )
starting_year = 2016
def YearlyIntervals(vals)。
data = pd.DataFrame({"Date"/span>: month_changes, "Averages"/span>: vals})
data["Date"] = pd.to_datetime(data["Date"] )
out=(data.groupby(data["Date"].dt.year)
.agg(['mean','median','max','min'] )
.droplevel(0,1)
.rename(columns=lambda x:'Average' if x=='mean' else x.title()
)
return out
PnL_YearlyFilter= YearlyIntervals(vals)
輸出
Average Median Max Min
日期
2018 16.5 16.5 23 10
2019 14.0 5.0 45 4
2021 -6.0 -6.0 -6 -6
預期輸出
平均數 中位數 最大 最小
日期
2016 0 0 0 0
2017 0 0 0 0
2018 16.5 16.5 23 10
2019 14.0 5.0 45 4
2020 0 0 0 0
2021 -6.0 -6.0 -6 -6
uj5u.com熱心網友回復:
使用reindex與fill_value=0。
一種可以添加到函式中的方式是:
def yearly_intervals(mc, vs, start_year=None, end_year=None)。
data = pd.DataFrame({
"Date": pd.to_datetime(mc), # 立即轉換為_datetime。
"Averages": VS
})
out = (
data.groupby(data["Date"].dt.year)["Averages"] # access Series
.agg(['mean'/span>, 'median'/span>, 'max'/span>, 'min'/span>] )
.rename(columns=lambda x。'Average' if x == 'mean' else x.title()
)
# 如果 start_year
if start_year is not None:
# Reindex to ensure index contains all years in range.
out = out.reindex(range(
start_year,
# Use last year (maximum value) from index or user defined arg?
(end_year if end_year is not None else out. index.max()) 1
), fill_value=0)
return out
做了一些改動:
- PEP8指南指出,函式名應該 "應該是小寫的,必要時用下劃線分隔單詞"。函式和變數名 。
- numpy陣列可以在構建DataFrame時直接轉換
為_datetime,而不需要在構建DataFrame后再轉換Series。 - 對使用
SeriesGroupBy.aggregation代替DataFrame groupby的groupby聚合進行了輕微修改,以確保不同版本的行為更一致。 start_year和end_yearkwargs帶有默認引數,使函式更加靈活,以便可以使用任何年份的范圍。(可以添加更多的引數處理以確保end_year總是大于start_year) 。
end_year是可選的。如果沒有提供end_year,它將使用Index.max(索引中的最大值)
函式呼叫示例:
month_changes = np.array(
["2018-04-01 00:00:00"/span>, "2018-05-01 00:00:00"/span>, "2019-03-01 00:00:00"/span>。
"2019-04-01 00:00:00"/span>, "2019-08-01 00:00:00"/span>, "2019-11-01 00:00:00"/span>,
"2019-12-01 00:00:00", "2021-01-01 00:00:00"] )
vals = np. array([10, 23, 45, 4, 5, 12, 4, -6] )
starting_year = 2016
PnL_YearlyFilter:
Average Median Max Min
日期
2016 0.0 0.0 0 0
2017 0.0 0.0 0 0
2018 16.5 16.5 23 10
2019 14.0 5.0 45 4
2020 0.0 0.0 0 0
2021 -6.0 -6.0 -6 -6
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/312004.html
標籤:
