Reputation: 73
I have the response message below and code which I follow
result= a["{\"msg\":\"result\",\"id\”:\”test\”,\”result\":{\"categories\":[\"<20M\",\"20M+\",\"50M+\",\"300M+\",\"1G\"],\"series\":[{\"name\":\"Fiber\",\"data\":[216,41,10393,37394,6016]}],\"totals\":{\"<20M\":216,\"20M+\":41,\"50M+\":10393,\"300M+\":37394,\"1G\":6016}}}"]
#Remove a
sliceresult=result[1:]
print('Result After slice: {}'.format(sliceresult))
string_input = ''.join(str(s) for s in sliceresult)
print(string_input)
category = json.loads(string_input)['result']['categories']
series = json.loads(string_input)['result']['series']
total = json.loads(string_input)['result']['totals']
print(category, series, total)
Error Response was:
category = json.loads(result[1:])['result']['categories']
TypeError: list indices must be integers, not str
Upvotes: 0
Views: 83
Reputation: 1
import json
from collections import Counter
from typing import Dict, Tuple, List, Counter as CounterType
def calculate_user_activity(data: Dict) -> CounterType:
return Counter(action['user'] for action in data['activities'])
def get_most_active_user(user_activity: CounterType) -> Dict:
most_active_user = user_activity.most_common(1)[0]
return {
'name': most_active_user[0],
'action_count': most_active_user[1]
}
def get_user_activity_percentage(user_activity: CounterType) -> float:
total_actions = sum(user_activity.values())
most_active_user = user_activity.most_common(1)[0]
return round((most_active_user[1] / total_actions) * 100, 2)
def get_total_actions(user_activity: CounterType) -> int:
return sum(user_activity.values())
def get_unique_users_count(user_activity: CounterType) -> int:
return len(user_activity)
def get_all_users_ranked(user_activity: CounterType) -> List[Tuple[str, int]]:
return user_activity.most_common()
def get_average_actions_per_user(user_activity: CounterType) -> float:
total_actions = sum(user_activity.values())
unique_users = len(user_activity)
return round(total_actions / unique_users, 2)
def get_median_actions_per_user(user_activity: CounterType) -> int:
actions_per_user = sorted(user_activity.values())
length = len(actions_per_user)
if length % 2 == 0:
middle1 = actions_per_user[length // 2 - 1]
middle2 = actions_per_user[length // 2]
return (middle1 + middle2) // 2
else:
return actions_per_user[length // 2]
def analyze_user_data(file_path: str) -> Dict:
try:
with open(file_path, 'r') as file:
data = json.load(file)
user_activity = calculate_user_activity(data)
return {
'most_active_user': get_most_active_user(user_activity),
'most_active_user_percentage': get_user_activity_percentage(user_activity),
'total_actions': get_total_actions(user_activity),
'unique_users': get_unique_users_count(user_activity),
'all_users_ranked': get_all_users_ranked(user_activity),
'average_actions_per_user': get_average_actions_per_user(user_activity),
'median_actions_per_user': get_median_actions_per_user(user_activity)
}
except FileNotFoundError:
return "Error: File not found"
except json.JSONDecodeError:
return "Error: Invalid JSON format"
except Exception as e:
return f"Error: {str(e)}"
# Example usage with sample data
if __name__ == "__main__":
# Create sample data with many records
sample_data = {
"activities": [
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "yossi", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "tal", "type": "login", "message": "bla bla bla"},
{"user": "tossi", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "gal", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "yossi", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "tal", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
{"user": "gal", "type": "login", "message": "bla bla bla"},
{"user": "tossi", "type": "login", "message": "bla bla bla"},
{"user": "alice", "type": "login", "message": "bla bla bla"},
]
}
# Save sample data to a JSON file
with open('sample_user_data.json', 'w') as f:
json.dump(sample_data, f, indent=2)
# Analyze the data
results = analyze_user_data('sample_user_data.json')
# Print results
print("\nAnalysis Results:")
print("-" * 50)
print(f"Most active user: {results['most_active_user']['name']}")
print(f"Number of actions: {results['most_active_user']['action_count']}")
print(f"Percentage of total activity: {results['most_active_user_percentage']}%")
print(f"Total number of actions: {results['total_actions']}")
print(f"Number of unique users: {results['unique_users']}")
print(f"Average actions per user: {results['average_actions_per_user']}")
print(f"Median actions per user: {results['median_actions_per_user']}")
print("\nAll users ranked by activity:")
print("-" * 50)
for user, count in results['all_users_ranked']:
print(f"{user}: {count} actions")
get_most_active_user(data: Dict) -> Dict: Returns a dictionary with the most active user's name and action count.
get_user_activity_percentage(data: Dict) -> float: Returns the percentage of total activity for the most active user.
get_total_actions(data: Dict) -> int: Returns the total number of actions in the data.
get_unique_users_count(data: Dict) -> int: Returns the number of unique users in the data.
get_all_users_ranked(data: Dict) -> List[Tuple[str, int]]: Returns a list of tuples, where each tuple contains the username and their activity count.
analyze_user_data(file_path: str) -> Dict: Returns a dictionary containing the analysis results.
get_average_actions_per_user(data: Dict) -> float: This function calculates the average number of actions per user by dividing the total number of actions by the number of unique users.
get_median_actions_per_user(data: Dict) -> int: This function calculates the median number of actions per user. It first gets a sorted list of the action counts for each user. Then, it determines the median by checking if the length of the list is even or odd, and selecting the appropriate middle value(s).
Upvotes: 0
Reputation: 2065
This might help you to begin with:
a = ["{\"msg\":\"result\",\"id\":\"test\",\"result\":{\"categories\":[\"<20M\",\"20M+\",\"50M+\",\"300M+\",\"1G\"],\"series\":[{\"name\":\"Fiber\",\"data\":[216,41,10393,37394,6016]}],\"totals\":{\"<20M\":216,\"20M+\":41,\"50M+\":10393,\"300M+\":37394,\"1G\":6016}}}"]
string_input = ''.join(str(s) for s in a)
print(string_input)
category = json.loads(string_input)['result']['categories']
series = json.loads(string_input)['result']['series']
total = json.loads(string_input)['result']['totals']
print(category, series, total)
Also be careful, your input string is not properly formatted.
it should be "
not ”
Upvotes: 1