pandas(八)--实战一下

背景

收到一批数据,数据形式。采集数据的间隔时间是10分钟,全天采集数据,每天的数据量是144条
在这里插入图片描述
处理后的数据形式
在这里插入图片描述

分析

  1. 去除表格中的q的异常值,置为0
  2. 去除重复行
  3. 将原始表格中的date分裂成日期和时间
  4. 缺失的时间点数据补0,否则无法将单列数据reshape成二维表的形式
  5. reshape df_empty.pivot

代码实现

# coding:utf-8
from tqdm import tqdm
import numpy as np
import pandas as pd

def compute_uniq_dates(df):
    uniq_dates = df['date'].unique()
    ## 取出一天的时间间隔 -- 时间点
    for uniq_date in uniq_dates:
        single_info = df[df['date'] == uniq_date]
        num_data = len(single_info)
        if num_data == 144:
            time_sep = single_info['time']
            break
    print('time_sep \n', time_sep)
    return uniq_dates,time_sep

def concate_dates(df,uniq_dates,time_sep):
    count = 0
    miss_date = [] ## 缺数据的日期
    ## 建立空表,拼接每天的结果
    df_empty = pd.DataFrame(columns=['date', 'time', 'q'])  ## 保存最后的结果
    ## 有哪些天有缺失数据,分别缺了过少条
    for uniq_date in tqdm(uniq_dates):
        single_info = df[df['date'] == uniq_date]
        num_data = len(single_info)
        ## 判断原始表格中这天的数据是否完整,不完整补齐,多了去掉
        ## 完整直接使用原始表格中的数据
        if num_data != 144:
            if num_data < 144:
                miss_date.append(uniq_date)
            else:  ## > 144条的
                print('duplicate uniq_date', uniq_date)

            count += 1
            ## temp_df 保存当天的数据。如果原始表格中有数据,用原始表格中数据;
            # 如果原始表格中没有数据,用0代替
            temp_df = {'date': pd.Series(np.array([uniq_date for i in range(len(time_sep))])),
                       'time': pd.Series(np.array(time_sep.tolist())),
                       'q': pd.Series(np.array([0. for i in range(len(time_sep))]))}  # 没有设置index的Series
            temp_df = pd.DataFrame(temp_df, columns=['date', 'time', 'q'])

            ## 不够的补齐数据
            for sample_time in time_sep:  ## 时间点 8:00
                try:
                    ## 取出原始表格中 当前日期和时间的q值,并赋值给新表格中相同日期和时间点
                    ## 如果原始表格中无法取出这个数据,说明这个数据丢失,使用temp_df在定义时的0代替
                    actual_val = single_info.loc[(single_info['date'] == uniq_date) & (single_info['time'] == sample_time), 'q'].values.tolist()[0]
                    temp_df.loc[(temp_df['date'] == uniq_date) & (temp_df['time'] == sample_time), 'q'] = float(actual_val)
                except:  ## 表示时间点不存在,维持0
                    continue
            ## 当原始数据中同一个时间点有两个数据,且数据不相等时,新表和旧表的同一天的q值的和不同
            ## 此部分用于找出原始数据中的问题数据
            if True:
                if int(single_info['q'].sum()) != int(temp_df['q'].sum()):
                    print(single_info['q'].sum())
                    print(temp_df['q'].sum())
                    print('uniq_date,sample_time unequal sum', uniq_date, sample_time)
                # exit()
            ## 一天天地去拼接数据
            df_empty = pd.concat([df_empty, temp_df], axis=0)
        else:
            df_empty = pd.concat([df_empty, single_info], axis=0)
    return df_empty,miss_date

def parse_df(df,save_path):
    print('processing ......')

    df['time'] = pd.to_datetime(df['date']).dt.time
    df['date'] = pd.to_datetime(df['date']).dt.date
    # 去除重复行
    df = df.drop_duplicates()

    ## 去掉异常值
    df_new = df[df['q'] > 10]
    df = df_new[df_new['q'] < 600]

    # # 使用duplicated()函数找出重复行
    # duplicate_rows = df[df.duplicated()]

    ## 采的数据日期和时间点
    uniq_dates, time_sep = compute_uniq_dates(df)
    df_empty,miss_date = concate_dates(df,uniq_dates,time_sep)

    print('df_empty\n', df_empty)
    # 重新排列表格成目标形式
    # df = df_empty.pivot(index='time', columns='date', values='q').fillna(0)
    df = df_empty.pivot(index='date', columns='time', values='q').fillna(0)
    # 重置索引
    df = df.reset_index()
    ## 保存结果
    df.to_csv(save_path, index=False)
    fw = open('miss_date.txt', 'w')
    for da in miss_date:
        line = da.strftime('%Y-%m-%d') + '\n'
        fw.write(line)
    print('miss date', miss_date)
    exit()
if __name__ =='__main__':
    csv_path = 'temp.csv'
    save_path = 'output.csv'
    df = pd.read_csv(csv_path, encoding='utf-8')
    parse_df(df,save_path)

遇到的问题

  1. 无法打开文件UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 2: invalid start byte
    解决办法:用记事本打开csv文件,更改编码方式是TUTF-8
  2. 如何取出原始表格中的日期和时间
df['time'] = pd.to_datetime(df['date']).dt.time
df['date'] = pd.to_datetime(df['date']).dt.date ## 覆盖原始的date
  1. 如何取出原始表格中指定日期和时间的q值,并更新到新表格中
    使用loc取出数据,原始数据中存在一个时间点多个数据,且数据不相同,无法用duplicate去掉,这里取的第一个值
# 取出原始表格中 当前日期和时间的q值,并赋值给新表格中相同日期和时间点
## 如果原始表格中无法取出这个数据,说明这个数据丢失,使用temp_df在定义时的0代替
actual_val = single_info.loc[(single_info['date'] == uniq_date) & (single_info['time'] == sample_time), 'q'].values.tolist()[0]
temp_df.loc[(temp_df['date'] == uniq_date) & (temp_df['time'] == sample_time), 'q'] = float(actual_val)
  1. 上述处理后,表格的形式为下面的这种形式,如何转成目标形式呢?
    在这里插入图片描述
# 重新排列表格成目标形式
## 时间-日期形式
# df = df_empty.pivot(index='time', columns='date', values='q').fillna(0)
## 日期-时间形式
df = df_empty.pivot(index='date', columns='time', values='q').fillna(0)
# 重置索引
df = df.reset_index()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/203327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Target、沃尔玛撸卡、采退支付下单如何避免账号关联风险?

近年来&#xff0c;随着跨境电商平台的日益繁荣&#xff0c;越来越多的国内卖家涌入其中&#xff0c;导致竞争异常激烈。为了在竞争中脱颖而出&#xff0c;一些卖家采用自动脚本程序进行浏览和下单&#xff0c;然而这种行为很容易导致账号被批量关联、封号。本文将探讨养号下单…

JOSEF 时间继电器 DS-37 AC220V 10秒 柜内安装,板前接线

系列型号 DS-31时间继电器&#xff1b;DS-31/X时间继电器&#xff1b; DS-31/2X时间继电器&#xff1b;DS-32时间继电器&#xff1b; DS-32/X时间继电器;DS-32/2X时间继电器; DS-33时间继电器;DS-33/X时间继电器; DS-33/2X时间继电器;DS-34时间继电器; DS-31C/X时间继电器…

聊一聊大模型 | 京东云技术团队

事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT&#xff0c;一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界&#xff0c;各大巨头也纷纷跟进发布了自家的大模型&#…

MySQL进阶知识:三

前言 未更新完毕&#xff01;大概明天更完&#xff01; 锁 MySQL中的锁&#xff0c;按照锁的粒度分&#xff0c;分为以下三类 全局锁&#xff1a;锁定数据库中的所有表。表级锁&#xff1a;每次操作锁住整张表。行级锁&#xff1a;每次操作锁住对应的行数据。 全局锁 全局…

14.docker部署应用的两种企业实践

1.介绍 1.1 说明 这里仅仅说明一下在企业应用的两种简单实践&#xff0c;并不包含自动化这套东西。这里说的两种实践&#xff0c;是我在工作中不同公司使用的两种部署方式&#xff0c;仅供大家参考。 1.2 两种部署方式 第一种&#xff1a;是把环境和app都一起打成一个镜像&…

TCP 连接断开

1&#xff1a;TCP 四次挥手过程是怎样的&#xff1f; 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文&#xff0c;之后客户端进入 FIN_WAIT_1 状态。 服务端收到该报文后&#xff0c;就向客户端发送 ACK 应答报文…

【开源】基于Vue.js的超市账单管理系统的设计和实现

项目编号&#xff1a; S 032 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S032&#xff0c;文末获取源码。} 项目编号&#xff1a;S032&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

mybatis数据输入-实体类型的参数

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

Python文件操作,看这篇就足够!

Python中有几个内置模块和方法来处理文件。这些方法被分割到例如os, os.path , shutil 和 pathlib 等等几个模块中。文章将列举Python中对文件最常用的操作和方法。 在这篇文章中&#xff0c;你将学习如何&#xff1a; 获取文件属性创建目录文件名模式匹配遍历目录树创建临时…

python实现获取aws route53域名信息

最近由于工作原因接触到aws的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 1.基础准备 代码环境&#xff1a;python3 第三方库&#xff1a;boto3 &#xff08;安装方法pip install…

【web安全】CSRF漏洞攻击与防御

前言 总结&#xff0c;仅供学习。 csrf的理解 我们了解一个网站有修改信息&#xff0c;密码&#xff0c;添加删除管理&#xff0c;支付转账的功能之后。 通过抓包抓取对方修改操作的数据包样式&#xff0c; 然后在自己网站搭建一个指令。 当别人来访时&#xff0c; 如果…

接口01-Java

接口-Java 一、引入(快速入门案例)二、接口介绍1、概念2、语法 三、应用场景四、接口使用注意事项五、练习题1 一、引入(快速入门案例) usb插槽就是现实中的接口。 你可以把手机、相机、u盘都插在usb插槽上&#xff0c;而不用担心那个插槽是专门插哪个的&#xff0c;原因是做u…

行业唯一!法大大上榜2023德勤深圳明日之星

11月28日&#xff0c;德勤中国在深圳举办2023德勤深圳高科技高成长20强及明日之星&#xff08;以下简称“深圳明日之星”&#xff09;颁奖盛典。法大大作为高速成长、持续创新的卓越企业荣登深圳明日之星榜单。值得一提的是&#xff0c;法大大是唯一一家获奖的电子签企业&#…

PostgreSQL | EXTRACT | 获取时间的年月日字串

EXTRACT EXTRACT 函数是 PostgreSQL 中用于从日期和时间类型中提取特定部分&#xff08;如年、月、日、小时等&#xff09;的函数。 格式 EXTRACT(field FROM source) -- field 参数是要提取的部分&#xff0c;例如 YEAR、MONTH、DAY、HOUR 等。 -- source 参数是包含日期或…

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术&#xff0c;在各个科学和工程领域发挥着关键作用&#xff0c;其应用范围从信号处理到量子力学。近年来&#xff0c;它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …

uniapp上架app store详细攻略

目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用&#xff0c;打包ios应用后&#xff0c;会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上&#xff0c;需要将这个ipa文件上架app store后&#xff0c;才能通…

【经验分享】openGauss 客户端(Data Studio / DBeaver)连接方式

前言 本篇介绍了openGauss常用的客户端连接工具Data Studio和DBeaver 01 客户端工具 openGauss部署之后&#xff0c;在服务器上提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能&#xff0c;还提供了若干高级特性&#xff0c;便于用户使用。…

插槽slot使用

场景&#xff1a;el-button是绝对定位&#xff0c;希望它能根据query组件&#xff08;公共组件&#xff09;定位&#xff0c;query组件是相对定位。 <query :queryArr"queryParams" class"query"><div class"btn"><el-button cla…

王者小游戏

游戏里的经验动物 Bear package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\辛欣\\OneDrive\\桌面\\王者荣耀图片(1)\\王者荣耀图片\\beast\\bear.jp…

豆粕期权 MVIX 指数构建及策略回测

1. VIX指数 VIX 最初被设计出来的目的是为了预警市场的潜在风险&#xff0c;一般来说&#xff0c;当 VIX 指数小于 15 时&#xff0c;表示市场出现非理性繁荣&#xff1b;当 VIX 指数大于 40 时&#xff0c;表示市场对 未来的非理性恐慌&#xff0c;短期内可以出现反弹。VIX 指…