鱼C论坛

 找回密码
 立即注册
查看: 1758|回复: 24

[已解决]这种题目该怎么设计呢?

[复制链接]
发表于 2020-6-27 19:56:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 艾依古 于 2020-6-27 19:56 编辑

读取文件“nino12_dropnan_result.csv”,根据列 Lable 判断,假设若连
续出现 5 次'LaNinaTemp'则判定为出现了一次 LaNina 事件,选择 LaNina 事
件出现的开始时间存储到列表 LaNinaList 中;假设若连续出现 5 次
NinoTemp 则认为出现了 Nino 事件,选择 Nino 事件出现的开始时间存储到
列表 NinoList 中。最后,将列表 LaNinaList、NinoList 分别保存到文本文件
“LaNinaStartDate.txt”、“NinoStartDate.txt”中。

csv数据如下(部分):
Data                  Nino12           Label
1870-01-01        -1.5          LaNina Temp
1870-02-01        -0.96                LaNina Temp
1870-03-01        -0.65                LaNina Temp
1870-04-01        -0.32          Cold
1870-05-01        -0.64         LaNina Temp
1870-06-01        -0.96         LaNina Temp
1870-07-01        -0.98         LaNina Temp
1870-08-01        -1.02         LaNina Temp
1870-09-01        -1.02         LaNina Temp
1870-10-01        -1.53         LaNina Temp
1870-11-01        -1.42                LaNina Temp
1870-12-01        -1.25         LaNina Temp
1871-01-01        -0.74         LaNina Temp
1871-02-01        -0.56         LaNina Temp
1871-03-01        -0.78         LaNina Temp
1871-04-01        -0.59         LaNina Temp
1871-05-01        -0.76         LaNina Temp
1871-06-01        -0.25         Cold
1871-07-01        -0.34         Cold
1871-08-01        -0.3          Cold
……
最佳答案
2020-6-27 21:39:01

#导入两个模块
import pandas as pd
import itertools as it

#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列


label_5 = [(key,len(list(group))) for key,group in it.groupby(label)]

LaNina = []
Nino = []
for i,j in zip(label_5,range(len(label_5))):
    if i[0] == "LaNina Temp" and i[1] >= 5:
        LaNina_index = 0
        while j >= 1:
            LaNina_index += label_5[j-1][1]
            j -= 1
        LaNina.append(date[LaNina_index])
    
    elif i[0] == "Nino Temp" and i[1] >= 5:
        Nino_index = 0
        while j >= 1:
            Nino_index += label_5[j-1][1]
            j -= 1
        Nino.append(date[Nino_index])


with open('LaNinaStartDate.txt','w') as f1:
    for i in LaNina:
        f1.writelines(i+'\n')
with open('NinoStartDate.txt','w') as f2:
    for j in Nino:
        f2.writelines(j+'\n')        
    
你这个代码我不熟悉,我只能改成这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-27 20:35:29 | 显示全部楼层
#导入两个模块
import pandas as pd
import itertools as it

#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列

#将日期列和label列5个,5个分为一组形成一个二维列表
label_5 = [label[i:i+5] for i in range(0,len(label)-4)]
date_5 = [date[i:i+5] for i in range(0,len(date)-4)]

LaNina = []
Nino = []

#检测这列表中的每五个label是不是都是Lanina或者Nino,是就获取对应日期
for each_label,each_date in zip(label_5,date_5):
    if each_label.count("LaNina Temp") == 5:
        LaNina.append(each_date)
    elif each_label.count("Nino Temp") == 5:
        Nino.append(each_date)
else:#去重复,保存为新文件
    date_LaNina = sorted(set([i for i in it.chain(*LaNina)]))
    date_Nino = sorted(set([i for i in it.chain(*Nino)]))
    with open("LaNinaStartDate.txt","w") as f1:
        for i in date_LaNina:
            f1.writelines("%s\n" %i)
    with open("NinoStartDate.txt","w") as f2:
        for j in date_Nino:
            f2.writelines("%s\n" %j)
            
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 20:36:45 | 显示全部楼层
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一个新的py文件
把代码的py文件和csv文件放在同一个目录下
双击运行py文件,即可以出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 20:48:24 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 20:36
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一 ...

太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中连续相同的元素个数,并返回连续出现 4 次及以上
的 1 所在的开始位置。
import itertools
mylist = [1,1,0,1,1,1,0,0,0,0,1,1,1,1,0,1,0,11,0]
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]
print(num_times)
sumIndexList = []#存储符合要求的元素首次出现的位置
for i in range(len(num_times)):
if num_times[i][0] == 1 and num_times[i][1] >= 4:
sumIndex = 0
while i >= 1:
sumIndex += num_times[i-1][1]
i = i - 1
sumIndexList.append(sumIndex)
print("符合要求的元素首次出现的位置列表为:",sumIndexList)结果:
输出结果:
[(1, 2), (0, 1), (1, 3), (0, 4), (1, 4), (0, 1), (1, 1), (0, 1), (11, 1), (0, 1)]
符合要求的元素首次出现的位置列表为: [10]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:02:09 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-27 21:10 编辑
艾依古 发表于 2020-6-27 20:48
太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中 ...




这样可行不?
import pandas as pd
import itertools


dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]

LaNinaList = []
NinoList = []
for i in range(len(num_times)):
    if num_times[i][0] == 'LaNina Temp' and num_times[i][1] >= 5:
        sumIndex = 0
        while i >= 1:
            sumIndex += num_times[i - 1][1]
            i = i - 1
        if sumIndex not in LaNinaList:
            LaNinaList.append(date[sumIndex])
    elif num_times[i][0] == 'Nino Temp' and num_times[i][1] >= 5:
        sumIndex = 0
        while i >= 1:
            sumIndex += num_times[i - 1][1]
            i = i - 1
        if sumIndex not in NinoList:
            NinoList.append(date[sumIndex])
with open('LaNinaStartDate.txt','w') as f:
    for i in LaNinaList:
        f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
    for i in NinoList:
        f.write(i+'\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:18:55 | 显示全部楼层

他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:20:16 | 显示全部楼层

可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:20:43 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。



题目不是只要开始时间嘛

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:23:33 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。

好滴,谢谢你啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:24:12 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:20
题目不是只要开始时间嘛

好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:25:11 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-27 22:00 编辑
艾依古 发表于 2020-6-27 21:20
可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求


好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:
import pandas as pd
import itertools


dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]

LaNinaList = []
NinoList = []
for i in range(len(num_times)):
    if num_times[i][0] == 'LaNina Temp' and num_times[i][1] >= 5:
        sumIndex = 0
        while i >= 1:
            sumIndex += num_times[i - 1][1]
            i = i - 1
        if date[sumIndex] not in LaNinaList:
            LaNinaList.append(date[sumIndex])
    elif num_times[i][0] == 'Nino Temp' and num_times[i][1] >= 5:
        sumIndex = 0
        while i >= 1:
            sumIndex += num_times[i - 1][1]
            i = i - 1
        if date[sumIndex] not in NinoList:
            NinoList.append(date[sumIndex])
with open('LaNinaStartDate.txt','w') as f:
    for i in set(LaNinaList):
        f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
    for i in set(NinoList):
        f.write(i+'\n')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:25:44 | 显示全部楼层

你改改 我代码楼主说会出现时间不对,我不懂怎么改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:39:01 | 显示全部楼层    本楼为最佳答案   

#导入两个模块
import pandas as pd
import itertools as it

#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列


label_5 = [(key,len(list(group))) for key,group in it.groupby(label)]

LaNina = []
Nino = []
for i,j in zip(label_5,range(len(label_5))):
    if i[0] == "LaNina Temp" and i[1] >= 5:
        LaNina_index = 0
        while j >= 1:
            LaNina_index += label_5[j-1][1]
            j -= 1
        LaNina.append(date[LaNina_index])
    
    elif i[0] == "Nino Temp" and i[1] >= 5:
        Nino_index = 0
        while j >= 1:
            Nino_index += label_5[j-1][1]
            j -= 1
        Nino.append(date[Nino_index])


with open('LaNinaStartDate.txt','w') as f1:
    for i in LaNina:
        f1.writelines(i+'\n')
with open('NinoStartDate.txt','w') as f2:
    for j in Nino:
        f2.writelines(j+'\n')        
    
你这个代码我不熟悉,我只能改成这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:48:55 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

好滴,谢谢啦!我再去试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 21:49:45 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:

哈哈,好滴,谢谢你啦!我再去试一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:55:14 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:25
你改改 我代码楼主说会出现时间不对,我不懂怎么改了
        if sumIndex not in LaNinaList:
            LaNinaList.append(date[sumIndex])
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Twilight6 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:55:46 | 显示全部楼层
艾依古 发表于 2020-6-27 21:48
好滴,谢谢啦!我再去试一试

如果可以,跟我们确认一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 21:59:39 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:55
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦


对!!!我疏忽大意了 谢谢,已改正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 22:08:04 | 显示全部楼层
BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了

可以可以!你们两个的都可以~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-27 22:09:56 | 显示全部楼层
Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:

你们好厉害!两个人的都可以!如果想要最后写入txt文件的时间按升序排列是不是得在后面加些什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 05:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表