使用工具: pandas

用pandas分析,先将所有表读取为dataframe。转换几个可能用到的时间戳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
db_path = r"starsea_capital_ultimate.db"

import sqlite3
import pandas as pd
from decimal import Decimal
import networkx as nx

conn = sqlite3.connect(db_path)

cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
table_names = [table[0] for table in cursor.fetchall()]

dataframes = {}
for table_name in table_names:
query = f"SELECT * FROM {table_name};"
dataframes[table_name] = pd.read_sql_query(query, conn)

conn.close()

dataframes['raw_user_data']['register_time'] = pd.to_datetime(dataframes['raw_user_data']['register_time'], format='%Y-%m-%d %H:%M:%S')
dataframes['raw_user_data']['last_login_time'] = pd.to_datetime(dataframes['raw_user_data']['last_login_time'], format='%Y-%m-%d %H:%M:%S')
dataframes['financial_transactions']['trans_time'] = pd.to_datetime(dataframes['financial_transactions']['trans_time'], format='%Y-%m-%d %H:%M:%S')

def to_decimal(x):
return Decimal(str(x))
9、分析数据库检材,直接推荐了最多下线用户共推荐了多少位下线。(答案格式:仅数字)

答案: 17

统计raw_user_datarecommender_id出现的次数。

1
dataframes['raw_user_data']['recommender_id'].value_counts()
1
2
3
4
5
6
7
8
9
10
11
12
13
recommender_id
853
U10009 17
U10039 17
U10042 16
U10021 16
...
U11381 1
U11185 1
U11889 1
U10524 1
U12588 1
Name: count, Length: 1199, dtype: int64
10、分析数据库检材,用户等级为”合伙人”的用户USDT的总投资金额为?(答案格式1234.12,保留2位小数)

答案: 1135581.44

1
2
3
4
5
h_list = dataframes['raw_user_data'].query(' user_level == "合伙人" ')['user_id'].copy()
trans_df = dataframes['financial_transactions'].query(' trans_type=="投资" & status=="成功" & currency=="USDT" ').copy()
df = trans_df[trans_df['user_id'].isin(h_list)].copy()
df['amount_dec'] = df['amount'].apply(to_decimal)
df['amount_dec'].sum()
1
Decimal('1135581.44')
11、分析数据库检材,平台在2022年度的平均每季度新增用户数为多少?(答案格式:仅数字)

答案: 623

筛选注册时间2022年的用户,resample为季度,计数并计算平均值。

1
2
df_2022 = dataframes['raw_user_data'][dataframes['raw_user_data']['register_time'].dt.year == 2022].copy()
df_2022.set_index('register_time').resample('QE')['user_id'].count().mean()
1
np.float64(623.0)
12、分析数据库检材,在用户推荐关系网络中,层级最深的用户链条包含_多少个用户。(答案格式:仅数字)

答案:7

使用NetworkX建图,计算图中最长路径的长度。

1
2
3
4
5
6
7
8
9
edge_df = dataframes['raw_user_data'][['user_id', 'recommender_id']].copy()
edge_df = edge_df[edge_df['recommender_id']!='']
G = nx.from_pandas_edgelist(
edge_df,
source='recommender_id',
target = 'user_id',
create_using=nx.DiGraph()
)
len(nx.dag_longest_path(G))
1
7
13、分析数据库检材,该平台用户在同一时间内同时进行2笔以上大额交易(单笔数值>5000)的异常用户有多少人?(答案格式:仅数字)

答案: 8

查询成功且交易数值大于5000的数据,按时间和用户名groupby,筛选2以上的。

1
2
3
df = dataframes['financial_transactions'].query(' amount > 5000 & status == "成功" ').copy()
df_count = df.groupby(['user_id', 'trans_time']).size()
df_count[df_count>=2]
1
2
3
4
5
6
7
8
9
10
user_id  trans_time
U10211 2022-02-22 2
U10531 2023-07-01 2
U11465 2023-01-29 2
U11583 2023-09-29 2
U11670 2023-10-17 2
U11841 2023-03-05 2
U12374 2022-10-28 2
U12511 2023-07-03 2
dtype: int64
14、分析数据库检材,2023年10月11日之前的90天内无任何交易且此前为活跃用户(注册后90天内有过交易)的潜在失效用户有多少?(答案格式:仅数字)

答案: 662

merge用户和交易记录表,筛选注册后90天内有交易的用户为集合1,筛选2023年10月11日之前的90天有交易的用户为集合2,计算集合1-集合2的用户数。

1
2
3
4
5
6
7
8
9
10
11
12
13
df_trans = dataframes['financial_transactions'].query(' status == "成功" ')[['user_id', 'trans_time']]
df_user = dataframes['raw_user_data'][['user_id', 'register_time']]
merged_df = pd.merge(df_trans, df_user, on='user_id', how='inner')

active_mask = (merged_df['trans_time'] <= merged_df['register_time'] + pd.Timedelta(days=90))
set1 = set(merged_df.loc[active_mask, 'user_id'])

base_date = pd.to_datetime('2023-10-11')
recent_date = base_date - pd.Timedelta(days=90)
recent_mask = ((merged_df['trans_time'] >= recent_date) & (merged_df['trans_time'] < base_date))
set2 = set(merged_df.loc[recent_mask, 'user_id'])

len(set1 - set2)
1
662