- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是我得到一些帮助的脚本。我想修改它,给我 2 个带有 3 个可能变量的新列。 日期 |游戏PK |首页 |居家休息|离开 |外出休息
当前的 matches.csv
格式为 Date |游戏PK |首页 |离开
主场休息
和 客场休息
(如果球队前一天参加过比赛,则为 -1;如果球队当天没有参加比赛,则为 1)先前与这样做的对手进行比较,否则为 0)
任何有关如何创建列并为其编写此语句的信息将不胜感激。
import csv
import requests
import datetime
from pprint import pprint
import time
import pandas as pd
kp = []
for i in range(20001,20070):
req = requests.get('https://statsapi.web.nhl.com/api/v1/schedule?site=en_nhl&gamePk=20180' + str(i) + '&leaderGameTypes=R&expand=schedule.broadcasts.all,schedule.radioBroadcasts,schedule.teams,schedule.ticket,schedule.game.content.media.epg')
data = req.json()
for item in data['dates']:
date = item['date']
games = item['games']
for game in games:
gamePk = game['gamePk']
season = game['season']
teams = game['teams']
home = teams['home']
home_tm = home['team']['abbreviation']
away = teams['away']
away_tm = away['team']['abbreviation']
print (date, gamePk, away_tm, home_tm)
kp.append([date, gamePk, away_tm, home_tm])
pprint(kp)
df = pd.DataFrame(kp, columns=['Date','gamePk','Home', 'Away'])
df.to_csv('matches.csv', sep=',', header=True, index=False)
time.sleep(5)
def find_last(match_date, da, team):
home_play = da[da['Home'] == team].tail(1) #then find last matches played at home, select greatest
away_play = da[da['Away'] == team].tail(1) #" " find last matches played at away, select greatest
#then take the last match played, either home or away, whichever is more recent
if home_play.empty and away_play.empty:
print (team, "no_matches before this date")
last_match = 'NA'
elif home_play.empty:
last_match = away_play.Date.item()
elif away_play.empty:
last_match = home_play.Date.item()
else:
last_match = max([home_play.Date.item(), away_play.Date.item()])
if last_match != 'NA':
#And then subtract this from "todays" date (match_date)
duration_since_last = pd.to_datetime(match_date) - pd.to_datetime(last_match)
print ("Team:", team)
print ("Todays game date = ", match_date)
print ("Last match played = ", last_match)
print ("Rest Period = ", duration_since_last)
print()
return duration_since_last
df = pd.read_csv('matches.csv', sep=',')
for k in df.index:
home_team = df.Home[k]
away_team = df.Away[k]
match_date = df.Date[k]
gamePk = df.gamePk[k]
#we want to find all date values less than todays match date.
da = df[df['Date'] < match_date]
## if not da.empty:
for team in [home_team,away_team]:
print ("Record", k, home_team, 'vs', away_team)
find_last(match_date, da, team)
print ('________________________________________')
最佳答案
您提供的脚本已分为不同的部分,以便更好地理解。需要以下新部分来生成您所需的数据帧添加内容:
这是这项工作的 jupyter 笔记本:nhl_stats_parsing
代码:
import csv
import requests
import datetime
from pprint import pprint
import time
import pandas as pd
from pprint import pprint as pp
import json
pd.set_option('max_columns', 100)
pd.set_option('max_rows', 300)
# ### make request to NHL stats server for data and save it to a file
address_p1 = 'https://statsapi.web.nhl.com/api/v1/schedule?site=en_nhl&gamePk=20180'
address_p2 = '&leaderGameTypes=R&expand=schedule.broadcasts.all,schedule.radioBroadcasts,schedule.teams,schedule.ticket,schedule.game.content.media.epg'
with open('data.json', 'w') as outfile:
data_list = []
for i in range(20001,20070): # end 20070
req = requests.get(address_p1 + str(i) + address_p2)
data = req.json()
data_list.append(data) # append each request to the data list; will be a list of dicts
json.dump(data_list, outfile) # save the json file so you don't have to keep hitting the nhl server with your testing
# ### read the json file back in
with open('data.json') as f:
data = json.load(f)
# ### this is what 1 record looks like
for i, x in enumerate(data):
if i == 0:
pp(x)
# ### parse each dict
kp = []
for json_dict in data:
for item in json_dict['dates']:
date = item['date']
games = item['games']
for game in games:
gamePk = game['gamePk']
season = game['season']
teams = game['teams']
home = teams['home']
home_tm = home['team']['abbreviation']
away = teams['away']
away_tm = away['team']['abbreviation']
print (date, gamePk, away_tm, home_tm)
kp.append([date, gamePk, away_tm, home_tm])
# ### create DataFrame and save to csv
df = pd.DataFrame(kp, columns=['Date','gamePk','Home', 'Away'])
df.to_csv('matches.csv', sep=',', header=True, index=False)
# ### read in csv into DataFrame
df = pd.read_csv('matches.csv', sep=',')
print(df.head()) # first 5
## On Game Day, What is the Previous Day
def yesterday(date):
today = datetime.datetime.strptime(date, '%Y-%m-%d')
return datetime.datetime.strftime(today - datetime.timedelta(1), '%Y-%m-%d')
def yesterday_apply(df):
df['previous_day'] = df.apply(lambda row: yesterday(date=row['Date']), axis=1)
yesterday_apply(df)
## Did We Play on the Previous Day
def played_previous_day(df, date, team):
filter_t = f'(Date == "{date}") & ((Home == "{team}") | (Away == "{team}"))'
filtered_df = df.loc[df.eval(filter_t)]
if filtered_df.empty:
return False # didn't play previous day
else:
return True # played previous day
def played_previous_day_apply(df):
df['home_played_previous_day'] = df.apply(lambda row: played_previous_day(df, date=row['previous_day'], team=row['Home']), axis=1)
df['away_played_previous_day'] = df.apply(lambda row: played_previous_day(df, date=row['previous_day'], team=row['Away']), axis=1)
played_previous_day_apply(df)
# # Determine Game Day Handicap
# Home Rest & Away Rest (-1 if the team played the day prior vs a team that didn't, 1 if the team didn't play the day prior vs an opponent who did, 0 otherwise)
def handicap(team, home, away):
if (team == 'home') and not home and away:
return 1
elif (team == 'away') and not home and away:
return -1
elif (team == 'home') and home and not away:
return -1
elif (team == 'away') and home and not away:
return 1
else:
return 0
def handicap_apply(df):
df['home_rest'] = df.apply(lambda row: handicap(team='home', home=row['home_played_previous_day'], away=row['away_played_previous_day']), axis=1)
df['away_rest'] = df.apply(lambda row: handicap(team='away', home=row['home_played_previous_day'], away=row['away_played_previous_day']), axis=1)
handicap_apply(df)
print(df)
# ### data presentation method
def find_last(match_date, da, team):
home_play = da[da['Home'] == team].tail(1) # then find last matches played at home, select greatest
away_play = da[da['Away'] == team].tail(1) # " " find last matches played at away, select greatest
#then take the last match played, either home or away, whichever is more recent
if home_play.empty and away_play.empty:
print (team, "no_matches before this date")
last_match = 'NA'
elif home_play.empty:
last_match = away_play.Date.item()
elif away_play.empty:
last_match = home_play.Date.item()
else:
last_match = max([home_play.Date.item(), away_play.Date.item()])
if last_match != 'NA':
#And then subtract this from "todays" date (match_date)
duration_since_last = pd.to_datetime(match_date) - pd.to_datetime(last_match)
print ("Team:", team)
print ("Todays game date = ", match_date)
print ("Last match played = ", last_match)
print ("Rest Period = ", duration_since_last)
print()
return duration_since_last
# ### produce your output
for k in df.index:
home_team = df.Home[k]
away_team = df.Away[k]
match_date = df.Date[k]
gamePk = df.gamePk[k]
#we want to find all date values less than todays match date.
da = df[df['Date'] < match_date]
## if not da.empty:
for team in [home_team, away_team]:
print ("Record", k, home_team, 'vs', away_team)
find_last(match_date, da, team) # call your method
print('_' * 40)
输出:
Date gamePk Home Away previous_day home_played_previous_day away_played_previous_day home_rest away_rest
0 2018-10-03 2018020001 MTL TOR 2018-10-02 False False 0 0
1 2018-10-03 2018020002 BOS WSH 2018-10-02 False False 0 0
2 2018-10-03 2018020003 CGY VAN 2018-10-02 False False 0 0
3 2018-10-03 2018020004 ANA SJS 2018-10-02 False False 0 0
4 2018-10-04 2018020005 BOS BUF 2018-10-03 True False -1 1
5 2018-10-04 2018020006 NSH NYR 2018-10-03 False False 0 0
6 2018-10-04 2018020007 WSH PIT 2018-10-03 True False -1 1
7 2018-10-04 2018020008 NYI CAR 2018-10-03 False False 0 0
8 2018-10-04 2018020009 CHI OTT 2018-10-03 False False 0 0
关于python - 使用 pandas 创建 2 个新列并根据日期分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52129161/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!