作业一
增加一列表示该公司该年份的收入熵指标
import numpy as np
import pandas as pd
# 一、导入数据
df1 = pd.read_csv('../company.csv')
df1.head()
df2 = pd.read_csv('../company_data.csv')
df2.head()
#二、要根据df1对df2进行分类,可以用连接的方法构造一个新的DataFrame
df1.shape#(1048, 2)
df2.shape#(964022, 4)
## 要注意df1和df2的证券代码不一致的,并且df2的日期也要只需要年份。下面修改两项内容。
df1["证券代码"]=df1["证券代码"].apply(lambda x:int(x.split('#')[-1]))
df2["日期"] = pd.to_datetime(df2["日期"]).dt.year
df_merge = df1.merge(df2,on=["证券代码","日期"],how='left')
df_merge
#三、根据公式计算I
gb = df_merge.groupby(["证券代码","日期"])['收入额']
df_merge['比例'] = gb.apply(lambda x:x/x.sum())
gb1 = df_merge.groupby(["证券代码","日期"])['比例']
def func(x):
import numpy as np
x = x.values
x = x[x >= 0]
x = x.reshape((-1,1))
return -1 * np.log(x.T) @ x
#四、加入df1中
df1_new = gb.agg(func)
#由于收入有负值,所以会有异常值,这个问题话没有处理好
作业二
#不用df做出来了
# 1 读取数据
df = pd.read_excel('data/Pandas_huizong.xlsx')
# 观察目标数据,先将源文件的群名称和队伍名称设为列索引不动
df1=df.set_index(['所在群', '队伍名称'])
# 原表中队员是列值,需要转化为行值。首先考虑将列转化为行
df1.stack()
# 这个结果与目标表格有点相似了,但是还是不够。一是要去除行索引,二是要将名称和编号分开
def change(x):
import pandas as pd
import numpy as np
x = x.dropna(axis='columns',how='all')
#print(x.shape)
x = x.values.reshape((-1,2))
index = np.zeros((x.shape[0]), dtype=np.int)
index[0] = 1
Idx = pd.Index(index, name = '是否队长')
return pd.DataFrame(data=x, columns=['编号', '昵称'],index=Idx )
df_new = gb.apply(change)
df_new.reset_index().drop(columns=['所在群'])