使用 pandas 得到一个学期内每个科目的总数 类
Get total no of classes of each subject within a semester using pandas
时间 table,列=小时,行=工作日,数据=主题
[工作日 x 小时]
1 2 3 4 5 6 7
Name
Monday Project Project Project Data Science Embedded Systems Data Mining Industrial Psychology
Tuesday Project Project Project Project Data Science Industrial Psychology Embedded Systems
Wednesday Data Science Project Project Project Project Project Project
Thursday Data Mining Industrial Psychology Embedded Systems Data Mining Project Project Project
Friday Industrial Psychology Embedded Systems Data Science Data Mining Project Project Project
频率table行=工作日,列=主题,数据=相应工作日的主题频率
[工作日 x 主题]
Data Data Mining Data Science Embedded Systems Industrial Psychology Project
Name
Friday 1 1 1 1 3
Monday 1 1 1 1 3
Thursday 2 0 1 1 3
Tuesday 0 1 1 1 4
Wednesday 0 1 0 0 6
代码
self.start = datetime(2022, 1, 1)
self.end = datetime(2022, 3, 31)
self.file = 'timetable.csv'
self.sdf = pd.read_csv(self.file, header=0, index_col="Name")
self.subject_frequency = self.sdf.apply(pd.value_counts).fillna(0)
print(self.subject_frequency.to_string())
self.subject_frequency["sum"] = self.subject_frequency.sum(axis=1)
self.p = self.sdf.melt(var_name='Freq', value_name='Data', ignore_index=False).assign(variable=1)\
.pivot_table('Freq', 'Name', 'Data', fill_value=0, aggfunc='count')
print(self.p.to_string())
必填Table
classes ...
Data Mining 32
Data Science 32
Embedded Systems 32
Industrial Psychology 32
Project 146
稍后将添加更多列,例如当前出勤率、每个 class 缺席的下降百分比、周一、周二休假的损失百分比等,以便从出勤率中减去它们.
最终目标是分析哪一天可以安全休假,并监控我的百分比。如果我的方向可以更好,请多多指教
select_rows = [date.strftime("%A") for date in pd.bdate_range(self.start, self.end)]
r = self.p.loc[select_rows, :]
print(r.to_string())
print(r.sum())
请随意添加更简单的代码,设计建议也很感激!
一种可能的方法是像您一样使用 bdate_range
并使用 weekday
到 select 工作日 (0-4) 和 map
这些数字到它们对应的工作日名称;然后reindex
频率table。然后你会得到一个 DataFrame,其中每一行对应于 2022-1-1 和 2022-3-31 之间的一个工作日。然后 sum
找到每个 class:
的总数
out = (freqtable.reindex(pd.bdate_range('2022-1-1','2022-3-31').weekday
.map(dict(enumerate(['Monday','Tuesday','Wednesday','Thursday','Friday']))))
.sum()
.rename_axis(['classes']).reset_index(name='count'))
输出:
classes count
0 Data Mining 51
1 Data Science 51
2 Embedded Systems 51
3 Industrial Psychology 51
4 Project 244
时间 table,列=小时,行=工作日,数据=主题
[工作日 x 小时]
1 2 3 4 5 6 7
Name
Monday Project Project Project Data Science Embedded Systems Data Mining Industrial Psychology
Tuesday Project Project Project Project Data Science Industrial Psychology Embedded Systems
Wednesday Data Science Project Project Project Project Project Project
Thursday Data Mining Industrial Psychology Embedded Systems Data Mining Project Project Project
Friday Industrial Psychology Embedded Systems Data Science Data Mining Project Project Project
频率table行=工作日,列=主题,数据=相应工作日的主题频率
[工作日 x 主题]
Data Data Mining Data Science Embedded Systems Industrial Psychology Project
Name
Friday 1 1 1 1 3
Monday 1 1 1 1 3
Thursday 2 0 1 1 3
Tuesday 0 1 1 1 4
Wednesday 0 1 0 0 6
代码
self.start = datetime(2022, 1, 1)
self.end = datetime(2022, 3, 31)
self.file = 'timetable.csv'
self.sdf = pd.read_csv(self.file, header=0, index_col="Name")
self.subject_frequency = self.sdf.apply(pd.value_counts).fillna(0)
print(self.subject_frequency.to_string())
self.subject_frequency["sum"] = self.subject_frequency.sum(axis=1)
self.p = self.sdf.melt(var_name='Freq', value_name='Data', ignore_index=False).assign(variable=1)\
.pivot_table('Freq', 'Name', 'Data', fill_value=0, aggfunc='count')
print(self.p.to_string())
必填Table
classes ...
Data Mining 32
Data Science 32
Embedded Systems 32
Industrial Psychology 32
Project 146
稍后将添加更多列,例如当前出勤率、每个 class 缺席的下降百分比、周一、周二休假的损失百分比等,以便从出勤率中减去它们.
最终目标是分析哪一天可以安全休假,并监控我的百分比。如果我的方向可以更好,请多多指教
select_rows = [date.strftime("%A") for date in pd.bdate_range(self.start, self.end)]
r = self.p.loc[select_rows, :]
print(r.to_string())
print(r.sum())
请随意添加更简单的代码,设计建议也很感激!
一种可能的方法是像您一样使用 bdate_range
并使用 weekday
到 select 工作日 (0-4) 和 map
这些数字到它们对应的工作日名称;然后reindex
频率table。然后你会得到一个 DataFrame,其中每一行对应于 2022-1-1 和 2022-3-31 之间的一个工作日。然后 sum
找到每个 class:
out = (freqtable.reindex(pd.bdate_range('2022-1-1','2022-3-31').weekday
.map(dict(enumerate(['Monday','Tuesday','Wednesday','Thursday','Friday']))))
.sum()
.rename_axis(['classes']).reset_index(name='count'))
输出:
classes count
0 Data Mining 51
1 Data Science 51
2 Embedded Systems 51
3 Industrial Psychology 51
4 Project 244