我有一个从 coinmarketcap 上刮下来的 df。我正在尝试计算 close_price 列的波动率指标,但是当我使用 groupby 时,我收到一条错误消息:
final_coin_data['vol'] = final_coin_data.groupby('coin_name')['close_price'].rolling(window=30).std()
TypeError: incompatible index of inserted column with frame index
Run Code Online (Sandbox Code Playgroud)
df 结构('Unnamed:0' 在我加载 CSV 后出现):
Unnamed: 0 close_price coin_name date high_price low_price market_cap open_price volume
0 1 9578.63 Bitcoin Mar 11, 2018 9711.89 8607.12 149,716,000,000 8852.78 6,296,370,000
1 2 8866.00 Bitcoin Mar 10, 2018 9531.32 8828.47 158,119,000,000 9350.59 5,386,320,000
2 3 9337.55 Bitcoin Mar 09, 2018 9466.35 8513.03 159,185,000,000 9414.69 8,704,190,000
3 1 9578.63 Monero Mar 11, 2018 9711.89 8607.12 …
Run Code Online (Sandbox Code Playgroud) 我一直在寻找方法来加速将数据帧推送到sql server,并在这里偶然发现了一种方法.这种方法在速度方面让我感到震惊.使用normal to_sql
需要将近2个小时,此脚本在12.54秒内完成,以推动100k行X 100列df.
因此,在使用示例df测试下面的代码之后,我尝试使用具有许多不同数据类型的df(int,string,float,Booleans).但是,我很遗憾看到内存错误.所以我开始减小我的df的大小,看看有什么限制.我注意到,如果我的df有任何字符串,那么我无法加载到SQL Server.我无法进一步隔离这个问题.下面的脚本取自链接中的问题,但是,我添加了一个带字符串的小df.关于如何纠正这个问题的任何建议都会很棒!
import pandas as pd
import numpy as np
import time
from sqlalchemy import create_engine, event
from urllib.parse import quote_plus
import pyodbc
conn = "DRIVER={SQL Server};SERVER=SERVER_IP;DATABASE=DB_NAME;UID=USER_ID;PWD=PWD"
quoted = quote_plus(conn)
new_con = 'mssql+pyodbc:///?odbc_connect={}'.format(quoted)
engine = create_engine(new_con)
@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
print("FUNC call")
if executemany:
cursor.fast_executemany = True
table_name = 'fast_executemany_test'
df1 = pd.DataFrame({'col1':['tyrefdg','ertyreg','efdgfdg'],
'col2':['tydfggfdgrefdg','erdfgfdgfdgfdgtyreg','edfgfdgdfgdffdgfdg']
})
s = time.time()
df1.to_sql(table_name, engine, if_exists = 'replace', chunksize = None) …
Run Code Online (Sandbox Code Playgroud) I have a table that contains hospital visits for patients. I am trying to flag visits in which a visits' begin_date
overlaps the previous visits' end_date
+ 90 days. However, the caveat to this is that once a visit is flagged as an overlap visit, that visit should not be used to assess an overlap with another visit. Let me explain with an example.
Table
visitID patientid begin_date end_date
1 23 1/12/2018 1/14/2018
2 23 1/30/2018 2/14/2018
3 23 4/20/2018 …
Run Code Online (Sandbox Code Playgroud) 我有一个按“键”分组的数据框。我需要比较每个组中的行,以确定是要保留组中的每一行还是只需要一组中的一行。
在保留一组所有行的条件下:如果有一行颜色为“红色”,面积为“12”,形状为“圆形”,另一行(同一组内)的颜色为“绿色”和“13”的区域和“正方形”的形状,然后我想保留该组中的所有行。否则,如果这种情况不存在,我想保留该组中具有最大 'num' 值的行。
df = pd.DataFrame({'KEY': ['100000009', '100000009', '100000009', '100000009', '100000009','100000034','100000034', '100000034'],
'Date1': [20120506, 20120506, 20120507,20120608,20120620,20120206,20120306,20120405],
'shape': ['circle', 'square', 'circle','circle','circle','circle','circle','circle'],
'num': [3,4,5,6,7,8,9,10],
'area': [12, 13, 12,12,12,12,12,12],
'color': ['red', 'green', 'red','red','red','red','red','red']})
Date1 KEY area color num shape
0 2012-05-06 100000009 12 red 3 circle
1 2012-05-06 100000009 13 green 4 square
2 2012-05-07 100000009 12 red 5 circle
3 2012-06-08 100000009 12 red 6 circle
4 2012-06-20 100000009 12 red 7 circle
5 2012-02-06 100000034 12 red 8 circle
6 …
Run Code Online (Sandbox Code Playgroud) 我有一个df,我按两列分组.我想按顺序计算每个组.下面的代码按顺序计算组中的每一行.这似乎比我想象的要容易,但无法弄清楚.
df = pd.DataFrame({
'Key': ['10003', '10009', '10009', '10009',
'10009', '10034', '10034', '10034'],
'Date1': [20120506, 20120506, 20120506, 20120506,
20120620, 20120206, 20120206, 20120405],
'Date2': [20120528, 20120507, 20120615, 20120629,
20120621, 20120305, 20120506, 20120506]
})
df['Count'] = df.groupby(['Key','Date1']).cumcount() + 1
Run Code Online (Sandbox Code Playgroud)
预期结果:
Date1 Date2 Key Count
0 20120506 20120528 10003 1
1 20120506 20120507 10009 2
2 20120506 20120615 10009 2
3 20120506 20120629 10009 2
4 20120620 20120621 10009 3
5 20120206 20120305 10034 4
6 20120206 20120506 10034 4
7 20120405 20120506 …
Run Code Online (Sandbox Code Playgroud) 我有两个数据框,每个数据框都有数百列。
#df1 = 190 columns
#df2 = 262 columns
#subset dataframe
df1 = pd.DataFrame({'Key': ['10003', '10009', '10010', '10034', '10665'],
'Num1': [12,13,13,13,13],
'Color': ['red','orange','red','red','red'],
'Date1': [20120506, 20120506, 20120506,20120506,20120620],
'Date2': [20120528, 20120507, 20120615,20120629,20120621]})
df2 = pd.DataFrame({'Key': ['10003', '10009', '10010', '10011', '10012','10034','10034', '10034'],
'Num1': [12,13,13,13,13,13,14,14],
'Num2': [121,122,122,124,125,126,127,128],
'Date1': [20120506, 20120506, 20120506,20120506,20120620,20120506,20120206,20120405],
'Date2': [20120528, 20120507, 20120615,20120629,20120621,20120629,20120506,20120506]})
Run Code Online (Sandbox Code Playgroud)
我想删除 df2 中也在 df1 中的所有行,但保持 df1 不变。
使用 pd.concat() 或 merge() 时我非常接近,但问题是我创建了一堆不必要的列 [使用 concat() 和 merge()] 并且仅在 df1 中找到的行被添加到 df2 [与 concat()]。实际上,当“Key”、“Date1”、“Num”和“Date2”在行中常见时,它们可以被视为重复项。
下面的尝试很接近,但它添加了 df1 中的额外列并保留 df1 中的所有额外行。我不需要 df1 …
我在这里问了一个类似的问题,但我想扩展这个问题,因为我被要求做一些不同的地方我不能使用.duplicates()
我有一个按'Key'分组的df.我想标记排放日期与排放日期匹配的组内的任何行和排放日期之间的排,具有排放日期的行具有5-12范围内的num1值.
df = pd.DataFrame({'Key': ['10003', '10003', '10003', '10003', '10003','10003','10034', '10034'],
'Num1': [12,13,13,13,12,13,15,12],
'Num2': [121,122,122,124,125,126,127,128],
'admit': [20120506, 20120508, 20121010,20121010,20121010,20121110,20120520,20120520], 'discharge': [20120508, 20120510, 20121012,20121016,20121023,20121111,20120520,20120520]})
df['admit'] = pd.to_datetime(df['admit'], format='%Y%m%d')
df['discharge'] = pd.to_datetime(df['discharge'], format='%Y%m%d')
Run Code Online (Sandbox Code Playgroud)
最初的df
Key Num1 Num2 admit discharge
0 10003 12 121 2012-05-06 2012-05-08
1 10003 13 122 2012-05-08 2012-05-10
2 10003 13 122 2012-10-10 2012-10-12
3 10003 13 124 2012-10-10 2012-10-16
4 10003 12 125 2012-10-10 2012-10-23
5 10003 13 126 2012-11-10 2012-11-11
6 10034 15 127 2012-05-20 …
Run Code Online (Sandbox Code Playgroud) 我有一张桌子,上面有病人的医院就诊信息。我正在尝试标记上次访问后90天内发生的访问。但是,需要注意的是,一旦将某个访问标记为重复访问,就不应将该访问用于评估与另一个访问的重复。让我举例说明。
visitID patientid visit_date
1 23 1/12/2018
2 23 1/30/2018
3 23 4/20/2018
4 23 5/02/2018
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,患者进行了4次就诊。访问2在访问1的90天内,因此应将访问2标记为重叠。标记访问2后,该行就不应在分析中用于以后的任何访问的重叠标识。从概念上讲,这就像删除访问2并再次开始分析。
过渡阶段(访问2已删除,分析再次开始)
visitID patientid visit_date
1 23 1/12/2018
3 23 4/20/2018
4 23 5/02/2018
Run Code Online (Sandbox Code Playgroud)
因此,即使访问3与访问2重叠,由于从分析中删除了访问2,由于前一次访问(访问1)的距离还不到90天,因此不会标记访问3。最后,应标记4次访问,因为它与未标记的访问重叠。
visitID patientid visit_date flag
1 23 1/12/2018 0
2 23 1/30/2018 1
3 23 4/20/2018 0
4 23 5/02/2018 1
Run Code Online (Sandbox Code Playgroud)
我试图解决这个难题:
WITH overlaps AS
(SELECT DISTINCT T2.visit
FROM visits_table AS T1
INNER JOIN visits_table AS T2
ON T1.visit != T2.visit
AND T2.visit_date BETWEEN T1.visit_date AND DATEADD(DAY, 89, …
Run Code Online (Sandbox Code Playgroud) 随着merge()
有一个指标参数,这样你就可以找出从中df,可以你的原始数据中找到。我没有看到与concat()
.
pd.merge(left=df1, right=df2, indicator=True)
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个指标列concat()
?
我有一个df,我需要在列表中找到任何具有值的行,这些行也位于另一个列表中.
对于此示例,我需要在以"Month"开头的任何列中标识具有值J,Q,R的任何行.
如果列中的任何一个字母存在,则最终的df将有一个显示true或false的列.
df = pd.DataFrame({'KEY': ['1312', '1345', '5555', '5555','5555'],
'Month1': [1, 1, 1,1,1],
'Month2': [1, 1, 'J',1,1],
'Month3': [1, 1, 1,1,1],
'Month4': [1, 'J', 1,1,1],
'Month5': [1, 1, 1,0,0],
'Month6': [1, 1, 1,0,0],
'Date1': [20120304, 20120102, 20120203,20120402,4],
'Date2': [20120405,20120104,20120502,20120501,4],
'StartMonth': [3,1,1,4,3],
'EndMonth': [4,1,3,5,5],
'ID': [1,2,3,3,4]})
df[['KEY','ID','Date1','Date2','StartMonth','EndMonth','Month1', 'Month2','Month3','Month4','Month5','Month6']]
Run Code Online (Sandbox Code Playgroud)
预期结果:
Date1 Date2 EndMonth ID KEY Month1 Month2 Month3 Month4 Month5 Month6 StartMonth HemoFacB
0 20120304 20120405 4 1 1312 1 1 1 1 1 1 3 False
1 20120102 20120104 1 …
Run Code Online (Sandbox Code Playgroud)