cnmmmmmm_mmmmm 2024-05-29 15:37 采纳率: 0%
浏览 1584
已结题

FutureWarning:不推荐使用空或全 NA 条目的 DataFrame 串联行为。怎么改呢?


import pandas as pd
import tushare as ts
import matplotlib.pyplot as plt

pro = ts.pro_api('ca0cd5409f62a54869ffa4ad1f81f99e0a3d649f4e87cfc034dc0003')

code_sheet1 = pro.stock_basic(exchange='SSE')
code_sheet2 = pro.stock_basic(exchange='SZSE')
code_sheet = pd.concat([code_sheet1, code_sheet2])

code_bj = code_sheet[code_sheet['industry'] == '电气设备']

print(code_bj)

df1 = pd.DataFrame()
df2 = pd.DataFrame()
df3 = pd.DataFrame()



**for i in range(len(code_bj)):
    df1 = df1.__append_(pro.cashflow(ts_code=code_bj.iloc[i]['ts_code'], period='20211231',fields='ts_code,n_cashflow_act,stot_out_inv_act,c_fr_sale_sg,c_cash_equ_end_period,end_date'),ignore_index=True)
    df1 = df1.drop_duplicates(ignore_index=True)
for j in range(len(code_bj)):
    df2 = df2.__append_(pro.income(ts_code=code_bj.iloc[j]['ts_code'], period='20211231', fields='ts_code,n_income,revenue,end_date'),ignore_index=True)
    df2 = df2.drop_duplicates(ignore_index=True)
for z in range(len(code_bj)):
    df3 = df3.__append_(pro.balancesheet(ts_code=code_bj.iloc[z]['ts_code'], period='20211231',fields='ts_code,st_borr,lt_borr,bond_payable,end_date'), ignore_index=True)
    df3 = df3.drop_duplicates(ignore_index=True)**


df = pd.concat([df1, df2[['n_income', 'revenue']]], axis=1)
df = pd.concat([df, df3[['st_borr', 'lt_borr', 'bond_payable']]], axis=1)

df['name'] = code_bj['name'].tolist()
df['ratio1'] = round(df['n_cashflow_act'] / df['n_income'], 2)
df['ratio2'] = round(df['c_fr_sale_sg'] / df['revenue'], 2)
df['自由现金流'] = df['n_cashflow_act'] - df['stot_out_inv_act']
df.replace(to_replace=[None], value=0, inplace=True)

plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']

plt.figure(figsize=(20, 8))
plt.bar(df['name'], df['ratio1'], label='指标1:经营活动现金流量净额/净利润')
plt.legend(loc='upper left')
plt.xticks(df['name'], rotation=45)
plt.show()

plt.figure(figsize=(20, 8))
plt.bar(df['name'], df['ratio2'], label='指标2:销售商品、提供劳务收到的现金/营业收入')
plt.legend(loc='upper left')
plt.xticks(df['name'], rotation=45)
plt.show()

plt.figure(figsize=(20, 8))
plt.bar(df['name'], df['自由现金流'], label='指标3:自由现金流')
plt.legend(loc='upper left')
plt.xticks(df['name'], rotation=45)
plt.show()
D:\Python_study\4.py:20: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.
  df1 = df1._append(pro.cashflow(ts_code=code_bj.iloc[i]['ts_code'], period='20211231',fields='ts_code,n_cashflow_act,stot_out_inv_act,c_fr_sale_sg,c_cash_equ_end_period,end_date'),ignore_index=True)
 File "D:\Python_study\4.py", line 20, in <module>
    df1 = df1._append(pro.cashflow(ts_code=code_bj.iloc[i]['ts_code'], period='20211231',fields='ts_code,n_cashflow_act,stot_out_inv_act,c_fr_sale_sg,c_cash_equ_end_period,end_date'),ignore_index=True)

  • 写回答

25条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-29 15:37
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在你的代码中,引发FutureWarning的警告是由于使用了pd.concat()函数连接包含空值(NaN)的DataFrame。根据提示,从未来的版本开始,这可能会导致结果数据类型的变化。为了解决这个问题,你需要在合并之前确保所有DataFrame都没有空值。

    为了消除这个警告,你可以先检查每个DataFrame是否包含任何缺失值,并在进行concat操作前删除这些行。以下是修改后的代码片段,我已经包含了处理缺失值的部分:

    import pandas as pd
    import tushare as ts
    import matplotlib.pyplot as plt
    
    # ... (保持其他部分不变)
    
    # 在对df1、df2和df3执行concat之前,移除含有空值的行
    df1 = df1.dropna()
    df2 = df2.dropna()
    df3 = df3.dropna()
    
    # 然后进行concat操作
    df = pd.concat([df1, df2[['n_income', 'revenue']]], axis=1)
    df = pd.concat([df, df3[['st_borr', 'lt_borr', 'bond_payable']]], axis=1)
    
    # ... (保持其他部分不变)
    

    这段代码会在将数据合并到最终的DataFrame df 之前,先删除 df1df2df3 中含有的任何空值行。这样可以避免未来版本可能带来的数据类型变化,同时消除警告信息。如果你的数据允许,也可以选择填充空值而不是删除它们,例如使用 fillna() 函数。不过在此处,我选择了删除含有空值的行。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月6日
  • 修改了问题 5月29日
  • 创建了问题 5月29日