2021-03-19:task2_数据分析

本文主要介绍了数据分析过程,包括加载数据科学和可视化库,检查数据集的缺失值和异常,通过图像展示了预测值的分布,并利用pandas_profiling生成详细的数据报告,帮助理解数据特性。

代码实例

  1. 载入各种数据科学与可视化库
import warnings
warnings.filterwarnings('ignore')
# import missingno as msno
import pandas as pd
from pandas import DataFrame,Series
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
!pip install missingno
Requirement already satisfied: missingno in e:\app\anaconda\envs\python3.7\lib\site-packages (0.4.2)
Requirement already satisfied: numpy in e:\app\anaconda\envs\python3.7\lib\site-packages (from missingno) (1.19.4)
Requirement already satisfied: seaborn in e:\app\anaconda\envs\python3.7\lib\site-packages (from missingno) (0.11.1)
Requirement already satisfied: matplotlib in e:\app\anaconda\envs\python3.7\lib\site-packages (from missingno) (3.3.3)
Requirement already satisfied: scipy in e:\app\anaconda\envs\python3.7\lib\site-packages (from missingno) (1.6.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in e:\app\anaconda\envs\python3.7\lib\site-packages (from matplotlib->missingno) (2.4.7)
Requirement already satisfied: cycler>=0.10 in e:\app\anaconda\envs\python3.7\lib\site-packages (from matplotlib->missingno) (0.10.0)
Requirement already satisfied: pillow>=6.2.0 in e:\app\anaconda\envs\python3.7\lib\site-packages (from matplotlib->missingno) (8.1.0)
Requirement already satisfied: python-dateutil>=2.1 in e:\app\anaconda\envs\python3.7\lib\site-packages (from matplotlib->missingno) (2.8.1)
Requirement already satisfied: kiwisolver>=1.0.1 in e:\app\anaconda\envs\python3.7\lib\site-packages (from matplotlib->missingno) (1.3.1)
Requirement already satisfied: six in e:\app\anaconda\envs\python3.7\lib\site-packages (from cycler>=0.10->matplotlib->missingno) (1.15.0)
Requirement already satisfied: pandas>=0.23 in e:\app\anaconda\envs\python3.7\lib\site-packages (from seaborn->missingno) (1.2.0)
Requirement already satisfied: pytz>=2017.3 in e:\app\anaconda\envs\python3.7\lib\site-packages (from pandas>=0.23->seaborn->missingno) (2020.5)
  1. 载入数据集和训练集
train_data = pd.read_csv('./train.csv')
train_data.head()
id heartbeat_signals label
0 0 0.9912297987616655,0.9435330436439665,0.764677... 0.0
1 1 0.9714822034884503,0.9289687459588268,0.572932... 0.0
2 2 1.0,0.9591487564065292,0.7013782792997189,0.23... 2.0
3 3 0.9757952826275774,0.9340884687738161,0.659636... 0.0
4 4 0.0,0.055816398940721094,0.26129357194994196,0... 2.0
test_data = pd.read_csv('./testA.csv')
test_data.head()
id heartbeat_signals
0 100000 0.9915713654170097,1.0,0.6318163407681274,0.13...
1 100001 0.6075533139615096,0.5417083883163654,0.340694...
2 100002 0.9752726292239277,0.6710965234906665,0.686758...
3 100003 0.9956348033996116,0.9170249621481004,0.521096...
4 100004 1.0,0.8879490481178918,0.745564725322326,0.531...
  • 观察首尾数据
train_data.head().append(train_data.tail())
id heartbeat_signals label
0 0 0.9912297987616655,0.9435330436439665,0.764677... 0.0
1 1 0.9714822034884503,0.9289687459588268,0.572932... 0.0
2 2 1.0,0.9591487564065292,0.7013782792997189,0.23... 2.0
3 3 0.9757952826275774,0.9340884687738161,0.659636... 0.0
4 4 0.0,0.055816398940721094,0.26129357194994196,0... 2.0
99995 99995 1.0,0.677705342021188,0.22239242747868546,0.25... 0.0
99996 99996 0.9268571578157265,0.9063471198026871,0.636993... 2.0
99997 99997 0.9258351628306013,0.5873839035878395,0.633226... 3.0
99998 99998 1.0,0.9947621698382489,0.8297017704865509,0.45... 2.0
99999 99999 0.9259994004527861,0.916476635326053,0.4042900... 0.0
test_data.head().append(test_data.tail())
id heartbeat_signals
0 100000 0.9915713654170097,1.0,0.6318163407681274,0.13...
1 100001 0.6075533139615096,0.5417083883163654,0.340694...
2 100002 0.9752726292239277,0.6710965234906665,0.686758...
3 100003 0.9956348033996116,0.9170249621481004,0.521096...
4 100004 1.0,0.8879490481178918,0.745564725322326,0.531...
19995 119995 1.0,0.8330283177934747,0.6340472606311671,0.63...
19996 119996 1.0,0.8259705825857048,0.4521053488322387,0.08...
19997 119997 0.951744840752379,0.9162611283848351,0.6675251...
19998 119998 0.9276692903808186,
内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
<think> 我们遇到了一个错误:write_to_database() got an unexpected keyword argument 'filter_condition' 这是因为在之前的修改中,我们为write_to_database函数增加了一个新的参数filter_condition,但是在调用的时候,可能这个函数还没有被修改,或者修改的版本没有被使用。 根据错误日志,我们是在调用write_to_database时传递了filter_condition参数,但是原函数并没有这个参数。 解决方案: 1. 确保write_to_database函数定义已经修改为接受filter_condition参数(如我们之前所设计)。 2. 或者,如果write_to_database函数没有被修改,那么我们需要修改它。 由于错误提示表明write_to_database函数不接受filter_condition参数,说明我们可能没有修改write_to_database函数,或者修改的代码没有生效。 因此,我们需要检查write_to_database函数的定义,确保它包含filter_condition参数。 修改后的write_to_database函数应该如下: ```python def write_to_database(df, engine, table_name, filter_condition=None): # ... 函数体 ... ``` 如果已经修改,则可能是其他原因(比如函数定义在另一个模块?),但根据上下文,我们是在同一个文件中定义的。 考虑到错误日志,我们是在bsw_task_jira_deal.py的第458行调用write_to_database时出错。因此,我们需要确保在调用之前,函数定义已经被正确更新。 另外,在process_and_write_data函数内部,我们调用了write_to_database,并传递了filter_condition参数。因此,我们必须确保write_to_database函数的定义包含这个参数。 如果之前没有修改write_to_database函数,那么现在需要修改。 所以,完整的修改步骤是: 1. 更新write_to_database函数,增加filter_condition参数,并实现过滤逻辑。 2. 重新运行程序。 根据以上分析,我们调整代码,确保write_to_database函数被正确修改。 下面是完整的write_to_database函数(已修改)和process_and_write_data函数(调用部分)的代码: 注意:在process_and_write_data函数中,我们调用write_to_database时传递了filter_condition参数,所以write_to_database必须支持。 因此,我们将write_to_database函数修改为: ```python def write_to_database(df, engine, table_name, filter_condition=None): """ 将DataFrame写入数据库,支持写入时过滤 参数: df: 要写入的DataFrame engine: 数据库连接引擎 table_name: 目标表名 filter_condition: 可选过滤函数 (lambda df: boolean_series) """ try: # 应用过滤条件 if filter_condition is not None: df = df[filter_condition(df)] # 写入数据库 df.to_sql( name=table_name, con=engine, if_exists='append', index=False ) return len(df) except Exception as e: logging.error(f"写入数据库失败: {str(e)}") raise ``` 同时,确保在process_and_write_data函数中调用write_to_database时传递了filter_condition参数(如之前所示)。 但是,请注意错误发生在2025年(这可能是日志时间配置错误?),但问题核心是函数调用参数不匹配。 因此,我们只需要更新write_to_database函数定义即可。 如果问题仍然存在,可能是由于代码没有保存或未重新运行。请确保修改已保存并重新运行程序。 现在,我们重新提供完整的process_and_write_data函数和write_to_database函数,确保一致。 注意:在原始代码中,write_to_database函数可能没有定义filter_condition参数,所以我们需要加上。 为了避免混淆,下面再次给出修改后的两个函数: **write_to_database函数(修改后)**: ```python def write_to_database(df, engine, table_name, filter_condition=None): try: # 如果有过滤条件,则应用 if filter_condition is not None: df = df[filter_condition(df)] # 写入数据库 df.to_sql(table_name, engine, if_exists='append', index=False) return len(df) except Exception as e: logging.error(f"写入数据库失败: {str(e)}") raise ``` **process_and_write_data函数(部分,调用write_to_database的地方)**: ```python # 修改后的写入逻辑 original_count = len(processed_chunk) # 调用write_to_database,并传递过滤条件 written_count = write_to_database( processed_chunk, target_engine, target_table, filter_condition=lambda df: df['Project key'] != 'KOCHI_PL' ) removed_count = original_count - written_count if removed_count > 0: logging.info(f"分块 {idx+1} 跳过 {removed_count} 条 KOCHI_PL 记录") total_rows += written_count logging.info(f"已写入分块 {idx + 1} [{written_count}行]") ``` 请检查代码,确保write_to_database函数的定义已经更新,然后重新运行。 如果已经更新,那么错误应该解决。 如果问题仍然存在,请检查是否在同一个文件中,或者是否有多个同名的write_to_database函数(例如,可能之前定义了一个,后面又定义了一个,而实际调用的是旧版本)。 根据错误信息,问题是在调用时出现的,所以重点检查调用时可见的函数定义是否包含filter_condition参数。 另外,注意函数定义的位置:如果函数定义在调用之后,也会出错。所以确保函数定义在调用之前。 因此,在代码中,write_to_database函数的定义应该在process_and_write_data函数之前。 如果按照这个修改后仍然报错,请提供更多信息。 由于我们无法运行,只能根据逻辑修改代码。现在重新提供完整的代码结构建议: ```python # 先定义write_to_database函数 def write_to_database(df, engine, table_name, filter_condition=None): ... # 如上 # 然后定义process_and_write_data函数 def process_and_write_data(source_engine, target_engine, config_path, target_table): ... # 在内部调用write_to_database时使用filter_condition参数 ``` 这样,当process_and_write_data调用write_to_database时,它使用的是上面定义的新版本。 希望这次修改能解决问题。 如果还有问题,请检查代码中是否有其他write_to_database的定义覆盖了新的定义。 注意:在Python中,函数是顺序执行的,后面的定义会覆盖前面的定义。所以确保只有一个正确的write_to_database函数定义。 最后,重新运行程序。 §§相关问题§§ 1. 为什么在调用write_to_database时会出现“unexpected keyword argument”错误? 2. 如何确保函数修改后代码中调用的是最新的函数定义? 3. 除了参数不匹配,还有哪些情况会导致TypeError? 4. 在Python中,如何避免函数定义和调用之间的顺序问题? 5. 如果在多个模块中使用该函数,如何保证函数修改后所有调用点都正确更新? </think> 根据错误日志,问题出在 `write_to_database()` 函数不支持 `filter_condition` 参数。以下是修复后的完整代码: ```python def process_and_write_data(source_engine, target_engine, config_path, target_table): """ 处理数据并写入目标数据库 参数: source_engine: 源数据库连接引擎 target_engine: 目标数据库连接引擎 config_path: JSON配置文件路径 target_table: 目标数据库表名 """ try: # 1. 读取JSON配置文件 config_dict = load_config(config_path) required_columns = config_dict.get("required_columns", []) # 2. 获取BSW员工集合 bsw_staff_set = get_bsw_staff(target_engine) # 3. 从源数据库分块读取数据 chunk_size = 5000 chunks = pd.read_sql( f"SELECT * FROM {source_table}", source_engine, chunksize=chunk_size ) total_rows = 0 logging.info("开始处理数据...") for idx, chunk in enumerate(chunks): # 4. 添加新列 processed_chunk = add_columns(chunk, bsw_staff_set) # 5. 分配责任人 processed_chunk = assign_responsibles(processed_chunk, config_dict) # ==== 修改后的写入逻辑 ==== # 在写入前过滤掉KOCHI_PL记录 original_count = len(processed_chunk) # 应用过滤条件 filtered_chunk = processed_chunk[processed_chunk['Project key'] != 'KOCHI_PL'] # 写入数据库 write_to_database(filtered_chunk, target_engine, target_table) written_count = len(filtered_chunk) removed_count = original_count - written_count if removed_count > 0: logging.info(f"分块 {idx+1} 跳过 {removed_count} 条 KOCHI_PL 记录") total_rows += written_count logging.info(f"已写入分块 {idx + 1} [{written_count}行]") # ========================= logging.info(f"数据处理完成! 总共写入 {total_rows} 行数据") return total_rows except Exception as e: logging.error(f"数据处理失败: {str(e)}") raise def write_to_database(df, engine, table_name): """ 将DataFrame写入数据库 参数: df: 要写入的DataFrame engine: 数据库连接引擎 table_name: 目标表名 """ try: # 写入数据库 df.to_sql( name=table_name, con=engine, if_exists='append', index=False ) logging.debug(f"成功写入 {len(df)} 行到表 {table_name}") except Exception as e: logging.error(f"写入数据库失败: {str(e)}") raise ``` **修复说明:** 1. **移除了 `write_to_database()` 的 `filter_condition` 参数**: - 保持 `write_to_database()` 函数简洁单一职责 - 只负责写入数据,不处理过滤逻辑 2. **将过滤逻辑移到 `process_and_write_data()` 内部**: - 在写入前直接过滤 DataFrame:`filtered_chunk = processed_chunk[processed_chunk['Project key'] != 'KOCHI_PL']` - 然后调用 `write_to_database(filtered_chunk, ...)` 3. **保持原有日志功能**: - 计算原始记录数 `original_count` - 计算过滤后记录数 `written_count` - 计算跳过记录数 `removed_count` - 记录详细的处理日志 4. **错误处理优化**: - 保留原有的异常处理结构 - 在 `write_to_database()` 中添加了调试日志 这个修正版本避免了参数不匹配的错误,同时保持了相同的功能:在数据写入前过滤掉 KOCHI_PL 记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值